#ifndef _DRAGITEMI_H #define _DRAGITEMI_H #include "dragitem.h" #include #include #include class DragItemI : public DragItem { public: DragItemI(const wchar_t *datatype, void *datum = NULL); virtual ~DragItemI() {} void addVoidDatum(void *newdatum); // up to you to cast it right const wchar_t *getDatatype(); int getNumData(); void *getDatum(int pos = 0); private: RECVS_DISPATCH; StringW datatype; PtrList datalist; }; template class DragItemT : public DragItemI { public: DragItemT(T *item = NULL) : DragItemI(T::dragitem_getDatatype(), item) {} static inline DragItemI *create(T *item) { return new DragItemT(item); } void addDatum(T *newdatum) { addVoidDatum(static_cast(newdatum)); } }; template class DragItemCast { public: DragItemCast(DragItem *_item, int _pos = 0) : item(_item), pos(_pos) {} operator T *() { if (item == NULL || !STREQL(T::dragitem_getDatatype(), item->getDatatype())) return NULL; else return static_cast(item->getDatum(pos)); } private: DragItem *item; int pos; }; #endif