File Annotation

Not logged in
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: }