]> git.saurik.com Git - wxWidgets.git/blame - src/common/appcmn.cpp
Check for null pointer.
[wxWidgets.git] / src / common / appcmn.cpp
CommitLineData
72cdf4c9
VZ
1/////////////////////////////////////////////////////////////////////////////
2// Name: common/appcmn.cpp
e2478fde 3// Purpose: wxAppConsole and wxAppBase methods common to all platforms
72cdf4c9
VZ
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 18.10.99
7// RCS-ID: $Id$
8// Copyright: (c) Vadim Zeitlin
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ---------------------------------------------------------------------------
17// headers
18// ---------------------------------------------------------------------------
19
20#ifdef __GNUG__
21 #pragma implementation "appbase.h"
22#endif
23
24// For compilers that support precompilation, includes "wx.h".
25#include "wx/wxprec.h"
26
27#if defined(__BORLANDC__)
28 #pragma hdrstop
29#endif
30
31#ifndef WX_PRECOMP
32 #include "wx/app.h"
b2e972ec 33 #include "wx/bitmap.h"
bf188f1a 34 #include "wx/intl.h"
e87271f3 35 #include "wx/list.h"
46446cc2 36 #include "wx/log.h"
e2478fde 37 #include "wx/msgdlg.h"
b3dfbbc9
MB
38 #include "wx/bitmap.h"
39 #include "wx/confbase.h"
72cdf4c9
VZ
40#endif
41
e2478fde
VZ
42#include "wx/apptrait.h"
43#if wxUSE_FONTMAP
44 #include "wx/fontmap.h"
45#endif // wxUSE_FONTMAP
46#include "wx/msgout.h"
72cdf4c9 47#include "wx/thread.h"
bebc39e3 48#include "wx/utils.h"
a5f1fd3e 49
e2478fde
VZ
50// ============================================================================
51// wxAppBase implementation
52// ============================================================================
d54598dd 53
bf188f1a 54// ----------------------------------------------------------------------------
94826170 55// initialization
bf188f1a
VZ
56// ----------------------------------------------------------------------------
57
090a6d7a 58wxAppBase::wxAppBase()
697c5f51 59{
1e6feb95
VZ
60 m_topWindow = (wxWindow *)NULL;
61 m_useBestVisual = FALSE;
1e6feb95 62 m_isActive = TRUE;
1cbee0b4
VZ
63
64 // We don't want to exit the app if the user code shows a dialog from its
65 // OnInit() -- but this is what would happen if we set m_exitOnFrameDelete
66 // to Yes initially as this dialog would be the last top level window.
67 // OTOH, if we set it to No initially we'll have to overwrite it with Yes
68 // when we enter our OnRun() because we do want the default behaviour from
69 // then on. But this would be a problem if the user code calls
70 // SetExitOnFrameDelete(FALSE) from OnInit().
71 //
72 // So we use the special "Later" value which is such that
73 // GetExitOnFrameDelete() returns FALSE for it but which we know we can
74 // safely (i.e. without losing the effect of the users SetExitOnFrameDelete
75 // call) overwrite in OnRun()
76 m_exitOnFrameDelete = Later;
1e6feb95
VZ
77}
78
05e2b077 79bool wxAppBase::Initialize(int& argc, wxChar **argv)
94826170
VZ
80{
81 if ( !wxAppConsole::Initialize(argc, argv) )
82 return false;
83
94826170
VZ
84#if wxUSE_THREADS
85 wxPendingEventsLocker = new wxCriticalSection;
86#endif
87
88 wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
89 wxTheColourDatabase->Initialize();
90
91 wxInitializeStockLists();
92 wxInitializeStockObjects();
93
94 wxBitmap::InitStandardHandlers();
95
96 return true;
97}
98
99// ----------------------------------------------------------------------------
100// cleanup
101// ----------------------------------------------------------------------------
102
799ea011
GD
103wxAppBase::~wxAppBase()
104{
105 // this destructor is required for Darwin
106}
107
94826170
VZ
108void wxAppBase::CleanUp()
109{
110 // one last chance for pending objects to be cleaned up
111 DeletePendingObjects();
112
113 wxBitmap::CleanUpHandlers();
114
115 wxDeleteStockObjects();
116
117 wxDeleteStockLists();
118
119 delete wxTheColourDatabase;
120 wxTheColourDatabase = NULL;
121
122#if wxUSE_THREADS
123 delete wxPendingEvents;
124 wxPendingEvents = NULL;
125
126 delete wxPendingEventsLocker;
127 wxPendingEventsLocker = NULL;
128
129#if wxUSE_VALIDATORS
130 // If we don't do the following, we get an apparent memory leak.
131 ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
132#endif // wxUSE_VALIDATORS
133#endif // wxUSE_THREADS
134}
135
136// ----------------------------------------------------------------------------
137// OnXXX() hooks
138// ----------------------------------------------------------------------------
139
1e6feb95
VZ
140bool wxAppBase::OnInitGui()
141{
142#ifdef __WXUNIVERSAL__
bf188f1a 143 if ( !wxTheme::Get() && !wxTheme::CreateDefault() )
1e6feb95
VZ
144 return FALSE;
145#endif // __WXUNIVERSAL__
146
147 return TRUE;
148}
1e6feb95 149
1cbee0b4
VZ
150int wxAppBase::OnRun()
151{
152 // see the comment in ctor: if the initial value hasn't been changed, use
153 // the default Yes from now on
154 if ( m_exitOnFrameDelete == Later )
155 {
156 m_exitOnFrameDelete = Yes;
157 }
158 //else: it has been changed, assume the user knows what he is doing
159
160 return MainLoop();
161}
162
e2478fde 163void wxAppBase::Exit()
1e6feb95 164{
e2478fde 165 ExitMainLoop();
1e6feb95
VZ
166}
167
e2478fde 168wxAppTraits *wxAppBase::CreateTraits()
a69be60b 169{
e2478fde 170 return wxAppTraits::CreateGUI();
72cdf4c9
VZ
171}
172
1e6feb95
VZ
173// ----------------------------------------------------------------------------
174// misc
175// ----------------------------------------------------------------------------
176
6e169cf3 177void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus))
7beba2fc 178{
66dfed9b
VZ
179 if ( active == m_isActive )
180 return;
181
1e6feb95 182 m_isActive = active;
66dfed9b
VZ
183
184 wxActivateEvent event(wxEVT_ACTIVATE_APP, active);
185 event.SetEventObject(this);
186
187 (void)ProcessEvent(event);
7beba2fc 188}
1e6feb95 189
94826170
VZ
190void wxAppBase::DeletePendingObjects()
191{
192 wxNode *node = wxPendingDelete.GetFirst();
193 while (node)
194 {
195 wxObject *obj = node->GetData();
196
197 delete obj;
198
199 if (wxPendingDelete.Member(obj))
200 delete node;
201
202 // Deleting one object may have deleted other pending
203 // objects, so start from beginning of list again.
204 node = wxPendingDelete.GetFirst();
205 }
206}
207
bf188f1a 208// ----------------------------------------------------------------------------
e2478fde 209// wxGUIAppTraitsBase
bf188f1a
VZ
210// ----------------------------------------------------------------------------
211
bf188f1a 212#if wxUSE_LOG
bf188f1a 213
e2478fde
VZ
214wxLog *wxGUIAppTraitsBase::CreateLogTarget()
215{
216 return new wxLogGui;
bf188f1a
VZ
217}
218
bf188f1a
VZ
219#endif // wxUSE_LOG
220
e2478fde 221wxMessageOutput *wxGUIAppTraitsBase::CreateMessageOutput()
bf188f1a 222{
e2478fde
VZ
223 // The standard way of printing help on command line arguments (app --help)
224 // is (according to common practice):
225 // - console apps: to stderr (on any platform)
226 // - GUI apps: stderr on Unix platforms (!)
227 // message box under Windows and others
228#ifdef __UNIX__
229 return new wxMessageOutputStderr;
230#else // !__UNIX__
231 // wxMessageOutputMessageBox doesn't work under Motif
232 #ifdef __WXMOTIF__
233 return new wxMessageOutputLog;
234 #else
235 return new wxMessageOutputMessageBox;
236 #endif
237#endif // __UNIX__/!__UNIX__
bf188f1a
VZ
238}
239
e2478fde 240#if wxUSE_FONTMAP
bf188f1a 241
e2478fde
VZ
242wxFontMapper *wxGUIAppTraitsBase::CreateFontMapper()
243{
244 return new wxFontMapper;
bf188f1a
VZ
245}
246
e2478fde 247#endif // wxUSE_FONTMAP
bf188f1a 248
090a6d7a 249#ifdef __WXDEBUG__
e6e6fcc9 250
e2478fde
VZ
251bool wxGUIAppTraitsBase::ShowAssertDialog(const wxString& msg)
252{
253 // under MSW we prefer to use the base class version using ::MessageBox()
254 // even if wxMessageBox() is available because it has less chances to
255 // double fault our app than our wxMessageBox()
256#if defined(__WXMSW__) || !wxUSE_MSGDLG
257 return wxAppTraitsBase::ShowAssertDialog(msg);
258#else // wxUSE_MSGDLG
259 // this message is intentionally not translated -- it is for
260 // developpers only
261 wxString msgDlg(msg);
262 msgDlg += wxT("\nDo you want to stop the program?\n")
263 wxT("You can also choose [Cancel] to suppress ")
264 wxT("further warnings.");
265
266 switch ( wxMessageBox(msgDlg, wxT("wxWindows Debug Alert"),
267 wxYES_NO | wxCANCEL | wxICON_STOP ) )
268 {
269 case wxYES:
270 wxTrap();
271 break;
090a6d7a 272
e2478fde
VZ
273 case wxCANCEL:
274 // no more asserts
275 return true;
a5f1fd3e 276
e2478fde 277 //case wxNO: nothing to do
090a6d7a 278 }
090a6d7a 279
e2478fde
VZ
280 return false;
281#endif // !wxUSE_MSGDLG/wxUSE_MSGDLG
a5f1fd3e
VZ
282}
283
e2478fde
VZ
284#endif // __WXDEBUG__
285
286bool wxGUIAppTraitsBase::HasStderr()
a5f1fd3e 287{
e2478fde
VZ
288 // we consider that under Unix stderr always goes somewhere, even if the
289 // user doesn't always see it under GUI desktops
290#ifdef __UNIX__
291 return true;
a5f1fd3e 292#else
e2478fde 293 return false;
a5f1fd3e 294#endif
a5f1fd3e
VZ
295}
296
e2478fde 297void wxGUIAppTraitsBase::ScheduleForDestroy(wxObject *object)
a5f1fd3e 298{
e2478fde
VZ
299 if ( !wxPendingDelete.Member(object) )
300 wxPendingDelete.Append(object);
a5f1fd3e
VZ
301}
302
e2478fde 303void wxGUIAppTraitsBase::RemoveFromPendingDelete(wxObject *object)
a5f1fd3e 304{
e2478fde 305 wxPendingDelete.DeleteObject(object);
a5f1fd3e
VZ
306}
307
e2478fde
VZ
308// ----------------------------------------------------------------------------
309// wxAppTraits
310// ----------------------------------------------------------------------------
311
312wxAppTraits *wxAppTraitsBase::CreateGUI()
a5f1fd3e 313{
e2478fde 314 return new wxGUIAppTraits;
a5f1fd3e
VZ
315}
316