1 /* 2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 3 */ 4 5 #ifdef HAVE_CONFIG_H 6 # include <config.h> 7 #endif 8 9 #include <assert.h> 10 11 #include "ecore_win32_dnd_drop_source.h" 12 13 #include "ecore_win32_private.h" 14 15 // structors 16 17 // reference count must ALWAYS start at 1 DropSource()18DropSource::DropSource() : ref_count_(1) 19 { } 20 21 22 // IUnknown 23 QueryInterface(REFIID iid,void ** ppvObject)24HRESULT DropSource::QueryInterface(REFIID iid, void **ppvObject) 25 { 26 // check to see what interface has been requested 27 if (iid == IID_IDropSource || iid == IID_IUnknown) 28 { 29 AddRef(); 30 *ppvObject = this; 31 return S_OK; 32 } 33 *ppvObject = 0; 34 return E_NOINTERFACE; 35 } 36 AddRef()37ULONG DropSource::AddRef() 38 { 39 return InterlockedIncrement(&ref_count_); 40 } 41 Release()42ULONG DropSource::Release() 43 { 44 LONG count = InterlockedDecrement(&ref_count_); 45 if(count == 0) 46 { 47 delete this; 48 return 0; 49 } 50 return count; 51 } 52 53 54 // IDropSource 55 QueryContinueDrag(BOOL fEscapePressed,DWORD grfKeyState)56HRESULT DropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) 57 { 58 // if the Escape key has been pressed since the last call, cancel the drop 59 if(fEscapePressed == TRUE) 60 return DRAGDROP_S_CANCEL; 61 62 // if the LeftMouse button has been released, then do the drop! 63 if((grfKeyState & MK_LBUTTON) == 0) 64 return DRAGDROP_S_DROP; 65 66 // continue with the drag-drop 67 return S_OK; 68 } 69 GiveFeedback(DWORD dwEffect EINA_UNUSED)70HRESULT DropSource::GiveFeedback(DWORD dwEffect EINA_UNUSED) 71 { 72 return DRAGDROP_S_USEDEFAULTCURSORS; 73 } 74 75 76 // ecore_win32 private functions 77 _ecore_win32_dnd_drop_source_new()78void *_ecore_win32_dnd_drop_source_new() 79 { 80 IDropSource *object = new DropSource(); 81 assert(object != NULL); 82 return object; 83 } 84 _ecore_win32_dnd_drop_source_free(void * drop_source)85void _ecore_win32_dnd_drop_source_free(void *drop_source) 86 { 87 if (!drop_source) 88 return; 89 90 IDropSource *object = (IDropSource *)drop_source; 91 object->Release(); 92 } 93