FXObject.h

Go to the documentation of this file.
00001 /********************************************************************************
00002 *                                                                               *
00003 *                         T o p l e v el   O b j e c t                          *
00004 *                                                                               *
00005 *********************************************************************************
00006 * Copyright (C) 1997,2006 by Jeroen van der Zijp.   All Rights Reserved.        *
00007 *********************************************************************************
00008 * This library is free software; you can redistribute it and/or                 *
00009 * modify it under the terms of the GNU Lesser General Public                    *
00010 * License as published by the Free Software Foundation; either                  *
00011 * version 2.1 of the License, or (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 GNU             *
00016 * Lesser General Public License for more details.                               *
00017 *                                                                               *
00018 * You should have received a copy of the GNU Lesser General Public              *
00019 * License along with this library; if not, write to the Free Software           *
00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
00021 *********************************************************************************
00022 * $Id: FXObject.h,v 1.35.2.1 2006/08/05 00:58:29 fox Exp $                          *
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

(C) 2002-2009 Niall Douglas. Some parts (C) to assorted authors.
Generated on Fri Nov 20 18:31:23 2009 for TnFOX by doxygen v1.4.7