00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if !defined(FXOBJECT_H) && !defined(FX_DISABLEGUI)
00025 #define FXOBJECT_H
00026
00027 #include "QTrans.h"
00028 #include "FXStream.h"
00029
00030
00031 namespace FX {
00032
00034 enum {
00035 MINKEY = 0,
00036 MAXKEY = 65535
00037 };
00038
00039
00041 enum {
00042 MINTYPE = 0,
00043 MAXTYPE = 65535
00044 };
00045
00046
00048 typedef FXuint FXSelector;
00049
00050
00051 class FXObject;
00052
00053
00055 class FXAPI FXMetaClass {
00056 private:
00057 const FXchar *className;
00058 FXObject* (*manufacture)();
00059 const FXMetaClass *baseClass;
00060 const void *assoc;
00061 FXuint nassocs;
00062 FXuint assocsz;
00063 private:
00064 static const FXMetaClass **metaClassTable;
00065 static FXuint nmetaClassTable;
00066 static FXuint nmetaClasses;
00067 private:
00068 static void resize(FXuint n);
00069 public:
00070 FXMetaClass(const FXchar* name,FXObject *(fac)(),const FXMetaClass* base,const void* ass,FXuint nass,FXuint assz);
00071
00073 bool isSubClassOf(const FXMetaClass* metaclass) const;
00074
00076 FXObject* makeInstance() const;
00077
00079 const FXchar* getClassName() const { return className; }
00080
00082 const FXMetaClass* getBaseClass() const { return baseClass; }
00083
00085 static const FXMetaClass* getMetaClassFromName(const FXchar* name);
00086
00088 const void* search(FXSelector key) const;
00089
00090 ~FXMetaClass();
00091 };
00092
00093
00095 #define FXDECLARE(classname) \
00096 public: \
00097 struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \
00098 static const FX::FXMetaClass metaClass; \
00099 static FX::FXObject* manufacture(); \
00100 virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \
00101 virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \
00102 friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((FX::FXObjectPtr)(obj));} \
00103 friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObjectPtr&)(obj));} \
00104 private:
00105
00106
00108 #define FXIMPLEMENT(classname,baseclassname,mapping,nmappings) \
00109 FX::FXObject* classname::manufacture(){return new classname;} \
00110 const FX::FXMetaClass classname::metaClass(#classname,classname::manufacture,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry)); \
00111 long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \
00112 const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00113 return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00114 }
00115
00116
00118 #define FXDECLARE_ABSTRACT(classname) \
00119 public: \
00120 struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \
00121 static const FX::FXMetaClass metaClass; \
00122 virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \
00123 virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \
00124 friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((FX::FXObjectPtr)(obj));} \
00125 friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObjectPtr&)(obj));} \
00126 private:
00127
00128
00130 #define FXIMPLEMENT_ABSTRACT(classname,baseclassname,mapping,nmappings) \
00131 const FX::FXMetaClass classname::metaClass(#classname,NULL,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry)); \
00132 long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \
00133 const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00134 return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00135 }
00136
00137
00139 #define FXMETACLASS(classname) (&classname::metaClass)
00140
00141
00143 #define FXDEFMAP(classname) static const classname::FXMapEntry
00144
00146 #define FXMAPTYPES(typelo,typehi,func) {FXSEL(typelo,FX::MINKEY),FXSEL(typehi,FX::MAXKEY),&func}
00147
00149 #define FXMAPTYPE(type,func) {FXSEL(type,FX::MINKEY),FXSEL(type,FX::MAXKEY),&func}
00150
00152 #define FXMAPFUNCS(type,keylo,keyhi,func) {FXSEL(type,keylo),FXSEL(type,keyhi),&func}
00153
00155 #define FXMAPFUNC(type,key,func) {FXSEL(type,key),FXSEL(type,key),&func}
00156
00157
00167 class FXAPI FXObject {
00168 FXDECLARE(FXObject)
00169 public:
00170
00172 virtual long onDefault(FXObject*,FXSelector,void*);
00173
00174 public:
00175
00177 const FXchar* getClassName() const;
00178
00180 bool isMemberOf(const FXMetaClass* metaclass) const;
00181
00183 virtual long tryHandle(FXObject* sender,FXSelector sel,void* ptr);
00184
00186 virtual void save(FXStream& store) const;
00187
00189 virtual void load(FXStream& store);
00190
00193 QTransString tr(const char *text, const char *hint=0);
00194
00196 virtual void *getPythonObject() const { return 0; }
00197
00199 virtual void decouplePythonObject() const { }
00200
00202 virtual ~FXObject();
00203 };
00204
00205 }
00206
00207 #endif