uclassImpl.hpp

00001 /* ==================================================== ======== ======= *
00002 *
00003 *  uclassImpl.hpp
00004 *  Ubit Project 
00005 *  Part of the Ubit Toolkit: A Brick Construction Game Model for Creating GUIs
00006 *  (C) 1999-2006 / Eric Lecolinet / ENST Paris / http://www.enst.fr/~elc/ubit
00007 * ***********************************************************************
00008 * COPYRIGHT NOTICE :
00009 * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY AND WITHOUT EVEN THE
00010 * IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
00011 * YOU CAN REDISTRIBUTE IT AND/OR MODIFY IT UNDER THE TERMS OF THE GNU
00012 * GENERAL PUBLIC LICENSE AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION;
00013 * EITHER VERSION 2 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
00014 * SEE FILES 'COPYRIGHT' AND 'COPYING' FOR MORE DETAILS.
00015 * ***********************************************************************
00016 * ==================================================== [(c)Elc] ======= *
00017 * ==================================================== ======== ======= */
00018 
00019 #ifndef _uclassImpl_hpp_
00020 #define _uclassImpl_hpp_ 1
00021 //pragma ident  "@(#)uclassImpl.hpp     ubit:05.05.00"
00022 #include <map>
00023 #include <ubit/uclass.hpp>
00024 #include <ubit/uprop.hpp>
00025 #include <ubit/ugroup.hpp>
00026 #include <ubit/ubox.hpp>
00027 namespace ubit {
00028 
00029 /* ==================================================== ===== ======= */
00030 
00031 class UDefaultAttribute : public UProp {
00032 public:
00033   struct Class : public UAttributeClass {
00034     Class(const UStr& classname) : UAttributeClass(classname) {initClass();}
00035     
00036     virtual bool isInstance(UObject& obj) const {
00037       return dynamic_cast<UDefaultAttribute*>(&obj);  // && test name ?
00038     }
00039     virtual UDefaultAttribute* newInstance() const {
00040       return new UDefaultAttribute(*this);
00041     }
00042   };
00043   
00044   UDefaultAttribute(const UDefaultAttribute::Class& c) : cid(c) {}
00045   
00046   virtual const UAttributeClass& getClass() const {return cid;} 
00047   static  const UAttributeClass& classid() {
00048     static Class* _cid_ = new Class("#attribute"); return *_cid_;
00049   }
00050   
00051 private:
00052   const Class& cid;  // !!ATT aux destructions, un uptr<> serait preferable !!
00053 };
00054   
00055 /* ==================================================== ===== ======= */
00056 
00057 class UDefaultInlineElement : public UGroup {
00058 public:
00059   struct Class : public UElementClass {
00060     Class(const UStr& classname) : UElementClass(classname) {initClass();}
00061     
00062     virtual bool isInstance(UObject& obj) const {
00063       return dynamic_cast<UDefaultInlineElement*>(&obj);  // && test name ?
00064     }
00065     virtual UDefaultInlineElement* newInstance() const {
00066       return new UDefaultInlineElement(*this);
00067     }
00068     virtual UStyle* newStyle() const {return UDefaultInlineElement::createStyle();}
00069   };
00070     
00071   UDefaultInlineElement(const UDefaultInlineElement::Class& c) : cid(c) {}  
00072   
00073   virtual const UElementClass& getClass() const {return cid;} 
00074   static  const UElementClass& classid() {
00075     static Class* _cid_ = new Class("#element"); return *_cid_;
00076   }
00077 
00078 private:
00079   const Class& cid;  // !!ATT aux destructions, un uptr<> serait preferable !!
00080 };
00081   
00082 /* ==================================================== ===== ======= */
00083 
00084 class UDefaultBlockElement : public UGroup {
00085 public:
00086   struct Class : public UElementClass {
00087     Class(const UStr& classname) : UElementClass(classname) {initClass();}
00088     
00089     virtual bool isInstance(UObject& obj) const {
00090       return dynamic_cast<UDefaultBlockElement*>(&obj);  // && test name ?
00091     }
00092     virtual UDefaultBlockElement* newInstance() const {
00093       return new UDefaultBlockElement(*this);
00094     }
00095     virtual UStyle* newStyle() const {return UDefaultBlockElement::createStyle();}
00096   };
00097   
00098   UDefaultBlockElement(const UDefaultBlockElement::Class& c) : cid(c) {}  
00099   
00100   virtual const UElementClass& getClass() const {return cid;} 
00101   static  const UElementClass& classid() {
00102     static Class* _cid_ = new Class("#element"); return *_cid_;
00103   }
00104   
00105 private:
00106     const Class& cid;  // !!ATT aux destructions, un uptr<> serait preferable !!
00107 };
00108 
00109 /* ==================================================== [Elc] ======= */
00110 /* ==================================================== ===== ======= */
00111 
00112 class UAttributeClassMap {
00113 public:
00114   ~UAttributeClassMap();
00115   
00116   void addClass(const UAttributeClass&);
00118   
00119   const UAttributeClass* findClass(const UStr& name) const;
00121     
00122   const UAttributeClass* obtainClass(const UStr& name);
00124 
00125   struct Comp {
00127     bool operator()(const UStr*a,const UStr*b) const {return a->compare(*b,true) < 0;}
00128   };
00129   
00130   typedef std::map<const UStr*, const UAttributeClass*, Comp> Map;
00131   Map map;
00132 };
00133   
00134 /* ==================================================== ===== ======= */
00135   
00136 class UElementClassMap {
00137 public:
00138   ~UElementClassMap();
00139   
00140   void addClass(const UElementClass&);
00142 
00143   const UElementClass* findClass(const UStr& name) const;
00145 
00146   const UElementClass* obtainClass(const UStr& name);
00148 
00149   struct Comp {
00151     bool operator()(const UStr*a,const UStr*b) const {return a->compare(*b,true)<0;}
00152   };
00153   typedef std::map<const UStr*, const UElementClass*, Comp> Map;
00154   Map map;
00155 };
00156 
00157 /* ==================================================== ===== ======= */
00158   
00159 class UStyleSheet : public UElementClassMap {
00160 public:
00161   ~UStyleSheet();
00162 };
00163 
00164 }
00165 #endif
00166 /* ==================================================== [TheEnd] ======= */
00167 /* ==================================================== [(c)Elc] ======= */
00168 
00169 
00170 

Generated on Mon Jan 29 00:20:37 2007 for Ubit by  doxygen 1.4.7