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