{
public:
wxClassInfo( const wxChar *className,
- const wxChar *baseName1,
- const wxChar *baseName2,
+ const wxClassInfo *baseInfo1,
+ const wxClassInfo *baseInfo2,
int size,
wxObjectConstructorFn ctor )
: m_className(className)
- , m_baseClassName1(baseName1)
- , m_baseClassName2(baseName2)
, m_objectSize(size)
, m_objectConstructor(ctor)
- , m_baseInfo1(0)
- , m_baseInfo2(0)
+ , m_baseInfo1(baseInfo1)
+ , m_baseInfo2(baseInfo2)
, m_next(sm_first)
- { sm_first = this; }
+ {
+ sm_first = this;
+ Register();
+ }
~wxClassInfo();
wxObject *CreateObject() { return m_objectConstructor ? (*m_objectConstructor)() : 0; }
const wxChar *GetClassName() const { return m_className; }
- const wxChar *GetBaseClassName1() const { return m_baseClassName1; }
- const wxChar *GetBaseClassName2() const { return m_baseClassName2; }
+ const wxChar *GetBaseClassName1() const { return m_baseInfo1->GetClassName(); }
+ const wxChar *GetBaseClassName2() const { return m_baseInfo2->GetClassName(); }
const wxClassInfo *GetBaseClass1() const { return m_baseInfo1; }
const wxClassInfo *GetBaseClass2() const { return m_baseInfo2; }
int GetSize() const { return m_objectSize; }
( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) );
}
- // Initializes parent pointers and hash table for fast searching.
-
+ // Initializes parent pointers and hash table for fast searching.
static void InitializeClasses();
- // Cleans up hash table used for fast searching.
-
+ // Cleans up hash table used for fast searching.
static void CleanUpClasses();
-
-
+
public:
const wxChar *m_className;
- const wxChar *m_baseClassName1;
- const wxChar *m_baseClassName2;
int m_objectSize;
wxObjectConstructorFn m_objectConstructor;
static wxClassInfo *GetBaseByName(const wxChar *name);
DECLARE_NO_COPY_CLASS(wxClassInfo)
+
+protected:
+ // registers the class
+ void Register();
+ void Unregister();
};
WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
#define IMPLEMENT_DYNAMIC_CLASS(name, basename) \
wxObject* wxConstructorFor##name() \
{ return new name; } \
- wxClassInfo name::sm_class##name(wxT(#name), wxT(#basename), \
- 0, (int) sizeof(name), \
+ wxClassInfo name::sm_class##name(wxT(#name), \
+ &basename::sm_class##basename, NULL, \
+ (int) sizeof(name), \
(wxObjectConstructorFn) wxConstructorFor##name);
// Multiple inheritance with two base classes
#define IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \
wxObject* wxConstructorFor##name() \
{ return new name; } \
- wxClassInfo name::sm_class##name(wxT(#name), wxT(#basename1), \
+ wxClassInfo name::sm_class##name(wxT(#name), \
+ &basename1::sm_class##basename1, \
+ &basename2::sm_class##basename2, \
wxT(#basename2), (int) sizeof(name), \
(wxObjectConstructorFn) wxConstructorFor##name);
// Single inheritance with one base class
#define IMPLEMENT_ABSTRACT_CLASS(name, basename) \
- wxClassInfo name::sm_class##name(wxT(#name), wxT(#basename), \
- 0, (int) sizeof(name), (wxObjectConstructorFn) 0);
+ wxClassInfo name::sm_class##name(wxT(#name), \
+ &basename::sm_class##basename, NULL, \
+ (int) sizeof(name), (wxObjectConstructorFn) 0);
// Multiple inheritance with two base classes
#define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \
- wxClassInfo name::sm_class##name(wxT(#name), wxT(#basename1), \
- wxT(#basename2), (int) sizeof(name), \
+ wxClassInfo name::sm_class##name(wxT(#name), \
+ &basename1::sm_class##basename1, \
+ &basename2::sm_class##basename2, \
+ (int) sizeof(name), \
(wxObjectConstructorFn) 0);
#define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS
info = info->m_next;
}
}
-#if wxUSE_EXTENDED_RTTI
- Unregister( m_className ) ;
-#endif
+ Unregister();
}
wxClassInfo *wxClassInfo::FindClass(const wxChar *className)
}
}
-// a tiny InitializeClasses() helper
-/* static */
-inline wxClassInfo *wxClassInfo::GetBaseByName(const wxChar *name)
-{
- if ( !name )
- return NULL;
-
- wxClassInfo *classInfo = (wxClassInfo *)sm_classTable->Get(name);
-
-#ifdef __WXDEBUG__
- // this must be fixed, other things will work wrongly later if you get this
- if ( !classInfo )
- {
- wxFAIL_MSG( wxString::Format
- (
- _T("base class '%s' is unknown to wxWindows RTTI"),
- name
- ) );
- }
-#endif // __WXDEBUG__
-
- return classInfo;
-}
-
// Set pointers to base class(es) to speed up IsKindOf
void wxClassInfo::InitializeClasses()
{
size_t nClass = 0;
#endif
- sm_classTable = new wxHashTable(wxKEY_STRING);
-
- // Index all class infos by their class name
-
- wxClassInfo *info;
- for(info = sm_first; info; info = info->m_next)
+ // Do this initialization only once, because classes are added
+ // automatically if
+ if ( sm_classTable == NULL )
{
- if (info->m_className)
+ sm_classTable = new wxHashTable(wxKEY_STRING);
+
+ // Index all class infos by their class name:
+ wxClassInfo *info;
+ for(info = sm_first; info; info = info->m_next)
{
- wxASSERT_MSG( ++nClass < nMaxClasses,
- _T("an infinite loop detected - have you used IMPLEMENT_DYNAMIC_CLASS() twice (may be by linking some object module(s) twice)?") );
- sm_classTable->Put(info->m_className, (wxObject *)info);
+ if (info->m_className)
+ {
+ wxASSERT_MSG( ++nClass < nMaxClasses,
+ _T("an infinite loop detected - have you used IMPLEMENT_DYNAMIC_CLASS() twice (may be by linking some object module(s) twice)?") );
+ sm_classTable->Put(info->m_className, (wxObject *)info);
+ }
}
}
+}
-#if wxUSE_EXTENDED_RTTI == 0
- // Set base pointers for each wxClassInfo
+void wxClassInfo::CleanUpClasses()
+{
+ delete wxClassInfo::sm_classTable;
+ wxClassInfo::sm_classTable = NULL;
+}
- for(info = sm_first; info; info = info->m_next)
+void wxClassInfo::Register()
+{
+ if ( sm_classTable )
{
- info->m_baseInfo1 = GetBaseByName(info->GetBaseClassName1());
- info->m_baseInfo2 = GetBaseByName(info->GetBaseClassName2());
+ sm_classTable->Put(m_className, (wxObject *)this);
}
-#endif
}
-void wxClassInfo::CleanUpClasses()
+void wxClassInfo::Unregister()
{
- delete wxClassInfo::sm_classTable;
- wxClassInfo::sm_classTable = NULL;
+ if ( sm_classTable )
+ {
+ sm_classTable->Delete(m_className);
+ }
}
wxObject *wxCreateDynamicObject(const wxChar *name)