From 34c3ffca5b9a22a972ae0296c8713f8ff1956566 Mon Sep 17 00:00:00 2001 From: Ron Lee Date: Sat, 9 Mar 2002 02:58:13 +0000 Subject: [PATCH] Added GetMaxSize virtual method for use by sizers. Modified wxSizer to use it instead of crushing all windows to the display size. Currently only top level windows are limited to display size, all other windows are unlimited (inside the clipping region of their tlw). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14511 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/toplevel.h | 3 +++ include/wx/window.h | 5 +++++ src/common/sizer.cpp | 36 +++++++++++++++--------------------- src/common/toplvcmn.cpp | 18 ++++++++++++++++++ src/common/wincmn.cpp | 1 + 5 files changed, 42 insertions(+), 21 deletions(-) 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 -- 2.45.2