Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members

/home/jeroen/FOX/fox/fox-1.7.33/include/FXObject.h
00001 /********************************************************************************
00002 *                                                                               *
00003 *                         T o p l e v el   O b j e c t                          *
00004 *                                                                               *
00005 *********************************************************************************
00006 * Copyright (C) 1997,2012 by Jeroen van der Zijp.   All Rights Reserved.        *
00007 *********************************************************************************
00008 * This library is free software; you can redistribute it and/or modify          *
00009 * it under the terms of the GNU Lesser General Public License as published by   *
00010 * the Free Software Foundation; either version 3 of the License, or             *
00011 * (at your option) any later version.                                           *
00012 *                                                                               *
00013 * This library is distributed in the hope that it will be useful,               *
00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                 *
00016 * GNU Lesser General Public License for more details.                           *
00017 *                                                                               *
00018 * You should have received a copy of the GNU Lesser General Public License      *
00019 * along with this program.  If not, see <http://www.gnu.org/licenses/>          *
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

Copyright © 1997-2011 Jeroen van der Zijp