00001
00002
00003 #ifndef __DRAG_AND_DROP
00004 #define __DRAG_AND_DROP
00005
00006 #include "GVariant.h"
00007
00008 #if WIN32NATIVE
00009
00010 #include <shlobj.h>
00011 #include "GCom.h"
00012
00013 #else
00014
00015 #ifndef S_OK
00016 #define S_OK 0
00017 #endif
00018 #define DROPEFFECT_NONE 0x0
00019 #define DROPEFFECT_COPY 0x1
00020 #define DROPEFFECT_MOVE 0x2
00021 #define DROPEFFECT_LINK 0x4
00022
00023 #endif
00024
00025
00026 #if defined WIN32
00027
00028 #endif
00029
00031
00033 class LgiClass GDragDropSource
00034 #if WIN32NATIVE
00035 : public IDropSource, public IEnumFORMATETC
00036 #endif
00037 {
00038 friend class GDataObject;
00039
00040 protected:
00041 class GDndSourcePriv *d;
00042
00043 #if WIN32NATIVE
00044 int Index;
00045
00046
00047 ULONG STDMETHODCALLTYPE AddRef();
00048 ULONG STDMETHODCALLTYPE Release();
00049 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppv);
00050
00051
00052 HRESULT STDMETHODCALLTYPE Next(ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched);
00053 HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
00054 HRESULT STDMETHODCALLTYPE Reset();
00055 HRESULT STDMETHODCALLTYPE Clone(IEnumFORMATETC **ppenum);
00056
00057
00058 HRESULT STDMETHODCALLTYPE QueryContinueDrag(BOOL fEscapePressed, DWORD InputState);
00059 HRESULT STDMETHODCALLTYPE GiveFeedback(DWORD dwEffect);
00060 #endif
00061
00063 bool CreateFileDrop(GVariant *Var, GMouse &m, List<char> &Files);
00064
00065 #ifdef XWIN
00066
00067 #endif
00068
00069 public:
00070 GDragDropSource();
00071 ~GDragDropSource();
00072
00074 int Drag(GView *SourceWnd, int Effect);
00075
00077 virtual void OnRegister(bool Suc) {}
00079 virtual void OnStartData() {}
00081 virtual void OnEndData() {}
00082
00086 virtual bool GetData
00087 (
00089 GVariant *Data,
00091 char *Format
00092 )
00093 { return false; }
00094
00111 virtual bool GetFormats
00112 (
00115 List<char> &Formats
00116 )
00117 { return false; }
00118 };
00119
00121 class LgiClass GDragDropTarget
00122 #if WIN32NATIVE
00123 : public IDropTarget
00124 #endif
00125 {
00126 private:
00127 GView *To;
00128 uchar *DragDropData;
00129 int DragDropLength;
00130 List<char> Formats;
00131
00132 #if WIN32NATIVE
00133
00134 ULONG STDMETHODCALLTYPE AddRef();
00135 ULONG STDMETHODCALLTYPE Release();
00136 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppv);
00137
00138
00139 HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00140 HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00141 HRESULT STDMETHODCALLTYPE DragLeave(void);
00142 HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00143
00144 #endif
00145
00146 protected:
00147 #if WIN32NATIVE
00148
00149 IDataObject *DataObject;
00150
00151
00152 bool OnDropFileGroupDescriptor(FILEGROUPDESCRIPTOR *Data, GArray<char*> &Files);
00153 #endif
00154
00155 public:
00156 GDragDropTarget();
00157 ~GDragDropTarget();
00158
00160 void SetWindow(GView *To);
00161
00162
00163
00165 virtual void OnDragInit(bool Suc) {}
00167 virtual void OnDragEnter() {}
00169 virtual void OnDragExit() {}
00170
00178 virtual int WillAccept
00179 (
00181 List<char> &Formats,
00183 GdcPt2 Pt,
00186 int KeyState
00187 ) { return DROPEFFECT_NONE; }
00188
00193 virtual int OnDrop
00194 (
00196 char *Format,
00198 GVariant *Data,
00200 GdcPt2 Pt,
00203 int KeyState
00204 ) { return DROPEFFECT_NONE; }
00205 };
00206
00207 #endif