Split this out from other changes to keep things sane..
[wxWidgets.git] / src / common / module.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: module.cpp
3 // Purpose: Modules initialization/destruction
4 // Author: Wolfram Gloger/adapted by Guilhem Lavaux
5 // Modified by:
6 // Created: 04/11/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Wolfram Gloger and Guilhem Lavaux
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "module.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #include "wx/module.h"
24 #include "wx/hash.h"
25 #include "wx/listimpl.cpp"
26
27 #ifdef __SALFORDC__
28 void wxwxModuleListNode::DeleteData()
29 {
30 delete (_WX_LIST_ITEM_TYPE_wxModuleList *)GetData();
31 }
32 #else
33 WX_DEFINE_LIST(wxModuleList);
34 #endif
35
36 IMPLEMENT_CLASS(wxModule, wxObject)
37
38 wxModuleList wxModule::m_modules;
39
40 void wxModule::RegisterModule(wxModule* module)
41 {
42 m_modules.Append(module);
43 }
44
45 void wxModule::UnregisterModule(wxModule* module)
46 {
47 m_modules.DeleteObject(module);
48 }
49
50 // Collect up all module-derived classes, create an instance of each,
51 // and register them.
52 void wxModule::RegisterModules()
53 {
54 wxNode *node;
55 wxClassInfo* classInfo;
56
57 wxClassInfo::sm_classTable->BeginFind();
58 node = wxClassInfo::sm_classTable->Next();
59 while (node)
60 {
61 classInfo = (wxClassInfo *)node->GetData();
62 if ( classInfo->IsKindOf(CLASSINFO(wxModule)) &&
63 (classInfo != (& (wxModule::sm_classwxModule))) )
64 {
65 wxModule* module = (wxModule *)classInfo->CreateObject();
66 RegisterModule(module);
67 }
68 node = wxClassInfo::sm_classTable->Next();
69 }
70 }
71
72 bool wxModule::InitializeModules()
73 {
74 // Initialize user-defined modules
75 wxModuleList::Node *node;
76 for ( node = m_modules.GetFirst(); node; node = node->GetNext() )
77 {
78 if ( !node->GetData()->Init() )
79 {
80 // clean up already initialized modules - process in reverse order
81 wxModuleList::Node *n;
82 for ( n = node->GetPrevious(); n; n = n->GetPrevious() )
83 {
84 n->GetData()->OnExit();
85 }
86
87 return FALSE;
88 }
89 }
90
91 return TRUE;
92 }
93
94 void wxModule::CleanUpModules()
95 {
96 // Cleanup user-defined modules
97 wxModuleList::Node *node;
98 for ( node = m_modules.GetFirst(); node; node = node->GetNext() )
99 {
100 node->GetData()->Exit();
101 }
102
103 m_modules.DeleteContents(TRUE);
104 m_modules.Clear();
105 }
106