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) 5 // Author: Vadim Zeitlin, Vaclav Slavik 6 // Modified by: 7 // Created: 06.08.01 8 // RCS-ID: $Id: toplevel.h 53135 2008-04-12 02:31:04Z VZ $ 9 // Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> 10 // Vaclav Slavik <vaclav@wxwidgets.org> 11 // Licence: wxWindows licence 12 /////////////////////////////////////////////////////////////////////////////// 13 14 #ifndef _WX_TOPLEVEL_BASE_H_ 15 #define _WX_TOPLEVEL_BASE_H_ 16 17 // ---------------------------------------------------------------------------- 18 // headers 19 // ---------------------------------------------------------------------------- 20 21 #include "wx/window.h" 22 #include "wx/iconbndl.h" 23 24 // the default names for various classes 25 extern WXDLLEXPORT_DATA(const wxChar) wxFrameNameStr[]; 26 27 class WXDLLIMPEXP_FWD_CORE wxTopLevelWindowBase; 28 29 // ---------------------------------------------------------------------------- 30 // constants 31 // ---------------------------------------------------------------------------- 32 33 // style common to both wxFrame and wxDialog 34 #define wxSTAY_ON_TOP 0x8000 35 #define wxICONIZE 0x4000 36 #define wxMINIMIZE wxICONIZE 37 #define wxMAXIMIZE 0x2000 38 #define wxCLOSE_BOX 0x1000 39 40 #define wxSYSTEM_MENU 0x0800 41 #define wxMINIMIZE_BOX 0x0400 42 #define wxMAXIMIZE_BOX 0x0200 43 #define wxTINY_CAPTION_HORIZ 0x0100 44 #define wxTINY_CAPTION_VERT 0x0080 45 #define wxRESIZE_BORDER 0x0040 46 47 #if WXWIN_COMPATIBILITY_2_6 48 49 // deprecated versions defined for compatibility reasons 50 #define wxRESIZE_BOX wxMAXIMIZE_BOX 51 #define wxTHICK_FRAME wxRESIZE_BORDER 52 53 // obsolete styles, unused any more 54 #define wxDIALOG_MODAL 0 55 #define wxDIALOG_MODELESS 0 56 #define wxNO_3D 0 57 #define wxUSER_COLOURS 0 58 59 #endif // WXWIN_COMPATIBILITY_2_6 60 61 // default style 62 // 63 // under Windows CE (at least when compiling with eVC 4) we should create 64 // top level windows without any styles at all for them to appear 65 // "correctly", i.e. as full screen windows with a "hide" button (same as 66 // "close" but round instead of squared and just hides the applications 67 // instead of closing it) in the title bar 68 #if defined(__WXWINCE__) 69 #if defined(__SMARTPHONE__) 70 #define wxDEFAULT_FRAME_STYLE (wxMAXIMIZE) 71 #elif defined(__WINCE_STANDARDSDK__) 72 #define wxDEFAULT_FRAME_STYLE (wxMAXIMIZE|wxCLOSE_BOX) 73 #else 74 #define wxDEFAULT_FRAME_STYLE (wxNO_BORDER) 75 #endif 76 #else // !__WXWINCE__ 77 #define wxDEFAULT_FRAME_STYLE \ 78 (wxSYSTEM_MENU | \ 79 wxRESIZE_BORDER | \ 80 wxMINIMIZE_BOX | \ 81 wxMAXIMIZE_BOX | \ 82 wxCLOSE_BOX | \ 83 wxCAPTION | \ 84 wxCLIP_CHILDREN) 85 #endif 86 87 88 // Dialogs are created in a special way 89 #define wxTOPLEVEL_EX_DIALOG 0x00000008 90 91 // Styles for ShowFullScreen 92 // (note that wxTopLevelWindow only handles wxFULLSCREEN_NOBORDER and 93 // wxFULLSCREEN_NOCAPTION; the rest is handled by wxTopLevelWindow) 94 enum 95 { 96 wxFULLSCREEN_NOMENUBAR = 0x0001, 97 wxFULLSCREEN_NOTOOLBAR = 0x0002, 98 wxFULLSCREEN_NOSTATUSBAR = 0x0004, 99 wxFULLSCREEN_NOBORDER = 0x0008, 100 wxFULLSCREEN_NOCAPTION = 0x0010, 101 102 wxFULLSCREEN_ALL = wxFULLSCREEN_NOMENUBAR | wxFULLSCREEN_NOTOOLBAR | 103 wxFULLSCREEN_NOSTATUSBAR | wxFULLSCREEN_NOBORDER | 104 wxFULLSCREEN_NOCAPTION 105 }; 106 107 // Styles for RequestUserAttention 108 enum 109 { 110 wxUSER_ATTENTION_INFO = 1, 111 wxUSER_ATTENTION_ERROR = 2 112 }; 113 114 // ---------------------------------------------------------------------------- 115 // wxTopLevelWindow: a top level (as opposed to child) window 116 // ---------------------------------------------------------------------------- 117 118 class WXDLLEXPORT wxTopLevelWindowBase : public wxWindow 119 { 120 public: 121 // construction 122 wxTopLevelWindowBase(); 123 virtual ~wxTopLevelWindowBase(); 124 125 // top level wnd state 126 // -------------------- 127 128 // maximize = true => maximize, otherwise - restore 129 virtual void Maximize(bool maximize = true) = 0; 130 131 // undo Maximize() or Iconize() 132 virtual void Restore() = 0; 133 134 // iconize = true => iconize, otherwise - restore 135 virtual void Iconize(bool iconize = true) = 0; 136 137 // return true if the frame is maximized 138 virtual bool IsMaximized() const = 0; 139 140 // return true if the frame is always maximized 141 // due to native guidelines or current policy 142 virtual bool IsAlwaysMaximized() const; 143 144 // return true if the frame is iconized 145 virtual bool IsIconized() const = 0; 146 147 // get the frame icon GetIcon()148 const wxIcon& GetIcon() const { return m_icons.GetIcon( -1 ); } 149 150 // get the frame icons GetIcons()151 const wxIconBundle& GetIcons() const { return m_icons; } 152 153 // set the frame icon SetIcon(const wxIcon & icon)154 virtual void SetIcon(const wxIcon& icon) { m_icons = wxIconBundle( icon ); } 155 156 // set the frame icons SetIcons(const wxIconBundle & icons)157 virtual void SetIcons(const wxIconBundle& icons ) { m_icons = icons; } 158 159 // maximize the window to cover entire screen 160 virtual bool ShowFullScreen(bool show, long style = wxFULLSCREEN_ALL) = 0; 161 162 // return true if the frame is in fullscreen mode 163 virtual bool IsFullScreen() const = 0; 164 165 // the title of the top level window: the text which the 166 // window shows usually at the top of the frame/dialog in dedicated bar 167 virtual void SetTitle(const wxString& title) = 0; 168 virtual wxString GetTitle() const = 0; 169 170 // enable/disable close button [x] EnableCloseButton(bool WXUNUSED (enable))171 virtual bool EnableCloseButton(bool WXUNUSED(enable) ) { return false; } 172 173 // Set the shape of the window to the given region. 174 // Returns true if the platform supports this feature (and the 175 // operation is successful.) SetShape(const wxRegion & WXUNUSED (region))176 virtual bool SetShape(const wxRegion& WXUNUSED(region)) { return false; } 177 178 // Attracts the users attention to this window if the application is 179 // inactive (should be called when a background event occurs) 180 virtual void RequestUserAttention(int flags = wxUSER_ATTENTION_INFO); 181 182 // Is this the active frame (highlighted in the taskbar)? IsActive()183 virtual bool IsActive() { return wxGetTopLevelParent(FindFocus()) == this; } 184 185 // this function may be overridden to return false to allow closing the 186 // application even when this top level window is still open 187 // 188 // notice that the window is still closed prior to the application exit and 189 // so it can still veto it even if it returns false from here ShouldPreventAppExit()190 virtual bool ShouldPreventAppExit() const { return true; } 191 192 193 #if defined(__SMARTPHONE__) 194 virtual void SetLeftMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL) = 0; 195 virtual void SetRightMenu(int id = wxID_ANY, const wxString& label = wxEmptyString, wxMenu *subMenu = NULL) = 0; 196 #endif // __SMARTPHONE__ 197 198 // centre the window on screen: this is just a shortcut 199 void CentreOnScreen(int dir = wxBOTH) { DoCentre(dir | wxCENTRE_ON_SCREEN); } 200 void CenterOnScreen(int dir = wxBOTH) { CentreOnScreen(dir); } 201 202 203 // default item access: we have a permanent default item which is the one 204 // set by the user code but we may also have a temporary default item which 205 // would be chosen if the user pressed "Enter" now but the default action 206 // reverts to the "permanent" default as soon as this temporary default 207 // item loses focus 208 209 // used to reset default if pointing to removed child 210 virtual void RemoveChild(wxWindowBase *child); 211 212 // get the default item, temporary or permanent GetDefaultItem()213 wxWindow *GetDefaultItem() const 214 { return m_winTmpDefault ? m_winTmpDefault : m_winDefault; } 215 216 // set the permanent default item, return the old default SetDefaultItem(wxWindow * win)217 wxWindow *SetDefaultItem(wxWindow *win) 218 { wxWindow *old = GetDefaultItem(); m_winDefault = win; return old; } 219 220 // return the temporary default item, can be NULL GetTmpDefaultItem()221 wxWindow *GetTmpDefaultItem() const { return m_winTmpDefault; } 222 223 // set a temporary default item, SetTmpDefaultItem(NULL) should be called 224 // soon after a call to SetTmpDefaultItem(window), return the old default SetTmpDefaultItem(wxWindow * win)225 wxWindow *SetTmpDefaultItem(wxWindow *win) 226 { wxWindow *old = GetDefaultItem(); m_winTmpDefault = win; return old; } 227 228 229 // implementation only from now on 230 // ------------------------------- 231 232 // override some base class virtuals 233 virtual bool Destroy(); IsTopLevel()234 virtual bool IsTopLevel() const { return true; } IsVisible()235 virtual bool IsVisible() const { return IsShown(); } 236 237 // event handlers 238 void OnCloseWindow(wxCloseEvent& event); OnSize(wxSizeEvent & WXUNUSED (event))239 void OnSize(wxSizeEvent& WXUNUSED(event)) { DoLayout(); } 240 241 // Get rect to be used to center top-level children 242 virtual void GetRectForTopLevelChildren(int *x, int *y, int *w, int *h); 243 244 // this should go away, but for now it's called from docview.cpp, 245 // so should be there for all platforms OnActivate(wxActivateEvent & WXUNUSED (event))246 void OnActivate(wxActivateEvent &WXUNUSED(event)) { } 247 248 // do the window-specific processing after processing the update event 249 virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ; 250 251 // a different API for SetSizeHints 252 virtual void SetMinSize(const wxSize& minSize); 253 virtual void SetMaxSize(const wxSize& maxSize); 254 255 // set size hints for "window manager" 256 virtual void DoSetSizeHints( int minW, int minH, 257 int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, 258 int incW = wxDefaultCoord, int incH = wxDefaultCoord ); 259 260 protected: 261 // the frame client to screen translation should take account of the 262 // toolbar which may shift the origin of the client area 263 virtual void DoClientToScreen(int *x, int *y) const; 264 virtual void DoScreenToClient(int *x, int *y) const; 265 266 // add support for wxCENTRE_ON_SCREEN 267 virtual void DoCentre(int dir); 268 269 // no need to do client to screen translation to get our position in screen 270 // coordinates: this is already the case DoGetScreenPosition(int * x,int * y)271 virtual void DoGetScreenPosition(int *x, int *y) const 272 { 273 DoGetPosition(x, y); 274 } 275 276 // test whether this window makes part of the frame 277 // (menubar, toolbar and statusbar are excluded from automatic layout) IsOneOfBars(const wxWindow * WXUNUSED (win))278 virtual bool IsOneOfBars(const wxWindow *WXUNUSED(win)) const 279 { return false; } 280 281 // check if we should exit the program after deleting this window 282 bool IsLastBeforeExit() const; 283 284 // send the iconize event, return true if processed 285 bool SendIconizeEvent(bool iconized = true); 286 287 // do TLW-specific layout: we resize our unique child to fill the entire 288 // client area 289 void DoLayout(); 290 291 // Get the default size for the new window if no explicit size given. If 292 // there are better default sizes then these can be changed, just as long 293 // as they are not too small for TLWs (and not larger than screen). 294 static wxSize GetDefaultSize(); WidthDefault(int w)295 static int WidthDefault(int w) { return w == wxDefaultCoord ? GetDefaultSize().x : w; } HeightDefault(int h)296 static int HeightDefault(int h) { return h == wxDefaultCoord ? GetDefaultSize().y : h; } 297 298 // the frame icon 299 wxIconBundle m_icons; 300 301 // a default window (usually a button) or NULL 302 wxWindow *m_winDefault; 303 304 // a temporary override of m_winDefault, use the latter if NULL 305 wxWindow *m_winTmpDefault; 306 307 DECLARE_NO_COPY_CLASS(wxTopLevelWindowBase) 308 DECLARE_EVENT_TABLE() 309 }; 310 311 312 // include the real class declaration 313 #if defined(__WXPALMOS__) 314 #include "wx/palmos/toplevel.h" 315 #define wxTopLevelWindowNative wxTopLevelWindowPalm 316 #elif defined(__WXMSW__) 317 #include "wx/msw/toplevel.h" 318 #define wxTopLevelWindowNative wxTopLevelWindowMSW 319 #elif defined(__WXGTK20__) 320 #include "wx/gtk/toplevel.h" 321 #define wxTopLevelWindowNative wxTopLevelWindowGTK 322 #elif defined(__WXGTK__) 323 #include "wx/gtk1/toplevel.h" 324 #define wxTopLevelWindowNative wxTopLevelWindowGTK 325 #elif defined(__WXX11__) 326 #include "wx/x11/toplevel.h" 327 #define wxTopLevelWindowNative wxTopLevelWindowX11 328 #elif defined(__WXMGL__) 329 #include "wx/mgl/toplevel.h" 330 #define wxTopLevelWindowNative wxTopLevelWindowMGL 331 #elif defined(__WXDFB__) 332 #include "wx/dfb/toplevel.h" 333 #define wxTopLevelWindowNative wxTopLevelWindowDFB 334 #elif defined(__WXMAC__) 335 #include "wx/mac/toplevel.h" 336 #define wxTopLevelWindowNative wxTopLevelWindowMac 337 #elif defined(__WXCOCOA__) 338 #include "wx/cocoa/toplevel.h" 339 #define wxTopLevelWindowNative wxTopLevelWindowCocoa 340 #elif defined(__WXPM__) 341 #include "wx/os2/toplevel.h" 342 #define wxTopLevelWindowNative wxTopLevelWindowOS2 343 #elif defined(__WXMOTIF__) 344 #include "wx/motif/toplevel.h" 345 #define wxTopLevelWindowNative wxTopLevelWindowMotif 346 #endif 347 348 #ifdef __WXUNIVERSAL__ 349 #include "wx/univ/toplevel.h" 350 #else // !__WXUNIVERSAL__ 351 #ifdef wxTopLevelWindowNative 352 class WXDLLEXPORT wxTopLevelWindow : public wxTopLevelWindowNative 353 { 354 public: 355 // construction wxTopLevelWindow()356 wxTopLevelWindow() { Init(); } 357 wxTopLevelWindow(wxWindow *parent, 358 wxWindowID winid, 359 const wxString& title, 360 const wxPoint& pos = wxDefaultPosition, 361 const wxSize& size = wxDefaultSize, 362 long style = wxDEFAULT_FRAME_STYLE, 363 const wxString& name = wxFrameNameStr) 364 { 365 Init(); 366 Create(parent, winid, title, pos, size, style, name); 367 } 368 369 DECLARE_DYNAMIC_CLASS_NO_COPY(wxTopLevelWindow) 370 }; 371 #endif // wxTopLevelWindowNative 372 #endif // __WXUNIVERSAL__/!__WXUNIVERSAL__ 373 374 375 #endif // _WX_TOPLEVEL_BASE_H_ 376