diff --git a/include/wx/toplevel.h b/include/wx/toplevel.h index f5a64871b7..ae36a9fa42 100644 --- a/include/wx/toplevel.h +++ b/include/wx/toplevel.h @@ -113,6 +113,7 @@ public: // override some base class virtuals virtual bool Destroy(); virtual bool IsTopLevel() const { return TRUE; } + virtual wxSize GetMaxSize() const; // event handlers void OnCloseWindow(wxCloseEvent& event); @@ -191,3 +192,5 @@ protected: #endif // _WX_TOPLEVEL_BASE_H_ + +// vi:sts=4:sw=4:et diff --git a/include/wx/window.h b/include/wx/window.h index e431b9c83a..40538ca5a6 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -298,6 +298,9 @@ public: int GetMaxWidth() const { return m_maxWidth; } int GetMaxHeight() const { return m_maxHeight; } + // Override this method to control the values given to Sizers etc. + virtual wxSize GetMaxSize() const { return wxSize( m_maxWidth, m_maxHeight ); } + // window state // ------------ @@ -1077,3 +1080,5 @@ inline int NewControlId() { return wxWindowBase::NewControlId(); } #endif // _WX_WINDOW_H_BASE_ + +// vi:sts=4:sw=4:et diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index f3a5d5a04f..e93aee1e64 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -419,29 +419,19 @@ void wxSizer::Layout() void wxSizer::SetSizeHints( wxWindow *window ) { + // Preserve the window's max size hints, but set the + // lower bound according to the sizer calculations. + wxSize size = FitSize( window ); - window->SetSizeHints( size.x, size.y ); + window->SetSizeHints( size.x, + size.y, + window->GetMaxWidth(), + window->GetMaxHeight() ); } -wxSize wxSizer::GetMaxWindowSize( wxWindow *WXUNUSED(window) ) +wxSize wxSizer::GetMaxWindowSize( wxWindow *window ) { - wxRect rect = wxGetClientDisplayRect(); - wxSize sizeMax (rect.width,rect.height); - - // Sorry, but this bit is wrong -- it makes a window that should just be - // able to fit onto the screen, not fit on the screen. -- JACS -#if 0 - // Make the max size a bit smaller than the visible portion of - // the screen. A window which takes the entire screen doesn't - // look very nice either - sizeMax.x *= 9; - sizeMax.x /= 10; - - sizeMax.y *= 9; - sizeMax.y /= 10; -#endif - - return sizeMax; + return window->GetMaxSize(); } wxSize wxSizer::GetMinWindowSize( wxWindow *window ) @@ -459,9 +449,11 @@ wxSize wxSizer::FitSize( wxWindow *window ) wxSize size = GetMinWindowSize( window ); wxSize sizeMax = GetMaxWindowSize( window ); - if ( size.x > sizeMax.x ) + // Limit the size if sizeMax != wxDefaultSize + + if ( size.x > sizeMax.x && sizeMax.x != -1 ) size.x = sizeMax.x; - if ( size.y > sizeMax.y ) + if ( size.y > sizeMax.y && sizeMax.y != -1 ) size.y = sizeMax.y; return size; @@ -1183,3 +1175,5 @@ wxSize wxNotebookSizer::CalcMin() } #endif // wxUSE_NOTEBOOK + +// vi:sts=4:sw=4:et diff --git a/src/common/toplvcmn.cpp b/src/common/toplvcmn.cpp index 865d29f444..da1e1cb9e0 100644 --- a/src/common/toplvcmn.cpp +++ b/src/common/toplvcmn.cpp @@ -73,6 +73,22 @@ bool wxTopLevelWindowBase::Destroy() return TRUE; } +wxSize wxTopLevelWindowBase::GetMaxSize() const +{ + wxSize size( GetMaxWidth(), GetMaxHeight() ); + int w, h; + + wxClientDisplayRect( 0, 0, &w, &h ); + + if( size.GetWidth() == -1 ) + size.SetWidth( w ); + + if( size.GetHeight() == -1 ) + size.SetHeight( h ); + + return size; +} + // ---------------------------------------------------------------------------- // wxTopLevelWindow size management: we exclude the areas taken by // menu/status/toolbars from the client area, so the client area is what's @@ -175,3 +191,5 @@ bool wxTopLevelWindowBase::SendIconizeEvent(bool iconized) return GetEventHandler()->ProcessEvent(event); } + +// vi:sts=4:sw=4:et diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 8e3d5e4634..f738746d00 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -1748,3 +1748,4 @@ void wxWindowBase::ReleaseMouse() GetCapture()); } +// vi:sts=4:sw=4:et