]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/qt/app.cpp
should fix compilation for BC++
[wxWidgets.git] / src / qt / app.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: app.cpp
3// Purpose: wxApp
4// Author: AUTHOR
5// Modified by:
6// Created: ??/??/98
7// RCS-ID: $Id$
8// Copyright: (c) AUTHOR
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "app.h"
14#endif
15
16#include "wx/frame.h"
17#include "wx/app.h"
18#include "wx/utils.h"
19#include "wx/gdicmn.h"
20#include "wx/pen.h"
21#include "wx/brush.h"
22#include "wx/cursor.h"
23#include "wx/icon.h"
24#include "wx/palette.h"
25#include "wx/dc.h"
26#include "wx/dialog.h"
27#include "wx/msgdlg.h"
28#include "wx/log.h"
29#include "wx/module.h"
30
31#if wxUSE_WX_RESOURCES
32#include "wx/resource.h"
33#endif
34
35#include <string.h>
36
37#if defined(__WIN95__) && !defined(__GNUWIN32__)
38extern char *wxBuffer;
39extern wxList wxPendingDelete;
40
41wxApp *wxTheApp = NULL;
42
43#if !USE_SHARED_LIBRARY
44IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
45BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
46 EVT_IDLE(wxApp::OnIdle)
47END_EVENT_TABLE()
48#endif
49
50long wxApp::sm_lastMessageTime = 0;
51
52void wxApp::CommonInit()
53{
54#ifdef __WXMSW__
55 wxBuffer = new char[1500];
56#else
57 wxBuffer = new char[BUFSIZ + 512];
58#endif
59
60 wxClassInfo::InitializeClasses();
61
62 wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
63 wxTheColourDatabase->Initialize();
64 wxInitializeStockObjects();
65
66#if wxUSE_WX_RESOURCES
67 wxInitializeResourceSystem();
68#endif
69
70 // For PostScript printing
71#if wxUSE_POSTSCRIPT
72 wxInitializePrintSetupData();
73 wxThePrintPaperDatabase = new wxPrintPaperDatabase;
74 wxThePrintPaperDatabase->CreateDatabase();
75#endif
76
77 wxBitmap::InitStandardHandlers();
78
79 wxModule::RegisterModules();
80 wxASSERT( wxModule::InitializeModules() == TRUE );
81}
82
83void wxApp::CommonCleanUp()
84{
85 wxModule::CleanUpModules();
86
87#if wxUSE_WX_RESOURCES
88 wxCleanUpResourceSystem();
89#endif
90
91 wxDeleteStockObjects() ;
92
93 // Destroy all GDI lists, etc.
94 delete wxTheBrushList;
95 wxTheBrushList = NULL;
96
97 delete wxThePenList;
98 wxThePenList = NULL;
99
100 delete wxTheFontList;
101 wxTheFontList = NULL;
102
103 delete wxTheBitmapList;
104 wxTheBitmapList = NULL;
105
106 delete wxTheColourDatabase;
107 wxTheColourDatabase = NULL;
108
109#if wxUSE_POSTSCRIPT
110 wxInitializePrintSetupData(FALSE);
111 delete wxThePrintPaperDatabase;
112 wxThePrintPaperDatabase = NULL;
113#endif
114
115 wxBitmap::CleanUpHandlers();
116
117 delete[] wxBuffer;
118 wxBuffer = NULL;
119
120 // do it as the very last thing because everything else can log messages
121 delete wxLog::SetActiveTarget(NULL);
122}
123
124int wxEntry( int argc, char *argv[] )
125{
126 wxClassInfo::InitializeClasses();
127
128#if (WXDEBUG && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
129
130#if !defined(_WINDLL)
131 streambuf* sBuf = new wxDebugStreamBuf;
132#else
133 streambuf* sBuf = NULL;
134#endif
135 ostream* oStr = new ostream(sBuf) ;
136 wxDebugContext::SetStream(oStr, sBuf);
137
138#endif
139
140 if (!wxTheApp)
141 {
142 if (!wxApp::GetInitializerFunction())
143 {
144 printf( "wxWindows error: No initializer - use IMPLEMENT_APP macro.\n" );
145 return 0;
146 };
147
148 wxTheApp = (* wxApp::GetInitializerFunction()) ();
149 };
150
151 if (!wxTheApp)
152 {
153 printf( "wxWindows error: wxTheApp == NULL\n" );
154 return 0;
155 };
156
157 wxTheApp->argc = argc;
158 wxTheApp->argv = argv;
159
160 // TODO: your platform-specific initialization.
161
162 wxApp::CommonInit();
163
164 // GUI-specific initialization, such as creating an app context.
165 wxTheApp->OnInitGui();
166
167 // Here frames insert themselves automatically
168 // into wxTopLevelWindows by getting created
169 // in OnInit().
170
171 if (!wxTheApp->OnInit()) return 0;
172
173 wxTheApp->m_initialized = (wxTopLevelWindows.Number() > 0);
174
175 int retValue = 0;
176
177 if (wxTheApp->Initialized()) retValue = wxTheApp->OnRun();
178
179 wxTheApp->DeletePendingObjects();
180
181 wxTheApp->OnExit();
182
183 wxApp::CommonCleanUp();
184
185#if (WXDEBUG && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
186 // At this point we want to check if there are any memory
187 // blocks that aren't part of the wxDebugContext itself,
188 // as a special case. Then when dumping we need to ignore
189 // wxDebugContext, too.
190 if (wxDebugContext::CountObjectsLeft() > 0)
191 {
192 wxTrace("There were memory leaks.\n");
193 wxDebugContext::Dump();
194 wxDebugContext::PrintStatistics();
195 }
196 wxDebugContext::SetStream(NULL, NULL);
197#endif
198
199 return retValue;
200};
201
202// Static member initialization
203wxAppInitializerFunction wxApp::m_appInitFn = (wxAppInitializerFunction) NULL;
204
205wxApp::wxApp()
206{
207 m_topWindow = NULL;
208 wxTheApp = this;
209 m_className = "";
210 m_wantDebugOutput = TRUE ;
211 m_appName = "";
212 argc = 0;
213 argv = NULL;
214#ifdef __WXMSW__
215 m_printMode = wxPRINT_WINDOWS;
216#else
217 m_printMode = wxPRINT_POSTSCRIPT;
218#endif
219 m_exitOnFrameDelete = TRUE;
220 m_auto3D = TRUE;
221}
222
223bool wxApp::Initialized()
224{
225 if (GetTopWindow())
226 return TRUE;
227 else
228 return FALSE;
229}
230
231int wxApp::MainLoop()
232{
233 m_keepGoing = TRUE;
234
235/* TODO: implement your main loop here, calling ProcessIdle in idle time.
236 while (m_keepGoing)
237 {
238 while (!::PeekMessage(&s_currentMsg, 0, 0, 0, PM_NOREMOVE) &&
239 ProcessIdle()) {}
240 if (!DoMessage())
241 m_keepGoing = FALSE;
242 }
243*/
244
245 return 0;
246}
247
248// Returns TRUE if more time is needed.
249bool wxApp::ProcessIdle()
250{
251 wxIdleEvent event;
252 event.SetEventObject(this);
253 ProcessEvent(event);
254
255 return event.MoreRequested();
256}
257
258void wxApp::ExitMainLoop()
259{
260 m_keepGoing = FALSE;
261}
262
263// Is a message/event pending?
264bool wxApp::Pending()
265{
266/* TODO.
267 */
268 return FALSE;
269}
270
271// Dispatch a message.
272void wxApp::Dispatch()
273{
274/* TODO.
275 */
276}
277
278void wxApp::OnIdle(wxIdleEvent& event)
279{
280 static bool inOnIdle = FALSE;
281
282 // Avoid recursion (via ProcessEvent default case)
283 if (inOnIdle)
284 return;
285
286 inOnIdle = TRUE;
287
288 // 'Garbage' collection of windows deleted with Close().
289 DeletePendingObjects();
290
291 // flush the logged messages if any
292 wxLog *pLog = wxLog::GetActiveTarget();
293 if ( pLog != NULL && pLog->HasPendingMessages() )
294 pLog->Flush();
295
296 // Send OnIdle events to all windows
297 bool needMore = SendIdleEvents();
298
299 if (needMore)
300 event.RequestMore(TRUE);
301
302 inOnIdle = FALSE;
303}
304
305// Send idle event to all top-level windows
306bool wxApp::SendIdleEvents()
307{
308 bool needMore = FALSE;
309 wxNode* node = wxTopLevelWindows.First();
310 while (node)
311 {
312 wxWindow* win = (wxWindow*) node->Data();
313 if (SendIdleEvents(win))
314 needMore = TRUE;
315
316 node = node->Next();
317 }
318 return needMore;
319}
320
321// Send idle event to window and all subwindows
322bool wxApp::SendIdleEvents(wxWindow* win)
323{
324 bool needMore = FALSE;
325
326 wxIdleEvent event;
327 event.SetEventObject(win);
328 win->ProcessEvent(event);
329
330 if (event.MoreRequested())
331 needMore = TRUE;
332
333 wxNode* node = win->GetChildren()->First();
334 while (node)
335 {
336 wxWindow* win = (wxWindow*) node->Data();
337 if (SendIdleEvents(win))
338 needMore = TRUE;
339
340 node = node->Next();
341 }
342 return needMore ;
343}
344
345void wxApp::DeletePendingObjects()
346{
347 wxNode *node = wxPendingDelete.First();
348 while (node)
349 {
350 wxObject *obj = (wxObject *)node->Data();
351
352 delete obj;
353
354 if (wxPendingDelete.Member(obj))
355 delete node;
356
357 // Deleting one object may have deleted other pending
358 // objects, so start from beginning of list again.
359 node = wxPendingDelete.First();
360 }
361}
362
363wxLog* wxApp::CreateLogTarget()
364{
365 return new wxLogGui;
366}
367
368wxWindow* wxApp::GetTopWindow() const
369{
370 if (m_topWindow)
371 return m_topWindow;
372 else if (wxTopLevelWindows.Number() > 0)
373 return (wxWindow*) wxTopLevelWindows.First()->Data();
374 else
375 return NULL;
376}
377
378void wxExit()
379{
380 wxApp::CommonCleanUp();
381/*
382 * TODO: Exit in some platform-specific way. Not recommended that the app calls this:
383 * only for emergencies.
384 */
385}
386
387// Yield to other processes
388bool wxYield()
389{
390 /*
391 * TODO
392 */
393 return TRUE;
394}
395