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: }