]> git.saurik.com Git - wxWidgets.git/blame - src/palmos/app.cpp
activating ustring again
[wxWidgets.git] / src / palmos / app.cpp
CommitLineData
ffecfa5a 1/////////////////////////////////////////////////////////////////////////////
e2731512 2// Name: src/palmos/app.cpp
ffecfa5a 3// Purpose: wxApp
e2731512 4// Author: William Osborne - minimal working wxPalmOS port
ffecfa5a
JS
5// Modified by:
6// Created: 10/08/04
e2731512 7// RCS-ID: $Id$
ffecfa5a
JS
8// Copyright: (c) William Osborne
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ===========================================================================
13// declarations
14// ===========================================================================
15
16// ---------------------------------------------------------------------------
17// headers
18// ---------------------------------------------------------------------------
19
ffecfa5a
JS
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#if defined(__BORLANDC__)
24 #pragma hdrstop
25#endif
26
27#ifndef WX_PRECOMP
ad9835c9 28 #include "wx/dynarray.h"
ffecfa5a
JS
29 #include "wx/frame.h"
30 #include "wx/app.h"
31 #include "wx/utils.h"
32 #include "wx/gdicmn.h"
33 #include "wx/pen.h"
34 #include "wx/brush.h"
35 #include "wx/cursor.h"
36 #include "wx/icon.h"
37 #include "wx/palette.h"
38 #include "wx/dc.h"
39 #include "wx/dialog.h"
40 #include "wx/msgdlg.h"
41 #include "wx/intl.h"
3a3dde0d 42 #include "wx/crt.h"
ffecfa5a 43 #include "wx/log.h"
02761f6c 44 #include "wx/module.h"
ffecfa5a
JS
45#endif
46
47#include "wx/apptrait.h"
48#include "wx/filename.h"
ffecfa5a 49#include "wx/dynlib.h"
b46b1d59 50#include "wx/evtloop.h"
ffecfa5a
JS
51
52#if wxUSE_TOOLTIPS
53 #include "wx/tooltip.h"
54#endif // wxUSE_TOOLTIPS
55
56// We don't support OLE
57#undef wxUSE_OLE
58#define wxUSE_OLE 0
59
60#include <string.h>
61#include <ctype.h>
62
63// ---------------------------------------------------------------------------
64// global variables
65// ---------------------------------------------------------------------------
66
ffecfa5a
JS
67// NB: all "NoRedraw" classes must have the same names as the "normal" classes
68// with NR suffix - wxWindow::MSWCreate() supposes this
69const wxChar *wxCanvasClassName = wxT("wxWindowClass");
70const wxChar *wxCanvasClassNameNR = wxT("wxWindowClassNR");
71const wxChar *wxMDIFrameClassName = wxT("wxMDIFrameClass");
72const wxChar *wxMDIFrameClassNameNoRedraw = wxT("wxMDIFrameClassNR");
73const wxChar *wxMDIChildFrameClassName = wxT("wxMDIChildFrameClass");
74const wxChar *wxMDIChildFrameClassNameNoRedraw = wxT("wxMDIChildFrameClassNR");
75
76// ----------------------------------------------------------------------------
77// private functions
78// ----------------------------------------------------------------------------
79
80// ===========================================================================
81// wxGUIAppTraits implementation
82// ===========================================================================
83
84// private class which we use to pass parameters from BeforeChildWaitLoop() to
85// AfterChildWaitLoop()
86struct ChildWaitLoopData
87{
88 ChildWaitLoopData(wxWindowDisabler *wd_, wxWindow *winActive_)
89 {
90 wd = wd_;
91 winActive = winActive_;
92 }
93
94 wxWindowDisabler *wd;
95 wxWindow *winActive;
96};
97
98void *wxGUIAppTraits::BeforeChildWaitLoop()
99{
100 return NULL;
101}
102
103void wxGUIAppTraits::AlwaysYield()
104{
105 wxYield();
106}
107
108void wxGUIAppTraits::AfterChildWaitLoop(void *dataOrig)
109{
110}
111
112bool wxGUIAppTraits::DoMessageFromThreadWait()
113{
114 return false;
115}
116
8bb6b2c0 117wxPortId wxGUIAppTraits::GetToolkitVersion(int *majVer, int *minVer) const
ffecfa5a 118{
8bb6b2c0
VZ
119 // TODO: how to get PalmOS GUI system version ?
120 return wxPORT_PALMOS;
ffecfa5a
JS
121}
122
e2fc40b4 123#if wxUSE_TIMER
c2ca375c
VZ
124wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
125{
126 return new wxPalmOSTimerImpl(timer);
127};
e2fc40b4 128#endif // wxUSE_TIMER
b46b1d59 129
2ddff00c 130wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
b46b1d59
VZ
131{
132 return new wxEventLoop;
133}
ffecfa5a
JS
134// ===========================================================================
135// wxApp implementation
136// ===========================================================================
137
138int wxApp::m_nCmdShow = 0;
139
140// ---------------------------------------------------------------------------
141// wxWin macros
142// ---------------------------------------------------------------------------
143
144IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
145
146BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
ffecfa5a
JS
147 EVT_END_SESSION(wxApp::OnEndSession)
148 EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)
149END_EVENT_TABLE()
150
151// class to ensure that wxAppBase::CleanUp() is called if our Initialize()
152// fails
153class wxCallBaseCleanup
154{
155public:
156 wxCallBaseCleanup(wxApp *app) : m_app(app) { }
157 ~wxCallBaseCleanup() { if ( m_app ) m_app->wxAppBase::CleanUp(); }
158
159 void Dismiss() { m_app = NULL; }
160
161private:
162 wxApp *m_app;
163};
164
165//// Initialize
166bool wxApp::Initialize(int& argc, wxChar **argv)
167{
168 if ( !wxAppBase::Initialize(argc, argv) )
169 return false;
170
171 // ensure that base cleanup is done if we return too early
172 wxCallBaseCleanup callBaseCleanup(this);
173
174 wxWinHandleHash = new wxWinHashTable(wxKEY_INTEGER, 100);
175
176 callBaseCleanup.Dismiss();
177
178 return true;
179}
180
181// ---------------------------------------------------------------------------
182// RegisterWindowClasses
183// ---------------------------------------------------------------------------
184
185// TODO we should only register classes really used by the app. For this it
186// would be enough to just delay the class registration until an attempt
187// to create a window of this class is made.
188bool wxApp::RegisterWindowClasses()
189{
4055ed82 190 return true;
ffecfa5a
JS
191}
192
193// ---------------------------------------------------------------------------
194// UnregisterWindowClasses
195// ---------------------------------------------------------------------------
196
197bool wxApp::UnregisterWindowClasses()
198{
4055ed82 199 bool retval = true;
ffecfa5a
JS
200 return retval;
201}
202
203void wxApp::CleanUp()
204{
205 // all objects pending for deletion must be deleted first, otherwise we
206 // would crash when they use wxWinHandleHash (and UnregisterWindowClasses()
207 // call wouldn't succeed as long as any windows still exist), so call the
208 // base class method first and only then do our clean up
209 wxAppBase::CleanUp();
210
211 // for an EXE the classes are unregistered when it terminates but DLL may
212 // be loaded several times (load/unload/load) into the same process in
213 // which case the registration will fail after the first time if we don't
214 // unregister the classes now
215 UnregisterWindowClasses();
216
217 delete wxWinHandleHash;
218 wxWinHandleHash = NULL;
219}
220
221// ----------------------------------------------------------------------------
222// wxApp ctor/dtor
223// ----------------------------------------------------------------------------
224
225wxApp::wxApp()
226{
227 m_printMode = wxPRINT_WINDOWS;
228}
229
230wxApp::~wxApp()
231{
e2fc40b4
VZ
232 wxChar **argv_tmp;
233 argv_tmp = argv;
234 // src/palmos/main.cpp
ffecfa5a
JS
235 // our cmd line arguments are allocated inside wxEntry(HINSTANCE), they
236 // don't come from main(), so we have to free them
ffecfa5a
JS
237 while ( argc )
238 {
239 // m_argv elements were allocated by wxStrdup()
e2fc40b4
VZ
240 if (argv_tmp[--argc]) {
241 free((void *)(argv_tmp[--argc]));
242 }
ffecfa5a 243 }
ffecfa5a 244 // but m_argv itself -- using new[]
e2fc40b4
VZ
245 delete [] argv_tmp;
246 //argv = NULL;
ffecfa5a
JS
247}
248
249// ----------------------------------------------------------------------------
250// wxApp idle handling
251// ----------------------------------------------------------------------------
252
ffecfa5a
JS
253void wxApp::WakeUpIdle()
254{
255}
256
257// ----------------------------------------------------------------------------
258// other wxApp event hanlders
259// ----------------------------------------------------------------------------
260
261void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
262{
263 if (GetTopWindow())
4055ed82 264 GetTopWindow()->Close(true);
ffecfa5a
JS
265}
266
267// Default behaviour: close the application with prompts. The
268// user can veto the close, and therefore the end session.
269void wxApp::OnQueryEndSession(wxCloseEvent& event)
270{
271 if (GetTopWindow())
272 {
273 if (!GetTopWindow()->Close(!event.CanVeto()))
4055ed82 274 event.Veto(true);
ffecfa5a
JS
275 }
276}
277
278// ----------------------------------------------------------------------------
279// miscellaneous
280// ----------------------------------------------------------------------------
281
282/* static */
283int wxApp::GetComCtl32Version()
284{
285 return 0;
286}
287
288// Yield to incoming messages
289
290bool wxApp::Yield(bool onlyIfNeeded)
291{
292 return true;
293}
294
295#if wxUSE_EXCEPTIONS
296
297// ----------------------------------------------------------------------------
298// exception handling
299// ----------------------------------------------------------------------------
300
301bool wxApp::OnExceptionInMainLoop()
302{
303 return true;
304}
305
306#endif // wxUSE_EXCEPTIONS