00001 #ifndef INCL_WINDRAG
00002 #define INCL_WINDRAG
00003
00004 #if defined(WIN32) && defined(USE_EXULTSTUDIO) && !defined(UNDER_CE)
00005
00006 #include "u7drag.h"
00007 #include <ole2.h>
00008 #include "utils.h"
00009
00010
00011 class windragdata {
00012 sint32 id;
00013 uint32 size;
00014 unsigned char * data;
00015 public:
00016
00017 inline unsigned char *get_data() {
00018 return data;
00019 }
00020 inline const int get_id() {
00021 return id;
00022 }
00023 inline const int get_size() {
00024 return size;
00025 }
00026
00027
00028 inline windragdata() : size(0), data(0) {
00029 }
00030
00031 inline windragdata(windragdata &o) : id(o.id), size(o.size), data(new unsigned char [o.size]) {
00032 std::memcpy(data, o.data, size);
00033 }
00034
00035 inline windragdata(unsigned char *buf) :data(0) {
00036 operator = (buf);
00037 }
00038 inline windragdata(sint32 i, uint32 s, unsigned char * d) :
00039 id(i), size(s), data(new unsigned char [s]) {
00040 std::memcpy(data, d, size);
00041 }
00042
00043
00044 inline ~windragdata() {
00045 delete [] data;
00046 }
00047
00048 inline void serialize(unsigned char *buf) {
00049 Write4(buf, id);
00050 Write4(buf, size);
00051 std::memcpy(buf, data, size);
00052 }
00053 inline windragdata & operator = (unsigned char *buf) {
00054 delete [] data;
00055
00056 id = Read4(buf);
00057 size = Read4(buf);
00058 data = new unsigned char [size];
00059 std::memcpy(data, buf, size);
00060 return *this;
00061 }
00062
00063 inline windragdata & operator = (windragdata &o) {
00064 delete [] data;
00065 id = o.id;
00066 size = o.size;
00067 data = new unsigned char [size];
00068 std::memcpy(data, o.data, size);
00069 return *this;
00070 }
00071 inline void assign(sint32 i, uint32 s, unsigned char * d) {
00072 delete [] data;
00073 id = i;
00074 size = s;
00075 data = new unsigned char [s];
00076 std::memcpy(data, d, size);
00077 }
00078
00079 };
00080
00081
00082
00083
00084 class FAR Windnd : public IDropTarget
00085 {
00086 private:
00087 HWND gamewin;
00088
00089 DWORD m_cRef;
00090
00091 void *udata;
00092
00093 Move_shape_handler_fun move_shape_handler;
00094 Move_combo_handler_fun move_combo_handler;
00095 Drop_shape_handler_fun shape_handler;
00096 Drop_chunk_handler_fun chunk_handler;
00097 Drop_shape_handler_fun face_handler;
00098 Drop_combo_handler_fun combo_handler;
00099
00100
00101 int drag_id;
00102 int prevx, prevy;
00103 union {
00104 struct {
00105 int file,shape,frame;
00106 } shape;
00107 struct {
00108 int chunknum;
00109 } chunk;
00110 struct {
00111 int xtiles, ytiles;
00112 int right, below, cnt;
00113 U7_combo_data *combo;
00114 } combo;
00115 } data;
00116
00117 public:
00118 Windnd(HWND hgwnd, Move_shape_handler_fun, Move_combo_handler_fun,
00119 Drop_shape_handler_fun, Drop_chunk_handler_fun,
00120 Drop_combo_handler_fun);
00121 Windnd(HWND hgwnd, Drop_shape_handler_fun shapefun,
00122 Drop_chunk_handler_fun cfun, Drop_shape_handler_fun facefun, void *d);
00123 ~Windnd();
00124
00125 STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
00126 STDMETHOD_(ULONG,AddRef)(void);
00127 STDMETHOD_(ULONG,Release)(void);
00128
00129 STDMETHOD(DragEnter)(IDataObject * pDataObject,
00130 DWORD grfKeyState,
00131 POINTL pt,
00132 DWORD * pdwEffect);
00133 STDMETHOD(DragOver)(DWORD grfKeyState,
00134 POINTL pt,
00135 DWORD * pdwEffect);
00136 STDMETHOD(DragLeave)(void);
00137 STDMETHOD(Drop)(IDataObject * pDataObject,
00138 DWORD grfKeyState,
00139 POINTL pt,
00140 DWORD * pdwEffect);
00141
00142 bool is_valid(IDataObject * pDataObject);
00143
00144 static void CreateStudioDropDest(Windnd *& windnd, HWND &hWnd,
00145 Drop_shape_handler_fun shapefun,
00146 Drop_chunk_handler_fun cfun,
00147 Drop_shape_handler_fun facefun,
00148 void *udata);
00149
00150 static void DestroyStudioDropDest(Windnd *& windnd, HWND &hWnd);
00151 };
00152
00153
00154
00155
00156
00157 class FAR Windropsource : public IDropSource
00158 {
00159 private:
00160 DWORD m_cRef;
00161
00162 HWND drag_shape;
00163 HBITMAP drag_bitmap;
00164 int shw, shh;
00165
00166 public:
00167 Windropsource(HBITMAP pdrag_bitmap, int x0, int y0);
00168 ~Windropsource();
00169
00170 STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
00171 STDMETHOD_(ULONG,AddRef)(void);
00172 STDMETHOD_(ULONG,Release)(void);
00173
00174 STDMETHOD(QueryContinueDrag)(BOOL fEscapePressed,DWORD grfKeyState);
00175 STDMETHOD(GiveFeedback)(DWORD dwEffect);
00176
00177 };
00178
00179
00180
00181
00182 class FAR Winstudioobj : public IDataObject
00183 {
00184 private:
00185 DWORD m_cRef;
00186
00187 HBITMAP drag_image;
00188
00189 windragdata data;
00190
00191 public:
00192 Winstudioobj(windragdata pdata);
00193 ~Winstudioobj();
00194
00195 STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
00196 STDMETHOD_(ULONG,AddRef)(void);
00197 STDMETHOD_(ULONG,Release)(void);
00198
00199 STDMETHOD(GetData)(FORMATETC * pFormatetc, STGMEDIUM * pmedium);
00200 STDMETHOD(GetDataHere)(FORMATETC * pFormatetc, STGMEDIUM * pmedium);
00201 STDMETHOD(QueryGetData)(
00202 FORMATETC * pFormatetc
00203 );
00204 STDMETHOD(GetCanonicalFormatEtc)(
00205 FORMATETC * pFormatetcIn,
00206 FORMATETC * pFormatetcOut
00207 );
00208 STDMETHOD(SetData)(
00209 FORMATETC * pFormatetc,
00210 STGMEDIUM * pmedium,
00211 BOOL fRelease
00212 );
00213 STDMETHOD(EnumFormatEtc)(
00214 DWORD dwDirection,
00215 IEnumFORMATETC ** ppenumFormatetc
00216 );
00217 STDMETHOD(DAdvise)(
00218 FORMATETC * pFormatetc,
00219 DWORD advf,
00220 IAdviseSink * pAdvSink,
00221 DWORD * pdwConnection
00222 );
00223 STDMETHOD(DUnadvise)(
00224 DWORD dwConnection
00225 );
00226 STDMETHOD(EnumDAdvise)(
00227 IEnumSTATDATA ** ppenumAdvise
00228 );
00229 };
00230
00231 #endif
00232
00233 #endif