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