]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/splitter.cpp
CW Win32 and Mac adaptions
[wxWidgets.git] / src / generic / splitter.cpp
index 7f631aa457f8631090dee6ecbf10299c45f3e2ed..d43a1244d3762b2b09fb014b97e6443a5501af08 100644 (file)
@@ -152,41 +152,23 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
         {
             CaptureMouse();
 
-            // Required for X to specify that
-            // that we wish to draw on top of all windows
-            // - and we optimise by specifying the area
-            // for creating the overlap window.
-            wxScreenDC::StartDrawingOnTop(this);
-
-            // We don't say we're dragging yet; we leave that
-            // decision for the Dragging() branch, to ensure
-            // the user has dragged a little bit.
-            m_dragMode = wxSPLIT_DRAG_LEFT_DOWN;
-            m_firstX = x;
-            m_firstY = y;
+            m_dragMode = wxSPLIT_DRAG_DRAGGING;
+           
+            DrawSashTracker(x, y);
+            m_oldX = x;
+            m_oldY = y;
+           return;
         }
     }
-    else if ( event.LeftUp() && m_dragMode == wxSPLIT_DRAG_LEFT_DOWN )
-    {
-        // Wasn't a proper drag
-        ReleaseMouse();
-        wxScreenDC::EndDrawingOnTop();
-        m_dragMode = wxSPLIT_DRAG_NONE;
-
-        SetCursor(*wxSTANDARD_CURSOR);
-    }
     else if (event.LeftUp() && m_dragMode == wxSPLIT_DRAG_DRAGGING)
     {
         // We can stop dragging now and see what we've got.
         m_dragMode = wxSPLIT_DRAG_NONE;
         ReleaseMouse();
+
         // Erase old tracker
         DrawSashTracker(m_oldX, m_oldY);
 
-        // End drawing on top (frees the window used for drawing
-        // over the screen)
-        wxScreenDC::EndDrawingOnTop();
-
         int w, h;
         GetClientSize(&w, &h);
         if ( m_splitMode == wxSPLIT_VERTICAL )
@@ -217,7 +199,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
                 m_sashPosition = x;
             }
         }
-        else
+        else  // m_splitMode == wxSPLIT_VERTICAL
         {
             if ( !OnSashPositionChange(y) )
                 return;
@@ -244,9 +226,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
             {
                 m_sashPosition = y;
             }
-        }
+        } // m_splitMode == wxSPLIT_VERTICAL
         SizeWindows();
-    }
+    }  // left up && dragging
     else if (event.Moving() && !event.Dragging())
     {
         // Just change the cursor if required
@@ -266,37 +248,14 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
             SetCursor(*wxSTANDARD_CURSOR);
         }
     }
-    else if ( (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) ||
-              (event.Dragging() && SashHitTest(x, y, 4)) )
+    else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) 
     {
-         if ( m_splitMode == wxSPLIT_VERTICAL )
-         {
-            SetCursor(*m_sashCursorWE);
-         }
-         else
-         {
-            SetCursor(*m_sashCursorNS);
-         }
-
-        // Detect that this is really a drag: we've moved more than 1 pixel either way
-        if ((m_dragMode == wxSPLIT_DRAG_LEFT_DOWN) &&
-//                (abs((int)x - m_firstX) > 1 || abs((int)y - m_firstY) > 1) )
-                (abs((int)x - m_firstX) > 0 || abs((int)y - m_firstY) > 1) )
-        {
-            m_dragMode = wxSPLIT_DRAG_DRAGGING;
-            DrawSashTracker(x, y);
-        }
-        else
-        {
-          if ( m_dragMode == wxSPLIT_DRAG_DRAGGING )
-          {
-            // Erase old tracker
-            DrawSashTracker(m_oldX, m_oldY);
+        // Erase old tracker
+        DrawSashTracker(m_oldX, m_oldY);
+
+        // Draw new one
+        DrawSashTracker(x, y);
 
-            // Draw new one
-            DrawSashTracker(x, y);
-          }
-        }
         m_oldX = x;
         m_oldY = y;
     }
@@ -304,9 +263,6 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
     {
         OnDoubleClickSash(x, y);
     }
-    else
-    {
-    }
 }
 
 void wxSplitterWindow::OnSize(wxSizeEvent& WXUNUSED(event))
@@ -631,25 +587,54 @@ bool wxSplitterWindow::Unsplit(wxWindow *toRemove)
     if ( ! IsSplit() )
         return FALSE;
 
+    wxWindow *win = NULL;
     if ( toRemove == NULL || toRemove == m_windowTwo)
     {
-        wxWindow *win = m_windowTwo ;
+        win = m_windowTwo ;
         m_windowTwo = (wxWindow *) NULL;
-        m_sashPosition = 0;
-        OnUnsplit(win);
-        SizeWindows();
     }
     else if ( toRemove == m_windowOne )
     {
-        wxWindow *win = m_windowOne ;
+        win = m_windowOne ;
         m_windowOne = m_windowTwo;
         m_windowTwo = (wxWindow *) NULL;
-        m_sashPosition = 0;
-        OnUnsplit(win);
-        SizeWindows();
     }
     else
+    {
+        wxFAIL_MSG("splitter: attempt to remove a non-existent window");
+
         return FALSE;
+    }
+
+    OnUnsplit(win);
+    m_sashPosition = 0;
+    SizeWindows();
+
+    return TRUE;
+}
+
+// Replace a window with another one
+bool wxSplitterWindow::ReplaceWindow(wxWindow *winOld, wxWindow *winNew)
+{
+    wxCHECK_MSG( winOld, FALSE, "use one of Split() functions instead" );
+    wxCHECK_MSG( winNew, FALSE, "use Unsplit() functions instead" );
+
+    if ( winOld == m_windowTwo )
+    {
+        m_windowTwo = winNew;
+    }
+    else if ( winOld == m_windowOne )
+    {
+        m_windowOne = winNew;
+    }
+    else
+    {
+        wxFAIL_MSG("splitter: attempt to replace a non-existent window");
+
+        return FALSE;
+    }
+
+    SizeWindows();
 
     return TRUE;
 }
@@ -676,12 +661,12 @@ bool wxSplitterWindow::OnSashPositionChange(int newSashPosition)
 
   if ( m_splitMode == wxSPLIT_VERTICAL )
   {
-    if ( h - newSashPosition < m_minimumPaneSize )
+    if ( w - newSashPosition < m_minimumPaneSize )
       return FALSE;
   }
   else // m_splitMode = wxSPLIT_HORIZONTAL
   {
-    if ( w - newSashPosition < m_minimumPaneSize )
+    if ( h - newSashPosition < m_minimumPaneSize )
       return FALSE;
   }