#endif
#include "wx/defs.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/dcclient.h"
+ #include "wx/settings.h"
+#endif
+
#include "wx/toplevel.h"
#include "wx/univ/renderer.h"
-#include "wx/dcclient.h"
#include "wx/bitmap.h"
#include "wx/image.h"
#include "wx/cshelp.h"
// ============================================================================
int wxTopLevelWindow::ms_drawDecorations = -1;
+int wxTopLevelWindow::ms_canIconize = -1;
void wxTopLevelWindow::Init()
{
exstyleOrig = 0;
if ( ms_drawDecorations == -1 )
- ms_drawDecorations = TRUE;
- // FIXME_MGL -- this is temporary; we assume for now that native TLW
- // can't do decorations, which is not true
+ {
+ ms_drawDecorations =
+ !wxSystemSettings::GetCapability(wxSYS_CAN_DRAW_FRAME_DECORATIONS)
+ || wxGetEnv(wxT("WXDECOR"), NULL);
+ // FIXME -- wxUniv should provide a way to force non-native decorations!
+ // $WXDECOR is just a hack in absence of better wxUniv solution
+ }
+
+ if ( ms_canIconize == -1 )
+ {
+ ms_canIconize = wxSystemSettings::GetCapability(wxSYS_CAN_ICONIZE_FRAME);
+ }
if ( ms_drawDecorations )
{
size, style, name) )
return FALSE;
- // FIXME: to be removed as soon as wxTLW/wxFrame/wxDialog creation code in
- // wxMSW is rationalized
-#ifdef __WXMSW__
- extern const wxChar *wxFrameClassName;
- if ( !MSWCreate(id, NULL, wxFrameClassName, this, title,
- pos.x, pos.y, size.x, size.y, style) )
- return FALSE;
-#endif // __WXMSW__
-
if ( ms_drawDecorations )
{
m_windowStyle = styleOrig;
if ( m_windowStyle & wxCAPTION )
{
style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_BUTTON_CLOSE;
- if ( m_windowStyle & wxMINIMIZE_BOX )
+ if ( (m_windowStyle & wxMINIMIZE_BOX) && ms_canIconize )
style |= wxTOPLEVEL_BUTTON_ICONIZE;
if ( m_windowStyle & wxMAXIMIZE_BOX )
- style |= wxTOPLEVEL_BUTTON_MAXIMIZE;
+ {
+ if ( IsMaximized() )
+ style |= wxTOPLEVEL_BUTTON_RESTORE;
+ else
+ style |= wxTOPLEVEL_BUTTON_MAXIMIZE;
+ }
#if wxUSE_HELP
if ( m_exStyle & (wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP))
style |= wxTOPLEVEL_BUTTON_HELP;
wxTopLevelWindowNative::DoGetClientSize(&w, &h);
wxRect rect(wxTopLevelWindowNative::GetClientAreaOrigin(), wxSize(w, h));
- return m_renderer->HitTestFrame(rect, pt, GetDecorationsStyle());
+ return m_renderer->HitTestFrame(rect, pt+GetClientAreaOrigin(), GetDecorationsStyle());
}
// ----------------------------------------------------------------------------
void wxTopLevelWindow::SetIcon(const wxIcon& icon)
{
wxTopLevelWindowNative::SetIcon(icon);
- if ( !m_renderer ) return;
- wxSize size = m_renderer->GetFrameIconSize();
-
- if ( !icon.Ok() || size.x == -1 )
- m_titlebarIcon = icon;
- else
+ if ( ms_drawDecorations && m_renderer )
{
- wxBitmap bmp1;
- bmp1.CopyFromIcon(icon);
- if ( !bmp1.Ok() )
- m_titlebarIcon = wxNullIcon;
- else if ( bmp1.GetWidth() == size.x && bmp1.GetHeight() == size.y )
+ wxSize size = m_renderer->GetFrameIconSize();
+
+ if ( !icon.Ok() || size.x == -1 )
m_titlebarIcon = icon;
else
{
- wxImage img = bmp1.ConvertToImage();
- img.Rescale(size.x, size.y);
- m_titlebarIcon.CopyFromBitmap(wxBitmap(img));
+ wxBitmap bmp1;
+ bmp1.CopyFromIcon(icon);
+ if ( !bmp1.Ok() )
+ m_titlebarIcon = wxNullIcon;
+ else if ( bmp1.GetWidth() == size.x && bmp1.GetHeight() == size.y )
+ m_titlebarIcon = icon;
+ else
+ {
+ wxImage img = bmp1.ConvertToImage();
+ img.Rescale(size.x, size.y);
+ m_titlebarIcon.CopyFromBitmap(wxBitmap(img));
+ }
}
}
}
ClickTitleBarButton(numArg);
return TRUE;
}
-
+
else if ( action == wxACTION_TOPLEVEL_MOVE )
{
InteractiveMove(wxINTERACTIVE_MOVE);
return TRUE;
}
-
+
else if ( action == wxACTION_TOPLEVEL_RESIZE )
{
int flags = wxINTERACTIVE_RESIZE;
InteractiveMove(flags);
return TRUE;
}
-
+
else
return FALSE;
}
}
else if ( consumer->GetInputWindow()->GetWindowStyle() & wxRESIZE_BORDER )
{
- wxTopLevelWindow *win = wxStaticCast(consumer->GetInputWindow(),
+ wxTopLevelWindow *win = wxStaticCast(consumer->GetInputWindow(),
wxTopLevelWindow);
long hit = win->HitTest(event.GetPosition());
-
+
if ( hit != m_winHitTest )
{
m_winHitTest = hit;
-
+
if ( m_borderCursorOn )
{
m_borderCursorOn = FALSE;
win->SetCursor(m_origCursor);
}
-
+
if ( hit & wxHT_TOPLEVEL_ANY_BORDER )
{
m_borderCursorOn = TRUE;
wxCursor cur;
-
+
switch (hit)
{
case wxHT_TOPLEVEL_BORDER_N: