1///////////////////////////////////////////////////////////////////////////// 2// Name: src/mgl/toplevel.cpp 3// Purpose: 4// Author: Vaclav Slavik 5// Id: $Id: toplevel.cpp 43901 2006-12-10 15:53:29Z VS $ 6// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) 7// Licence: wxWindows licence 8///////////////////////////////////////////////////////////////////////////// 9 10// For compilers that support precompilation, includes "wx.h". 11#include "wx/wxprec.h" 12 13#ifdef __BORLANDC__ 14 #pragma hdrstop 15#endif 16 17// ============================================================================ 18// declarations 19// ============================================================================ 20 21// ---------------------------------------------------------------------------- 22// headers 23// ---------------------------------------------------------------------------- 24 25#include "wx/toplevel.h" 26 27#ifndef WX_PRECOMP 28 #include "wx/app.h" 29#endif // WX_PRECOMP 30 31#include "wx/mgl/private.h" 32 33// ---------------------------------------------------------------------------- 34// idle system 35// ---------------------------------------------------------------------------- 36 37extern int g_openDialogs; 38 39// ---------------------------------------------------------------------------- 40// event tables 41// ---------------------------------------------------------------------------- 42 43#ifndef __WXUNIVERSAL__ 44 IMPLEMENT_DYNAMIC_CLASS(wxTopLevelWindow, wxWindow) 45#endif 46 47 48// ============================================================================ 49// implementation 50// ============================================================================ 51 52void wxTopLevelWindowMGL::Init() 53{ 54 m_isShown = false; 55 m_isIconized = false; 56 m_isMaximized = false; 57 m_fsIsShowing = false; 58 m_sizeSet = false; 59} 60 61bool wxTopLevelWindowMGL::Create(wxWindow *parent, 62 wxWindowID id, 63 const wxString& title, 64 const wxPoint& posOrig, 65 const wxSize& sizeOrig, 66 long style, 67 const wxString &name) 68{ 69 // always create a frame of some reasonable, even if arbitrary, size (at 70 // least for MSW compatibility) 71 wxSize size = sizeOrig; 72 if ( size.x == wxDefaultCoord || size.y == wxDefaultCoord ) 73 { 74 wxSize sizeDefault = GetDefaultSize(); 75 if ( size.x == wxDefaultCoord ) 76 size.x = sizeDefault.x; 77 if ( size.y == wxDefaultCoord ) 78 size.y = sizeDefault.y; 79 } 80 81 // for default positioning, centre the first top level window and 82 // cascade any addtional ones from there. 83 wxPoint pos = posOrig; 84 if ( pos.x == wxDefaultCoord || pos.y == wxDefaultCoord ) 85 { 86 wxSize sizeDisplay = wxGetDisplaySize(); 87 static wxPoint nextPos((sizeDisplay.x - size.x) / 2, 88 (sizeDisplay.y - size.y) / 2); 89 90 if ( pos.x == wxDefaultCoord ) 91 pos.x = nextPos.x; 92 if ( pos.y == wxDefaultCoord ) 93 pos.y = nextPos.y; 94 if ( pos.x + size.x > sizeDisplay.x || pos.y + size.y > sizeDisplay.y ) 95 pos = wxPoint(); 96 97 const wxSize cascadeOffset(16, 20); 98 nextPos = pos + cascadeOffset; 99 } 100 101 wxWindow::Create(NULL, id, pos, size, style, name); 102 SetParent(parent); 103 if ( parent ) 104 parent->AddChild(this); 105 106 wxTopLevelWindows.Append(this); 107 m_title = title; 108 109 return true; 110} 111 112bool wxTopLevelWindowMGL::ShowFullScreen(bool show, long style) 113{ 114 if (show == m_fsIsShowing) return false; // return what? 115 116 m_fsIsShowing = show; 117 118 if (show) 119 { 120 m_fsSaveStyle = m_windowStyle; 121 m_fsSaveFlag = style; 122 GetPosition(&m_fsSaveFrame.x, &m_fsSaveFrame.y); 123 GetSize(&m_fsSaveFrame.width, &m_fsSaveFrame.height); 124 125 if ( style & wxFULLSCREEN_NOCAPTION ) 126 m_windowStyle &= ~wxCAPTION; 127 if ( style & wxFULLSCREEN_NOBORDER ) 128 m_windowStyle = wxSIMPLE_BORDER; 129 130 int x, y; 131 wxDisplaySize(&x, &y); 132 SetSize(0, 0, x, y); 133 } 134 else 135 { 136 m_windowStyle = m_fsSaveStyle; 137 SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y, 138 m_fsSaveFrame.width, m_fsSaveFrame.height); 139 } 140 141 return true; 142} 143 144bool wxTopLevelWindowMGL::Show(bool show) 145{ 146 bool ret = wxTopLevelWindowBase::Show(show); 147 148 // If this is the first time Show was called, send size event, 149 // so that the frame can adjust itself (think auto layout or single child) 150 if ( !m_sizeSet ) 151 { 152 m_sizeSet = true; 153 wxSizeEvent event(GetSize(), GetId()); 154 event.SetEventObject(this); 155 GetEventHandler()->ProcessEvent(event); 156 } 157 158 if ( ret && show && AcceptsFocus() ) 159 SetFocus(); 160 // FIXME_MGL -- don't do this for popup windows? 161 return ret; 162} 163 164void wxTopLevelWindowMGL::Maximize(bool maximize) 165{ 166 int x, y, w, h; 167 wxClientDisplayRect(&x, &y, &w, &h); 168 169 rect_t screenRect = MGL_defRect(x, y, w, h); 170 MGL_wmInvalidateRect(g_winMng, &screenRect); 171 172 if ( maximize && !m_isMaximized ) 173 { 174 m_isMaximized = true; 175 176 GetPosition(&m_savedFrame.x, &m_savedFrame.y); 177 GetSize(&m_savedFrame.width, &m_savedFrame.height); 178 179 SetSize(x, y, w, h); 180 } 181 else if ( !maximize && m_isMaximized ) 182 { 183 m_isMaximized = false; 184 SetSize(m_savedFrame.x, m_savedFrame.y, 185 m_savedFrame.width, m_savedFrame.height); 186 } 187} 188 189bool wxTopLevelWindowMGL::IsMaximized() const 190{ 191 return m_isMaximized; 192} 193 194void wxTopLevelWindowMGL::Restore() 195{ 196 if ( IsIconized() ) 197 { 198 Iconize(false); 199 } 200 if ( IsMaximized() ) 201 { 202 Maximize(false); 203 } 204} 205 206void wxTopLevelWindowMGL::Iconize(bool WXUNUSED(iconize)) 207{ 208 wxFAIL_MSG(wxT("Iconize not supported under wxMGL")); 209 // FIXME_MGL - Iconize is not supported in fullscreen mode. 210 // It will be supported in windowed mode (if ever implemented in MGL...) 211} 212 213bool wxTopLevelWindowMGL::IsIconized() const 214{ 215 return m_isIconized; 216} 217