File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: //--- K.I.LIB ---
13b7203622 2011-02-23        kinaba: // kl_dnd.h : drag and drop operation
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #include "stdafx.h"
13b7203622 2011-02-23        kinaba: #include "kilib.h"
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //--------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool kiDropSource::DnD( kiDataObject* pObj, DWORD efct, DWORD* pefct )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiDropSource* pDrpSrc = new kiDropSource;
13b7203622 2011-02-23        kinaba: 	pDrpSrc->AddRef();
13b7203622 2011-02-23        kinaba: 	pObj->begin();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	DWORD d, *p=(pefct==NULL ? &d : pefct);
13b7203622 2011-02-23        kinaba: 	HRESULT hr = ::DoDragDrop( pObj, pDrpSrc, efct, p );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	pDrpSrc->Release();
13b7203622 2011-02-23        kinaba: 	return (hr == DRAGDROP_S_DROP);
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------------ IUnknown Implement -------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiDropSource::kiDropSource() : m_cRef( 0L )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	app()->shellInit(); // OleInitialize()
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP_(ULONG) kiDropSource::AddRef()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return ++m_cRef;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP_(ULONG) kiDropSource::Release()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( --m_cRef )
13b7203622 2011-02-23        kinaba: 		return m_cRef;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	delete this;
13b7203622 2011-02-23        kinaba: 	return 0L;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP kiDropSource::QueryInterface( REFIID riid, void** ppObj )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( ::IsEqualIID( riid, IID_IUnknown )
13b7203622 2011-02-23        kinaba: 	 || ::IsEqualIID( riid, IID_IDropSource ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		*ppObj = (void*)this;
13b7203622 2011-02-23        kinaba: 		AddRef();
13b7203622 2011-02-23        kinaba: 		return S_OK;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	*ppObj = NULL;
13b7203622 2011-02-23        kinaba: 	return E_NOINTERFACE;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------------ IDropSource Implement -------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP kiDropSource::GiveFeedback( DWORD dwEffect )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return DRAGDROP_S_USEDEFAULTCURSORS;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP kiDropSource::QueryContinueDrag( BOOL keyESC, DWORD keyOther )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( keyESC )
13b7203622 2011-02-23        kinaba: 		return DRAGDROP_S_CANCEL;
13b7203622 2011-02-23        kinaba: 	if( !(keyOther&MK_LBUTTON) && !(keyOther&MK_RBUTTON) )
13b7203622 2011-02-23        kinaba: 		return DRAGDROP_S_DROP;
13b7203622 2011-02-23        kinaba: 	return S_OK;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------------ IUnknown Implement -------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiDataObject::kiDataObject() : m_cRef( 0L ), m_FormatList( 2 )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP_(ULONG) kiDataObject::AddRef()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return ++m_cRef;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP_(ULONG) kiDataObject::Release()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( --m_cRef )
13b7203622 2011-02-23        kinaba: 		return m_cRef;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	delete this;
13b7203622 2011-02-23        kinaba: 	return 0L;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP kiDataObject::QueryInterface( REFIID riid, void** ppObj )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( ::IsEqualIID( riid, IID_IUnknown )
13b7203622 2011-02-23        kinaba: 	 || ::IsEqualIID( riid, IID_IDataObject ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		*ppObj = (void*)this;
13b7203622 2011-02-23        kinaba: 		AddRef();
13b7203622 2011-02-23        kinaba: 		return S_OK;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	*ppObj = NULL;
13b7203622 2011-02-23        kinaba: 	return E_NOINTERFACE;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------------ IDataObject Implement -------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP kiDataObject::GetData( FORMATETC* fmtc, STGMEDIUM* stg )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	HRESULT hr = QueryGetData( fmtc );
13b7203622 2011-02-23        kinaba: 	if( FAILED(hr) )
13b7203622 2011-02-23        kinaba: 		return hr;
13b7203622 2011-02-23        kinaba: 	bool res = giveData( *fmtc, stg, m_bFirst );
13b7203622 2011-02-23        kinaba: 	m_bFirst = false;
13b7203622 2011-02-23        kinaba: 	return res ? S_OK : STG_E_MEDIUMFULL;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP kiDataObject::QueryGetData( FORMATETC* fmtc )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	for( unsigned int i=0; i!=m_FormatList.len(); i++ )
13b7203622 2011-02-23        kinaba: 		if( m_FormatList[i].cfFormat == fmtc->cfFormat )
13b7203622 2011-02-23        kinaba: //			if(fmtc & TYMED_HGLOBAL)
13b7203622 2011-02-23        kinaba: 				return S_OK;
13b7203622 2011-02-23        kinaba: 	return DV_E_FORMATETC;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //---------- Enumrator ---------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: class kiDataObject_Enum : public IEnumFORMATETC
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: public:
13b7203622 2011-02-23        kinaba: 	kiDataObject_Enum( kiDataObject* p )
13b7203622 2011-02-23        kinaba: 		: m_cRef( 0L ), m_pObj( p ), m_nCur( 0L )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			m_pObj->AddRef();
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	~kiDataObject_Enum()
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			m_pObj->Release();
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP_(ULONG) AddRef()
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			return ++m_cRef;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP_(ULONG) Release()
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( --m_cRef )
13b7203622 2011-02-23        kinaba: 				return m_cRef;
13b7203622 2011-02-23        kinaba: 			delete this;
13b7203622 2011-02-23        kinaba: 			return 0L;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP QueryInterface( REFIID riid, void** ppObj )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( ::IsEqualIID( riid, IID_IUnknown )
13b7203622 2011-02-23        kinaba: 			 || ::IsEqualIID( riid, IID_IEnumFORMATETC ) )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				*ppObj = (void*)this;
13b7203622 2011-02-23        kinaba: 				AddRef();
13b7203622 2011-02-23        kinaba: 				return S_OK;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			*ppObj = NULL;
13b7203622 2011-02-23        kinaba: 			return E_NOINTERFACE;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP Clone( IEnumFORMATETC** ppNew )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			*ppNew = new kiDataObject_Enum( m_pObj );
13b7203622 2011-02-23        kinaba: 			((kiDataObject_Enum*)(*ppNew))->m_nCur = m_nCur;
13b7203622 2011-02-23        kinaba: 			(*ppNew)->AddRef();
13b7203622 2011-02-23        kinaba: 			return S_OK;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP Reset()
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			m_nCur = 0;
13b7203622 2011-02-23        kinaba: 			return S_OK;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP Skip( ULONG celt )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			m_nCur += celt;
13b7203622 2011-02-23        kinaba: 			if( m_pObj->m_FormatList.len() <= m_nCur )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				m_nCur = m_pObj->m_FormatList.len() - 1;
13b7203622 2011-02-23        kinaba: 				return S_FALSE;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			return S_OK;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP Next( ULONG celt, FORMATETC* pFmt, ULONG* fetched )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( fetched )
13b7203622 2011-02-23        kinaba: 				*fetched = 0L;
13b7203622 2011-02-23        kinaba: 			if( !pFmt )
13b7203622 2011-02-23        kinaba: 				return E_POINTER;
13b7203622 2011-02-23        kinaba: 			ULONG i;
13b7203622 2011-02-23        kinaba: 			for( i=0; i < celt && m_nCur < m_pObj->m_FormatList.len(); i++,m_nCur++ )
13b7203622 2011-02-23        kinaba: 				*pFmt++ = m_pObj->m_FormatList[m_nCur];
13b7203622 2011-02-23        kinaba: 			if( fetched )
13b7203622 2011-02-23        kinaba: 				*fetched = i;
13b7203622 2011-02-23        kinaba: 			return i==celt ? S_OK : S_FALSE;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: private:
13b7203622 2011-02-23        kinaba: 	ULONG         m_cRef;
13b7203622 2011-02-23        kinaba: 	ULONG         m_nCur;
13b7203622 2011-02-23        kinaba: 	kiDataObject* m_pObj;
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDMETHODIMP kiDataObject::EnumFormatEtc( DWORD drctn, IEnumFORMATETC** ppEnm )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( !ppEnm )
13b7203622 2011-02-23        kinaba: 		return E_INVALIDARG;
13b7203622 2011-02-23        kinaba: 	*ppEnm = NULL;
13b7203622 2011-02-23        kinaba: 	if( drctn!=DATADIR_GET )
13b7203622 2011-02-23        kinaba: 		return E_NOTIMPL;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	(*ppEnm = new kiDataObject_Enum( this ))->AddRef();
13b7203622 2011-02-23        kinaba: 	return S_OK;
13b7203622 2011-02-23        kinaba: }