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