]> git.saurik.com Git - wxWidgets.git/commitdiff
Modified OnSashPositionChange to resize the window to minimum pane
authorUnknown (BV) <nobody@localhost>
Wed, 12 May 1999 03:03:26 +0000 (03:03 +0000)
committerUnknown (BV) <nobody@localhost>
Wed, 12 May 1999 03:03:26 +0000 (03:03 +0000)
size if the selected position would result in a too-small pane.
Edge-detection logic (which closes a split) moved from OnMouseEvent to
OnSashPositionChange.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2422 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/splitter.cpp

index 526ca5533e5fa65eee1f8a5fa394fbdb346dd48d..0d926085d458a2f5f4d73d880c8641a14b45c4f6 100644 (file)
@@ -140,10 +140,11 @@ void wxSplitterWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
     DrawSash(dc);
 }
 
     DrawSash(dc);
 }
 
+
 void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
 {
 void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
 {
-    long x, y;
-    event.Position(&x, &y);
+    long x = event.GetX();
+    long y = event.GetY();
 
     // reset the cursor
 #ifdef __WXMOTIF__
 
     // reset the cursor
 #ifdef __WXMOTIF__
@@ -186,64 +187,38 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
         // Erase old tracker
         DrawSashTracker(m_oldX, m_oldY);
 
         // Erase old tracker
         DrawSashTracker(m_oldX, m_oldY);
 
+        // Obtain window size. We are only interested in the dimension the sash
+        // splits up
         int w, h;
         GetClientSize(&w, &h);
         int w, h;
         GetClientSize(&w, &h);
-        if ( m_splitMode == wxSPLIT_VERTICAL )
+        int window_size = (m_splitMode == wxSPLIT_VERTICAL ? w : h );
+        int new_sash_position =
+            (int) ( m_splitMode == wxSPLIT_VERTICAL ? x : y );
+
+        if ( !OnSashPositionChange(new_sash_position) )
+            return;
+
+        if ( new_sash_position == 0 )
+        {
+            // We remove the first window from the view
+            wxWindow *removedWindow = m_windowOne;
+            m_windowOne = m_windowTwo;
+            m_windowTwo = (wxWindow *) NULL;
+            OnUnsplit(removedWindow);
+            m_sashPosition = 0;
+        }
+        else if ( new_sash_position == window_size )
         {
         {
-            if ( !OnSashPositionChange(x) )
-                return;
-
-            if ( x <= 4 )
-            {
-                // We remove the first window from the view
-                wxWindow *removedWindow = m_windowOne;
-                m_windowOne = m_windowTwo;
-                m_windowTwo = (wxWindow *) NULL;
-
-                OnUnsplit(removedWindow);
-                m_sashPosition = 0;
-            }
-            else if ( x >= (w - 4) )
-            {
-                // We remove the second window from the view
-                wxWindow *removedWindow = m_windowTwo;
-                m_windowTwo = (wxWindow *) NULL;
-                OnUnsplit(removedWindow);
-                m_sashPosition = 0;
-            }
-            else
-            {
-                m_sashPosition = x;
-            }
+            // We remove the second window from the view
+            wxWindow *removedWindow = m_windowTwo;
+            m_windowTwo = (wxWindow *) NULL;
+            OnUnsplit(removedWindow);
+            m_sashPosition = 0;
         }
         }
-        else  // m_splitMode == wxSPLIT_VERTICAL
+        else
         {
         {
-            if ( !OnSashPositionChange(y) )
-                return;
-
-            if ( y <= 4 )
-            {
-                // We remove the first window from the view
-                wxWindow *removedWindow = m_windowOne;
-                m_windowOne = m_windowTwo;
-                m_windowTwo = (wxWindow *) NULL;
-
-                OnUnsplit(removedWindow);
-                m_sashPosition = 0;
-            }
-            else if ( y >= (h - 4) )
-            {
-                // We remove the second window from the view
-                wxWindow *removedWindow = m_windowTwo;
-                m_windowTwo = (wxWindow *) NULL;
-                OnUnsplit(removedWindow);
-                m_sashPosition = 0;
-            }
-            else
-            {
-                m_sashPosition = y;
-            }
-        } // m_splitMode == wxSPLIT_VERTICAL
+            m_sashPosition = new_sash_position;
+        }
         SizeWindows();
     }  // left up && dragging
     else if (event.Moving() && !event.Dragging())
         SizeWindows();
     }  // left up && dragging
     else if (event.Moving() && !event.Dragging())
@@ -669,29 +644,43 @@ void wxSplitterWindow::SetSashPosition(int position, bool redraw)
     }
 }
 
     }
 }
 
-bool wxSplitterWindow::OnSashPositionChange(int newSashPosition)
+bool wxSplitterWindow::OnSashPositionChange(int& newSashPosition)
 {
 {
-  // is the left/upper pane too small?
-  if ( newSashPosition < m_minimumPaneSize )
-    return NULL;
-
-  // is the right/lower pane too small?
-  int w, h;
-  GetClientSize(&w, &h);
-
-  if ( m_splitMode == wxSPLIT_VERTICAL )
-  {
-    if ( w - newSashPosition < m_minimumPaneSize )
-      return FALSE;
-  }
-  else // m_splitMode = wxSPLIT_HORIZONTAL
-  {
-    if ( h - newSashPosition < m_minimumPaneSize )
-      return FALSE;
-  }
-
-  // it's ok to move sash
-  return TRUE;
+    // If within UNSPLIT_THRESHOLD from edge, set to edge to cause closure.
+    const int UNSPLIT_THRESHOLD = 4;
+
+    if (newSashPosition <= UNSPLIT_THRESHOLD)   // threshold top / left check
+    {
+        newSashPosition = 0;
+        return TRUE;
+    }
+
+    // Obtain relevant window dimension for bottom / right threshold check
+    int w, h;
+    GetClientSize(&w, &h);
+    int window_size = (m_splitMode == wxSPLIT_VERTICAL) ? w : h ;
+
+    if ( newSashPosition >= window_size - UNSPLIT_THRESHOLD )
+    {
+        newSashPosition = window_size;
+        return TRUE;
+    }
+
+    // If resultant pane would be too small, enlarge it.
+
+    // Check upper / left pane
+    if ( newSashPosition < m_minimumPaneSize )
+        newSashPosition = m_minimumPaneSize;   // NB: don't return just yet
+
+    // Check lower / right pane (check even if sash was just adjusted)
+    if ( newSashPosition > window_size - m_minimumPaneSize )
+        newSashPosition = window_size - m_minimumPaneSize;
+
+    // If the result is out of bounds it means minimum size is too big, so
+    // split window in half as best compromise.
+    if (newSashPosition < 0 || newSashPosition > window_size)
+        newSashPosition = window_size / 2;
+    return TRUE;
 }
 
 // Called when the sash is double-clicked.
 }
 
 // Called when the sash is double-clicked.