]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/module.cpp
Always send an erase event to satisfy some users...
[wxWidgets.git] / src / common / module.cpp
index bd2b82d782331cd235936b87fcc8902b53def181..0853642073368cc371618a7e08f28627da543858 100644 (file)
 #endif
 
 #include "wx/module.h"
 #endif
 
 #include "wx/module.h"
+#include "wx/hash.h"
+#include "wx/listimpl.cpp"
+
+#ifdef __SALFORDC__
+void wxwxModuleListNode::DeleteData()
+{
+    delete (_WX_LIST_ITEM_TYPE_wxModuleList *)GetData();
+}
+#else
+WX_DEFINE_LIST(wxModuleList);
+#endif
 
 IMPLEMENT_CLASS(wxModule, wxObject)
 
 
 IMPLEMENT_CLASS(wxModule, wxObject)
 
-wxList wxModule::m_modules;
+wxModuleList wxModule::m_modules;
 
 void wxModule::RegisterModule(wxModule* module)
 {
 
 void wxModule::RegisterModule(wxModule* module)
 {
-  m_modules.Append(module);
+    m_modules.Append(module);
+}
+
+void wxModule::UnregisterModule(wxModule* module)
+{
+    m_modules.DeleteObject(module);
 }
 
 // Collect up all module-derived classes, create an instance of each,
 // and register them.
 }
 
 // Collect up all module-derived classes, create an instance of each,
 // and register them.
-bool wxModule::RegisterModules(void)
+void wxModule::RegisterModules()
 {
 {
-    wxClassInfo* classInfo = wxClassInfo::first;
-    while (classInfo)
+    wxNode *node;
+    wxClassInfo* classInfo;
+
+    wxClassInfo::sm_classTable->BeginFind();
+    node = wxClassInfo::sm_classTable->Next();
+    while (node)
     {
     {
-        if ((classInfo != (& (wxModule::classwxModule))) &&
-            classInfo->IsKindOf(CLASSINFO(wxModule)))
+        classInfo = (wxClassInfo *)node->Data();
+        if ( classInfo->IsKindOf(CLASSINFO(wxModule)) &&
+            (classInfo != (& (wxModule::sm_classwxModule))) )
         {
         {
-            wxModule* module = (wxModule*) classInfo->CreateObject();
+            wxModule* module = (wxModule *)classInfo->CreateObject();
             RegisterModule(module);
         }
             RegisterModule(module);
         }
-        classInfo = classInfo->next;
+        node = wxClassInfo::sm_classTable->Next();
     }
     }
-    return TRUE;
 }
 
 }
 
-bool wxModule::InitializeModules(void)
+bool wxModule::InitializeModules()
 {
 {
-  // Initialize user-defined modules
-    for (wxNode *node = m_modules.First(); node; node = node->Next())
+    // Initialize user-defined modules
+    wxModuleList::Node *node;
+    for ( node = m_modules.GetFirst(); node; node = node->GetNext() )
     {
     {
-      if (!((wxModule*)(node->Data()))->Init())
-        return FALSE;
+        if ( !node->GetData()->Init() )
+        {
+            // clean up already initialized modules - process in reverse order
+            wxModuleList::Node *n;
+            for ( n = node->GetPrevious(); n; n = n->GetPrevious() )
+            {
+                n->GetData()->OnExit();
+            }
+
+            return FALSE;
+        }
     }
     }
+
     return TRUE;
 }
 
     return TRUE;
 }
 
-void wxModule::CleanUpModules(void)
+void wxModule::CleanUpModules()
 {
 {
-  // Cleanup user-defined modules
-    for(wxNode* node = m_modules.Last(); node; node = node->Previous())
+    // Cleanup user-defined modules
+    wxModuleList::Node *node;
+    for ( node = m_modules.GetFirst(); node; node = node->GetNext() )
     {
     {
-      ((wxModule*)(node->Data()))->Exit();
-      delete (wxModule*)(node->Data());
+        node->GetData()->Exit();
     }
     }
+
+    m_modules.DeleteContents(TRUE);
     m_modules.Clear();
 }
 
     m_modules.Clear();
 }