]> git.saurik.com Git - wxWidgets.git/blame - include/wx/toplevel.h
Somehow, setting a tint color makes gauge work :/.
[wxWidgets.git] / include / wx / toplevel.h
CommitLineData
ec4f95c4
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: wx/toplevel.h
3// Purpose: declares wxTopLevelWindow class, the base class for all
4// top level windows (such as frames and dialogs)
7d9f12f3 5// Author: Vadim Zeitlin, Vaclav Slavik
ec4f95c4
VZ
6// Modified by:
7// Created: 06.08.01
ec4f95c4 8// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
77ffb593 9// Vaclav Slavik <vaclav@wxwidgets.org>
65571936 10// Licence: wxWindows licence
ec4f95c4
VZ
11///////////////////////////////////////////////////////////////////////////////
12
7d9f12f3
VS
13#ifndef _WX_TOPLEVEL_BASE_H_
14#define _WX_TOPLEVEL_BASE_H_
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
42b0d8b9 20#include "wx/nonownedwnd.h"
f618020a 21#include "wx/iconbndl.h"
3e040a29 22#include "wx/weakref.h"
7d9f12f3 23
63ec432b 24// the default names for various classes
53a2db12 25extern WXDLLIMPEXP_DATA_CORE(const char) wxFrameNameStr[];
7d9f12f3 26
b5dbe15d 27class WXDLLIMPEXP_FWD_CORE wxTopLevelWindowBase;
7d9f12f3 28
b22d16ad
VS
29// ----------------------------------------------------------------------------
30// constants
31// ----------------------------------------------------------------------------
32
f16fad90 33/*
d13b34d3 34 Summary of the bits used (some of them are defined in wx/frame.h and
f16fad90
VZ
35 wx/dialog.h and not here):
36
37 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
38 |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
39 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
40 | | | | | | | | | | | | | | | |
654e3246 41 | | | | | | | | | | | | | | | \_ wxCENTRE
f16fad90
VZ
42 | | | | | | | | | | | | | | \____ wxFRAME_NO_TASKBAR
43 | | | | | | | | | | | | | \_______ wxFRAME_TOOL_WINDOW
44 | | | | | | | | | | | | \__________ wxFRAME_FLOAT_ON_PARENT
45 | | | | | | | | | | | \_____________ wxFRAME_SHAPED
32a925f8 46 | | | | | | | | | | \________________ wxDIALOG_NO_PARENT
f16fad90
VZ
47 | | | | | | | | | \___________________ wxRESIZE_BORDER
48 | | | | | | | | \______________________ wxTINY_CAPTION_VERT
32a925f8 49 | | | | | | | \_________________________
f16fad90
VZ
50 | | | | | | \____________________________ wxMAXIMIZE_BOX
51 | | | | | \_______________________________ wxMINIMIZE_BOX
52 | | | | \__________________________________ wxSYSTEM_MENU
53 | | | \_____________________________________ wxCLOSE_BOX
54 | | \________________________________________ wxMAXIMIZE
55 | \___________________________________________ wxMINIMIZE
56 \______________________________________________ wxSTAY_ON_TOP
57
58
59 Notice that the 8 lower bits overlap with wxCENTRE and the button selection
60 bits (wxYES, wxOK wxNO, wxCANCEL, wxAPPLY, wxCLOSE and wxNO_DEFAULT) which
61 can be combined with the dialog style for several standard dialogs and
62 hence shouldn't overlap with any styles which can be used for the dialogs.
654e3246 63 Additionally, wxCENTRE can be used with frames also.
f16fad90
VZ
64 */
65
8b5ef6cf
VZ
66// style common to both wxFrame and wxDialog
67#define wxSTAY_ON_TOP 0x8000
68#define wxICONIZE 0x4000
69#define wxMINIMIZE wxICONIZE
70#define wxMAXIMIZE 0x2000
e65ae1d3 71#define wxCLOSE_BOX 0x1000 // == wxHELP so can't be used with it
8b5ef6cf
VZ
72
73#define wxSYSTEM_MENU 0x0800
74#define wxMINIMIZE_BOX 0x0400
75#define wxMAXIMIZE_BOX 0x0200
7282b067
VZ
76
77#define wxTINY_CAPTION 0x0080 // clashes with wxNO_DEFAULT
e65ae1d3 78#define wxRESIZE_BORDER 0x0040 // == wxCLOSE
8b5ef6cf 79
7282b067
VZ
80#if WXWIN_COMPATIBILITY_2_8
81 // HORIZ and VERT styles are equivalent anyhow so don't use different names
82 // for them
83 #define wxTINY_CAPTION_HORIZ wxTINY_CAPTION
84 #define wxTINY_CAPTION_VERT wxTINY_CAPTION
85#endif
86
1c067fe3
WS
87#if WXWIN_COMPATIBILITY_2_6
88
89 // deprecated versions defined for compatibility reasons
90 #define wxRESIZE_BOX wxMAXIMIZE_BOX
91 #define wxTHICK_FRAME wxRESIZE_BORDER
92
93 // obsolete styles, unused any more
94 #define wxDIALOG_MODAL 0
95 #define wxDIALOG_MODELESS 0
96 #define wxNO_3D 0
97 #define wxUSER_COLOURS 0
98
99#endif // WXWIN_COMPATIBILITY_2_6
8b5ef6cf
VZ
100
101// default style
102//
103// under Windows CE (at least when compiling with eVC 4) we should create
104// top level windows without any styles at all for them to appear
105// "correctly", i.e. as full screen windows with a "hide" button (same as
106// "close" but round instead of squared and just hides the applications
107// instead of closing it) in the title bar
a9928e9d 108#if defined(__WXWINCE__)
cb719f2e
WS
109 #if defined(__SMARTPHONE__)
110 #define wxDEFAULT_FRAME_STYLE (wxMAXIMIZE)
a9928e9d 111 #elif defined(__WINCE_STANDARDSDK__)
cb719f2e
WS
112 #define wxDEFAULT_FRAME_STYLE (wxMAXIMIZE|wxCLOSE_BOX)
113 #else
30dfe2ff 114 #define wxDEFAULT_FRAME_STYLE (wxNO_BORDER)
cb719f2e 115 #endif
8b5ef6cf
VZ
116#else // !__WXWINCE__
117 #define wxDEFAULT_FRAME_STYLE \
118 (wxSYSTEM_MENU | \
119 wxRESIZE_BORDER | \
120 wxMINIMIZE_BOX | \
121 wxMAXIMIZE_BOX | \
122 wxCLOSE_BOX | \
123 wxCAPTION | \
124 wxCLIP_CHILDREN)
125#endif
126
127
7d9f12f3 128// Dialogs are created in a special way
21f4383a 129#define wxTOPLEVEL_EX_DIALOG 0x00000008
7d9f12f3
VS
130
131// Styles for ShowFullScreen
132// (note that wxTopLevelWindow only handles wxFULLSCREEN_NOBORDER and
133// wxFULLSCREEN_NOCAPTION; the rest is handled by wxTopLevelWindow)
b22d16ad
VS
134enum
135{
136 wxFULLSCREEN_NOMENUBAR = 0x0001,
137 wxFULLSCREEN_NOTOOLBAR = 0x0002,
138 wxFULLSCREEN_NOSTATUSBAR = 0x0004,
139 wxFULLSCREEN_NOBORDER = 0x0008,
140 wxFULLSCREEN_NOCAPTION = 0x0010,
d4597e13
VZ
141
142 wxFULLSCREEN_ALL = wxFULLSCREEN_NOMENUBAR | wxFULLSCREEN_NOTOOLBAR |
143 wxFULLSCREEN_NOSTATUSBAR | wxFULLSCREEN_NOBORDER |
b22d16ad
VS
144 wxFULLSCREEN_NOCAPTION
145};
146
dc92adaf
VZ
147// Styles for RequestUserAttention
148enum
149{
150 wxUSER_ATTENTION_INFO = 1,
151 wxUSER_ATTENTION_ERROR = 2
152};
153
ec4f95c4
VZ
154// ----------------------------------------------------------------------------
155// wxTopLevelWindow: a top level (as opposed to child) window
156// ----------------------------------------------------------------------------
157
35d6156b 158class WXDLLIMPEXP_CORE wxTopLevelWindowBase : public wxNonOwnedWindow
ec4f95c4
VZ
159{
160public:
7d9f12f3
VS
161 // construction
162 wxTopLevelWindowBase();
799ea011 163 virtual ~wxTopLevelWindowBase();
b22d16ad 164
7d9f12f3
VS
165 // top level wnd state
166 // --------------------
167
cb719f2e
WS
168 // maximize = true => maximize, otherwise - restore
169 virtual void Maximize(bool maximize = true) = 0;
7d9f12f3
VS
170
171 // undo Maximize() or Iconize()
172 virtual void Restore() = 0;
173
cb719f2e
WS
174 // iconize = true => iconize, otherwise - restore
175 virtual void Iconize(bool iconize = true) = 0;
7d9f12f3 176
cb719f2e 177 // return true if the frame is maximized
7d9f12f3
VS
178 virtual bool IsMaximized() const = 0;
179
979a0320
WS
180 // return true if the frame is always maximized
181 // due to native guidelines or current policy
182 virtual bool IsAlwaysMaximized() const;
183
cb719f2e 184 // return true if the frame is iconized
7d9f12f3
VS
185 virtual bool IsIconized() const = 0;
186
187 // get the frame icon
ea098413 188 wxIcon GetIcon() const;
f618020a
MB
189
190 // get the frame icons
191 const wxIconBundle& GetIcons() const { return m_icons; }
7d9f12f3 192
ea098413
VZ
193 // set the frame icon: implemented in terms of SetIcons()
194 void SetIcon(const wxIcon& icon);
f618020a
MB
195
196 // set the frame icons
ea098413 197 virtual void SetIcons(const wxIconBundle& icons) { m_icons = icons; }
7d9f12f3 198
c8e8ae85
VS
199 // maximize the window to cover entire screen
200 virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL) = 0;
ce00f59b 201
dbc7ceb9
KO
202 // shows the window, but doesn't activate it. If the base code is being run,
203 // it means the port doesn't implement this method yet and so alert the user.
ce00f59b 204 virtual void ShowWithoutActivating() {
dbc7ceb9
KO
205 wxFAIL_MSG("ShowWithoutActivating not implemented on this platform.");
206 }
d4597e13 207
cb719f2e 208 // return true if the frame is in fullscreen mode
c8e8ae85
VS
209 virtual bool IsFullScreen() const = 0;
210
ffd84c94
WS
211 // the title of the top level window: the text which the
212 // window shows usually at the top of the frame/dialog in dedicated bar
7d9f12f3 213 virtual void SetTitle(const wxString& title) = 0;
ec4f95c4 214 virtual wxString GetTitle() const = 0;
7d9f12f3 215
a43ec16b 216 // enable/disable close button [x]
03647350 217 virtual bool EnableCloseButton(bool WXUNUSED(enable) ) { return false; }
a43ec16b 218
dc92adaf
VZ
219 // Attracts the users attention to this window if the application is
220 // inactive (should be called when a background event occurs)
221 virtual void RequestUserAttention(int flags = wxUSER_ATTENTION_INFO);
9b141468 222
35ff90a0 223 // Is this the active frame (highlighted in the taskbar)?
dace99a4
VZ
224 //
225 // A TLW is active only if it contains the currently focused window.
226 virtual bool IsActive() { return IsDescendant(FindFocus()); }
171a1afe
VZ
227
228 // this function may be overridden to return false to allow closing the
229 // application even when this top level window is still open
230 //
231 // notice that the window is still closed prior to the application exit and
232 // so it can still veto it even if it returns false from here
233 virtual bool ShouldPreventAppExit() const { return true; }
234
dc92adaf 235
9b141468
WS
236#if defined(__SMARTPHONE__)
237 virtual void SetLeftMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL) = 0;
238 virtual void SetRightMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL) = 0;
239#endif // __SMARTPHONE__
240
1f464296
VZ
241 // centre the window on screen: this is just a shortcut
242 void CentreOnScreen(int dir = wxBOTH) { DoCentre(dir | wxCENTRE_ON_SCREEN); }
243 void CenterOnScreen(int dir = wxBOTH) { CentreOnScreen(dir); }
244
71a0f42d
VZ
245 // Get the default size for a new top level window. This is used when
246 // creating a wxTLW under some platforms if no explicit size given.
247 static wxSize GetDefaultSize();
248
6c20e8f8
VZ
249
250 // default item access: we have a permanent default item which is the one
251 // set by the user code but we may also have a temporary default item which
252 // would be chosen if the user pressed "Enter" now but the default action
253 // reverts to the "permanent" default as soon as this temporary default
254 // item loses focus
255
6c20e8f8
VZ
256 // get the default item, temporary or permanent
257 wxWindow *GetDefaultItem() const
258 { return m_winTmpDefault ? m_winTmpDefault : m_winDefault; }
259
260 // set the permanent default item, return the old default
261 wxWindow *SetDefaultItem(wxWindow *win)
262 { wxWindow *old = GetDefaultItem(); m_winDefault = win; return old; }
263
264 // return the temporary default item, can be NULL
265 wxWindow *GetTmpDefaultItem() const { return m_winTmpDefault; }
266
267 // set a temporary default item, SetTmpDefaultItem(NULL) should be called
268 // soon after a call to SetTmpDefaultItem(window), return the old default
269 wxWindow *SetTmpDefaultItem(wxWindow *win)
270 { wxWindow *old = GetDefaultItem(); m_winTmpDefault = win; return old; }
271
7d9f12f3
VS
272 // implementation only from now on
273 // -------------------------------
274
275 // override some base class virtuals
276 virtual bool Destroy();
cb719f2e 277 virtual bool IsTopLevel() const { return true; }
6e92c299 278 virtual bool IsTopNavigationDomain() const { return true; }
9c72cf76 279 virtual bool IsVisible() const { return IsShown(); }
7d9f12f3
VS
280
281 // event handlers
282 void OnCloseWindow(wxCloseEvent& event);
5e62d4a5 283 void OnSize(wxSizeEvent& WXUNUSED(event)) { DoLayout(); }
7d9f12f3 284
0bba37f5
DE
285 // Get rect to be used to center top-level children
286 virtual void GetRectForTopLevelChildren(int *x, int *y, int *w, int *h);
287
7d9f12f3
VS
288 // this should go away, but for now it's called from docview.cpp,
289 // so should be there for all platforms
290 void OnActivate(wxActivateEvent &WXUNUSED(event)) { }
291
e39af974
JS
292 // do the window-specific processing after processing the update event
293 virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ;
294
cda5834e
RR
295 // a different API for SetSizeHints
296 virtual void SetMinSize(const wxSize& minSize);
297 virtual void SetMaxSize(const wxSize& maxSize);
ce00f59b 298
ebf7d5c4
KO
299 virtual void OSXSetModified(bool modified) { m_modified = modified; }
300 virtual bool OSXIsModified() const { return m_modified; }
cda5834e 301
6a0e4ead
VZ
302 virtual void SetRepresentedFilename(const wxString& WXUNUSED(filename)) { }
303
95316a3f
VZ
304#if wxUSE_MENUS || wxUSE_TOOLBAR
305 // show help text for the currently selected menu or toolbar item
306 // (typically in the status bar) or hide it and restore the status bar text
307 // originally shown before the menu was opened if show == false
308 virtual void DoGiveHelp(const wxString& WXUNUSED(text), bool WXUNUSED(show)) {}
309#endif
310
3498362e 311protected:
7d9f12f3
VS
312 // the frame client to screen translation should take account of the
313 // toolbar which may shift the origin of the client area
314 virtual void DoClientToScreen(int *x, int *y) const;
315 virtual void DoScreenToClient(int *x, int *y) const;
316
1f464296
VZ
317 // add support for wxCENTRE_ON_SCREEN
318 virtual void DoCentre(int dir);
319
3c81c9aa
VZ
320 // no need to do client to screen translation to get our position in screen
321 // coordinates: this is already the case
322 virtual void DoGetScreenPosition(int *x, int *y) const
323 {
74af7bcf 324 DoGetPosition(x, y);
3c81c9aa 325 }
1f464296 326
1cbee0b4
VZ
327 // test whether this window makes part of the frame
328 // (menubar, toolbar and statusbar are excluded from automatic layout)
329 virtual bool IsOneOfBars(const wxWindow *WXUNUSED(win)) const
cb719f2e 330 { return false; }
1cbee0b4 331
65afac3f 332 // check if we should exit the program after deleting this window
5c363878 333 bool IsLastBeforeExit() const;
1cbee0b4 334
cb719f2e
WS
335 // send the iconize event, return true if processed
336 bool SendIconizeEvent(bool iconized = true);
7d9f12f3 337
5e62d4a5
VZ
338 // do TLW-specific layout: we resize our unique child to fill the entire
339 // client area
340 void DoLayout();
341
cb719f2e
WS
342 static int WidthDefault(int w) { return w == wxDefaultCoord ? GetDefaultSize().x : w; }
343 static int HeightDefault(int h) { return h == wxDefaultCoord ? GetDefaultSize().y : h; }
66202a7e 344
f8ab85ae 345
7d9f12f3 346 // the frame icon
f618020a 347 wxIconBundle m_icons;
7d9f12f3 348
6c20e8f8 349 // a default window (usually a button) or NULL
3e040a29 350 wxWindowRef m_winDefault;
6c20e8f8
VZ
351
352 // a temporary override of m_winDefault, use the latter if NULL
3e040a29 353 wxWindowRef m_winTmpDefault;
ce00f59b 354
efb2fa41 355 bool m_modified;
6c20e8f8 356
c0c133e1 357 wxDECLARE_NO_COPY_CLASS(wxTopLevelWindowBase);
7d9f12f3 358 DECLARE_EVENT_TABLE()
ec4f95c4
VZ
359};
360
7d9f12f3
VS
361
362// include the real class declaration
bd362275 363#if defined(__WXMSW__)
82c9f85c
VZ
364 #include "wx/msw/toplevel.h"
365 #define wxTopLevelWindowNative wxTopLevelWindowMSW
1be7a35c 366#elif defined(__WXGTK20__)
7d9f12f3
VS
367 #include "wx/gtk/toplevel.h"
368 #define wxTopLevelWindowNative wxTopLevelWindowGTK
1be7a35c
MR
369#elif defined(__WXGTK__)
370 #include "wx/gtk1/toplevel.h"
371 #define wxTopLevelWindowNative wxTopLevelWindowGTK
83df96d6
JS
372#elif defined(__WXX11__)
373 #include "wx/x11/toplevel.h"
374 #define wxTopLevelWindowNative wxTopLevelWindowX11
b3c86150
VS
375#elif defined(__WXDFB__)
376 #include "wx/dfb/toplevel.h"
377 #define wxTopLevelWindowNative wxTopLevelWindowDFB
93b4dc4b 378#elif defined(__WXMAC__)
ef0e9220 379 #include "wx/osx/toplevel.h"
93b4dc4b 380 #define wxTopLevelWindowNative wxTopLevelWindowMac
e64df9bc
DE
381#elif defined(__WXCOCOA__)
382 #include "wx/cocoa/toplevel.h"
383 #define wxTopLevelWindowNative wxTopLevelWindowCocoa
c9782ca3
DW
384#elif defined(__WXPM__)
385 #include "wx/os2/toplevel.h"
386 #define wxTopLevelWindowNative wxTopLevelWindowOS2
798a4529
MB
387#elif defined(__WXMOTIF__)
388 #include "wx/motif/toplevel.h"
389 #define wxTopLevelWindowNative wxTopLevelWindowMotif
7d9f12f3
VS
390#endif
391
392#ifdef __WXUNIVERSAL__
393 #include "wx/univ/toplevel.h"
394#else // !__WXUNIVERSAL__
77497ea3
VZ
395 class WXDLLIMPEXP_CORE wxTopLevelWindow : public wxTopLevelWindowNative
396 {
397 public:
398 // construction
399 wxTopLevelWindow() { }
400 wxTopLevelWindow(wxWindow *parent,
401 wxWindowID winid,
402 const wxString& title,
403 const wxPoint& pos = wxDefaultPosition,
404 const wxSize& size = wxDefaultSize,
405 long style = wxDEFAULT_FRAME_STYLE,
406 const wxString& name = wxFrameNameStr)
407 : wxTopLevelWindowNative(parent, winid, title,
408 pos, size, style, name)
7d9f12f3 409 {
77497ea3 410 }
7d9f12f3 411
77497ea3
VZ
412 DECLARE_DYNAMIC_CLASS_NO_COPY(wxTopLevelWindow)
413 };
414#endif // __WXUNIVERSAL__/!__WXUNIVERSAL__
7d9f12f3
VS
415
416#endif // _WX_TOPLEVEL_BASE_H_