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