]> git.saurik.com Git - wxWidgets.git/commitdiff
wxSplitterWindow now:
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 11 Feb 2002 23:48:33 +0000 (23:48 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 11 Feb 2002 23:48:33 +0000 (23:48 +0000)
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
src/generic/splitter.cpp

index 8528e2265bcb0ed052509e5aea944551125bbab3..4b0d641a56e4c66119d35e689cf3129e4b22732a 100644 (file)
@@ -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;
index 8205ca5e246694deef03ee7e8cd29960100df461..3b9a91b5185b5a038356174d313e6da3828d1a64 100644 (file)
@@ -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,