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
00075 int Drag(GView *SourceWnd, int Effect);
00076
00078 virtual void OnRegister(bool Suc) {}
00080 virtual void OnStartData() {}
00082 virtual void OnEndData() {}
00083
00087 virtual bool GetData
00088 (
00090 GVariant *Data,
00092 char *Format
00093 )
00094 { return false; }
00095
00112 virtual bool GetFormats
00113 (
00116 List<char> &Formats
00117 )
00118 { return false; }
00119 };
00120
00122 class LgiClass GDragDropTarget
00123 #if WIN32NATIVE
00124 : public IDropTarget
00125 #endif
00126 {
00127 private:
00128 GView *To;
00129 uchar *DragDropData;
00130 int DragDropLength;
00131 List<char> Formats;
00132
00133 #if WIN32NATIVE
00134
00135 ULONG STDMETHODCALLTYPE AddRef();
00136 ULONG STDMETHODCALLTYPE Release();
00137 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppv);
00138
00139
00140 HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00141 HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00142 HRESULT STDMETHODCALLTYPE DragLeave(void);
00143 HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00144
00145 #endif
00146
00147 protected:
00148 #if WIN32NATIVE
00149
00150 IDataObject *DataObject;
00151
00152
00153 bool OnDropFileGroupDescriptor(FILEGROUPDESCRIPTOR *Data, GArray<char*> &Files);
00154 #endif
00155
00156 public:
00157 GDragDropTarget();
00158 ~GDragDropTarget();
00159
00161 void SetWindow(GView *To);
00162
00163
00164
00166 virtual void OnDragInit(bool Suc) {}
00168 virtual void OnDragEnter() {}
00170 virtual void OnDragExit() {}
00171
00179 virtual int WillAccept
00180 (
00182 List<char> &Formats,
00184 GdcPt2 Pt,
00187 int KeyState
00188 ) { return DROPEFFECT_NONE; }
00189
00194 virtual int OnDrop
00195 (
00197 char *Format,
00199 GVariant *Data,
00201 GdcPt2 Pt,
00204 int KeyState
00205 ) { return DROPEFFECT_NONE; }
00206 };
00207
00208 #endif