/////////////////////////////////////////////////////////////////////////////
-// Name: toplevel.cpp
+// Name: src/mgl/toplevel.cpp
// Purpose:
// Author: Vaclav Slavik
// Id: $Id$
-// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
- #pragma implementation "toplevel.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#pragma hdrstop
#endif
-#include "wx/defs.h"
-#include "wx/toplevel.h"
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+ #include "wx/toplevel.h"
+ #include "wx/app.h"
+#endif // WX_PRECOMP
+
+#include "wx/mgl/private.h"
// ----------------------------------------------------------------------------
// idle system
void wxTopLevelWindowMGL::Init()
{
- m_isIconized = FALSE;
- m_isMaximized = FALSE;
- m_fsIsShowing = FALSE;
+ m_isShown = false;
+ m_isIconized = false;
+ m_isMaximized = false;
+ m_fsIsShowing = false;
+ m_sizeSet = false;
}
bool wxTopLevelWindowMGL::Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
- const wxPoint& pos,
+ const wxPoint& posOrig,
const wxSize& sizeOrig,
long style,
const wxString &name)
// always create a frame of some reasonable, even if arbitrary, size (at
// least for MSW compatibility)
wxSize size = sizeOrig;
- if ( size.x == -1 || size.y == -1 )
+ if ( size.x == wxDefaultCoord || size.y == wxDefaultCoord )
{
- wxSize sizeDpy = wxGetDisplaySize();
- if ( size.x == -1 )
- size.x = sizeDpy.x / 3;
- if ( size.y == -1 )
- size.y = sizeDpy.y / 5;
+ wxSize sizeDefault = GetDefaultSize();
+ if ( size.x == wxDefaultCoord )
+ size.x = sizeDefault.x;
+ if ( size.y == wxDefaultCoord )
+ size.y = sizeDefault.y;
}
- wxTopLevelWindows.Append(this);
-
- m_title = title;
+ // for default positioning, centre the first top level window and
+ // cascade any addtional ones from there.
+ wxPoint pos = posOrig;
+ if ( pos.x == wxDefaultCoord || pos.y == wxDefaultCoord )
+ {
+ wxSize sizeDisplay = wxGetDisplaySize();
+ static wxPoint nextPos((sizeDisplay.x - size.x) / 2,
+ (sizeDisplay.y - size.y) / 2);
+
+ if ( pos.x == wxDefaultCoord )
+ pos.x = nextPos.x;
+ if ( pos.y == wxDefaultCoord )
+ pos.y = nextPos.y;
+ if ( pos.x + size.x > sizeDisplay.x || pos.y + size.y > sizeDisplay.y )
+ pos = wxPoint();
+
+ const wxSize cascadeOffset(16, 20);
+ nextPos = pos + cascadeOffset;
+ }
+ wxWindow::Create(NULL, id, pos, size, style, name);
+ SetParent(parent);
+ if ( parent )
+ parent->AddChild(this);
- if (m_parent)
- m_parent->AddChild(this);
+ wxTopLevelWindows.Append(this);
+ m_title = title;
- return TRUE;
+ return true;
}
wxTopLevelWindowMGL::~wxTopLevelWindowMGL()
{
- m_isBeingDeleted = TRUE;
+ m_isBeingDeleted = true;
wxTopLevelWindows.DeleteObject(this);
if (wxTheApp->GetTopWindow() == this)
wxTheApp->SetTopWindow(NULL);
- if ((wxTopLevelWindows.Number() == 0) &&
- (wxTheApp->GetExitOnFrameDelete()))
+ if (wxTopLevelWindows.IsEmpty() &&
+ wxTheApp->GetExitOnFrameDelete())
{
wxTheApp->ExitMainLoop();
}
bool wxTopLevelWindowMGL::ShowFullScreen(bool show, long style)
{
- if (show == m_fsIsShowing) return FALSE; // return what?
+ if (show == m_fsIsShowing) return false; // return what?
m_fsIsShowing = show;
else
{
m_windowStyle = m_fsSaveStyle;
- SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y,
+ SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y,
m_fsSaveFrame.width, m_fsSaveFrame.height);
}
- return TRUE;
+ return true;
+}
+
+bool wxTopLevelWindowMGL::Show(bool show)
+{
+ bool ret = wxTopLevelWindowBase::Show(show);
+
+ // If this is the first time Show was called, send size event,
+ // so that the frame can adjust itself (think auto layout or single child)
+ if ( !m_sizeSet )
+ {
+ m_sizeSet = true;
+ wxSizeEvent event(GetSize(), GetId());
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event);
+ }
+
+ if ( ret && show && AcceptsFocus() )
+ SetFocus();
+ // FIXME_MGL -- don't do this for popup windows?
+ return ret;
}
void wxTopLevelWindowMGL::Maximize(bool maximize)
{
+ int x, y, w, h;
+ wxClientDisplayRect(&x, &y, &w, &h);
+
+ rect_t screenRect = MGL_defRect(x, y, w, h);
+ MGL_wmInvalidateRect(g_winMng, &screenRect);
+
if ( maximize && !m_isMaximized )
{
- int x, y, w, h;
-
+ m_isMaximized = true;
+
GetPosition(&m_savedFrame.x, &m_savedFrame.y);
GetSize(&m_savedFrame.width, &m_savedFrame.height);
- wxClientDisplayRect(&x, &y, &w, &h);
SetSize(x, y, w, h);
- m_isMaximized = TRUE;
}
else if ( !maximize && m_isMaximized )
{
- SetSize(m_savedFrame.x, m_savedFrame.y,
+ m_isMaximized = false;
+ SetSize(m_savedFrame.x, m_savedFrame.y,
m_savedFrame.width, m_savedFrame.height);
- m_isMaximized = FALSE;
}
}
void wxTopLevelWindowMGL::Restore()
{
- if ( m_isIconized )
+ if ( IsIconized() )
{
- Iconize(FALSE);
+ Iconize(false);
}
- if ( m_isMaximized )
+ if ( IsMaximized() )
{
- Maximize(FALSE);
+ Maximize(false);
}
}
-void wxTopLevelWindowMGL::Iconize(bool iconize)
+void wxTopLevelWindowMGL::Iconize(bool WXUNUSED(iconize))
{
- // FIXME_MGL
+ wxFAIL_MSG(wxT("Iconize not supported under wxMGL"));
+ // FIXME_MGL - Iconize is not supported in fullscreen mode.
+ // It will be supported in windowed mode (if ever implemented in MGL...)
}
bool wxTopLevelWindowMGL::IsIconized() const