windrag.h

Go to the documentation of this file.
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 // A useful structure for Winstudioobj
00011 class windragdata {
00012   sint32 id;
00013   uint32 size;      // Size of data
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   // Default constructor
00028   inline windragdata() : size(0), data(0) {
00029   }
00030   // Copy constructor
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   // Read from buffer
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   // Destructor
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   // Copy constructor
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  * The 'IDropTarget' implementation
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   // Used for when dragging the mouse over the exult window
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  * The IDropSource implementation
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  * The IDataObject implementation
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

Generated on Mon Jul 9 14:42:52 2007 for ExultEngine by  doxygen 1.5.1