From d76ac8ed8848716ec836071028bfe9beba954318 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 11 Feb 2002 23:48:33 +0000 Subject: [PATCH] wxSplitterWindow now: 1. respects minimal size even when set programatically 2. respects minimal size of child windows if set git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14145 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/splitter.h | 3 +++ src/generic/splitter.cpp | 41 +++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/include/wx/generic/splitter.h b/include/wx/generic/splitter.h index 8528e2265b..4b0d641a56 100644 --- a/include/wx/generic/splitter.h +++ b/include/wx/generic/splitter.h @@ -212,6 +212,9 @@ protected: protected: // common part of all ctors void Init(); + + // adjusts sash position with respect to min. pane and window sizes + void AdjustSashPosition(int &sashPos); int m_splitMode; bool m_permitUnsplitAlways; diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 8205ca5e24..3b9a91b518 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -689,6 +689,37 @@ void wxSplitterWindow::DrawSashTracker(int x, int y) screenDC.SetBrush(wxNullBrush); } +void wxSplitterWindow::AdjustSashPosition(int &sashPos) +{ + int w, h; + GetClientSize(&w, &h); + int window_size = (m_splitMode == wxSPLIT_VERTICAL) ? w : h; + wxWindow *win; + + if ( sashPos < m_minimumPaneSize ) + sashPos = m_minimumPaneSize; + else if ( sashPos > window_size - m_minimumPaneSize ) + sashPos = window_size - m_minimumPaneSize; + + win = GetWindow1(); + if ( win ) + { + int minSize = (m_splitMode == wxSPLIT_VERTICAL) ? + win->GetMinWidth() : win->GetMinHeight(); + if ( minSize != -1 && sashPos < minSize + GetBorderSize() ) + sashPos = minSize + GetBorderSize(); + } + + win = GetWindow2(); + if ( win ) + { + int minSize = (m_splitMode == wxSPLIT_VERTICAL) ? + win->GetMinWidth() : win->GetMinHeight(); + if ( minSize != -1 && sashPos > window_size - minSize - GetBorderSize() ) + sashPos = window_size - minSize - GetBorderSize(); + } +} + // Position and size subwindows. // Note that the border size applies to each subwindow, not // including the edges next to the sash. @@ -763,6 +794,8 @@ bool wxSplitterWindow::SplitVertically(wxWindow *window1, wxWindow *window2, int m_sashPosition = w + sashPosition; // It's negative so adding is subtracting else // default m_sashPosition = w/2; + + AdjustSashPosition(m_sashPosition); SizeWindows(); @@ -787,6 +820,8 @@ bool wxSplitterWindow::SplitHorizontally(wxWindow *window1, wxWindow *window2, i else // default m_sashPosition = h/2; + AdjustSashPosition(m_sashPosition); + SizeWindows(); return TRUE; @@ -855,6 +890,7 @@ bool wxSplitterWindow::ReplaceWindow(wxWindow *winOld, wxWindow *winNew) void wxSplitterWindow::SetSashPosition(int position, bool redraw) { m_sashPosition = position; + AdjustSashPosition(m_sashPosition); if ( redraw ) { @@ -945,10 +981,7 @@ void wxSplitterWindow::OnSashPosChanged(wxSplitterEvent& event) if ( !unsplit_scenario ) { // If resultant pane would be too small, enlarge it - if ( newSashPosition < m_minimumPaneSize ) - newSashPosition = m_minimumPaneSize; - if ( newSashPosition > window_size - m_minimumPaneSize ) - newSashPosition = window_size - m_minimumPaneSize; + AdjustSashPosition(newSashPosition); } // If the result is out of bounds it means minimum size is too big, -- 2.47.2