]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/object.h
Added a wxDD_NEW_DIR_BUTTON style for wxDirDialog (currently,
[wxWidgets.git] / include / wx / object.h
index 1ae384425343e5c99bef4884b35cb603330849e1..d0eb3167f39d64421d6d80f8a7e990a151a3af58 100644 (file)
@@ -84,7 +84,7 @@ public:
     static const wxClassInfo  *GetFirst() { return sm_first; }
     const wxClassInfo         *GetNext() const { return m_next; }
     static wxClassInfo        *FindClass(const wxChar *className);
-    
+
         // Climb upwards through inheritance hierarchy.
         // Dual inheritance is catered for.
 
@@ -122,12 +122,17 @@ public:
     static wxClassInfo      *sm_first;
     wxClassInfo             *m_next;
 
+    // FIXME: this should be private (currently used directly by way too
+    //        many clients)
     static wxHashTable      *sm_classTable;
+
+private:
+    // InitializeClasses() helper
+    static wxClassInfo *GetBaseByName(const wxChar *name);
 };
 
 WXDLLEXPORT wxObject *wxCreateDynamicObject(const wxChar *name);
 
-
 // ----------------------------------------------------------------------------
 // Dynamic class macros
 // ----------------------------------------------------------------------------
@@ -208,11 +213,11 @@ name##PluginSentinel  m_pluginsentinel;
 #define _IMPLEMENT_DL_SENTINEL(name)                                \
  const wxString name::name##PluginSentinel::sm_className(#name);    \
  name::name##PluginSentinel::name##PluginSentinel() {               \
-    wxDLManifestEntry *e = (wxDLManifestEntry*) wxDLManifestEntry::ms_classes.Get(#name);   \
+    wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes.Get(#name);   \
     if( e != 0 ) { e->RefObj(); }                                      \
  }                                                                  \
- name::name##PluginSentinel::~##name##PluginSentinel() {            \
-    wxDLManifestEntry *e = (wxDLManifestEntry*) wxDLManifestEntry::ms_classes.Get(#name);   \
+ name::name##PluginSentinel::~name##PluginSentinel() {            \
+    wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes.Get(#name);   \
     if( e != 0 ) { e->UnrefObj(); }                                 \
  }
 #else
@@ -382,18 +387,33 @@ public:
     virtual void Dump(wxSTD ostream& str);
 #endif
 
-        // make a 'clone' of the object
-  
+    // ref counted data handling methods
+
+    // get/set
+    wxObjectRefData *GetRefData() const { return m_refData; }
+    void SetRefData(wxObjectRefData *data) { m_refData = data; }
+
+    // make a 'clone' of the object
     void Ref(const wxObject& clone);
 
-        // destroy a reference
-  
+    // destroy a reference
     void UnRef();
 
-    inline wxObjectRefData *GetRefData() const { return m_refData; }
-    inline void SetRefData(wxObjectRefData *data) { m_refData = data; }
-
 protected:
+    // ensure that our data is not shared with anybody else: if we have no
+    // data, it is created using CreateRefData() below, if we have shared data
+    // it is copied using CloneRefData(), otherwise nothing is done
+    void AllocExclusive();
+
+    // both methods must be implemented if Unshare() is used, not pure virtual
+    // only because of the backwards compatibility reasons
+
+    // create a new m_refData
+    virtual wxObjectRefData *CreateRefData() const;
+
+    // create a new m_refData initialized with the given one
+    virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
+
     wxObjectRefData *m_refData;
 };