00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef FXOBJECT_H
00022 #define FXOBJECT_H
00023
00024 #ifndef FXMETACLASS_H
00025 #include "FXMetaClass.h"
00026 #endif
00027
00028 namespace FX {
00029
00030
00032 #define FXDECLARE(classname) \
00033 public: \
00034 struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \
00035 static const FX::FXMetaClass metaClass; \
00036 static FX::FXObject* manufacture(); \
00037 virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \
00038 virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \
00039 friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((const FX::FXObject*)(obj));} \
00040 friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObject*&)(obj));} \
00041 private:
00042
00043
00045 #define FXIMPLEMENT(classname,baseclassname,mapping,nmappings) \
00046 FX::FXObject* classname::manufacture(){return new classname;} \
00047 const FX::FXMetaClass classname::metaClass(#classname,classname::manufacture,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry)); \
00048 long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \
00049 const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00050 return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00051 }
00052
00053
00055 #define FXDECLARE_ABSTRACT(classname) \
00056 public: \
00057 struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \
00058 static const FX::FXMetaClass metaClass; \
00059 virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \
00060 virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \
00061 friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((const FX::FXObject*)(obj));} \
00062 friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObject*&)(obj));} \
00063 private:
00064
00065
00067 #define FXIMPLEMENT_ABSTRACT(classname,baseclassname,mapping,nmappings) \
00068 const FX::FXMetaClass classname::metaClass(#classname,NULL,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry)); \
00069 long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \
00070 const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \
00071 return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \
00072 }
00073
00074
00076 #define FXMETACLASS(classname) (&classname::metaClass)
00077
00078
00080 #define FXDEFMAP(classname) static const classname::FXMapEntry
00081
00083 #define FXMAPTYPES(typelo,typehi,func) {FXSEL(typelo,FX::MINKEY),FXSEL(typehi,FX::MAXKEY),&func}
00084
00086 #define FXMAPTYPE(type,func) {FXSEL(type,FX::MINKEY),FXSEL(type,FX::MAXKEY),&func}
00087
00089 #define FXMAPFUNCS(type,keylo,keyhi,func) {FXSEL(type,keylo),FXSEL(type,keyhi),&func}
00090
00092 #define FXMAPFUNC(type,key,func) {FXSEL(type,key),FXSEL(type,key),&func}
00093
00094
00104 class FXAPI FXObject {
00105 FXDECLARE(FXObject)
00106 public:
00107
00109 const FXchar* getClassName() const;
00110
00112 FXbool isMemberOf(const FXMetaClass* metaclass) const;
00113
00115 virtual long tryHandle(FXObject* sender,FXSelector sel,void* ptr);
00116
00118 virtual long onDefault(FXObject*,FXSelector,void*);
00119
00121 virtual void save(FXStream& store) const;
00122
00124 virtual void load(FXStream& store);
00125
00127 virtual ~FXObject();
00128 };
00129
00130 }
00131
00132 #endif