]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/splitter.cpp
GetViews() documented
[wxWidgets.git] / src / generic / splitter.cpp
index 7f631aa457f8631090dee6ecbf10299c45f3e2ed..0288be38082da7f81637aa293200108db10c484f 100644 (file)
@@ -6,23 +6,22 @@
 // Created:     01/02/97
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:       wxWindows license
+// Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "splitter.h"
-// #pragma interface
+    #pragma implementation "splitter.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
-#include "wx/wx.h"
+    #include "wx/wx.h"
 #endif
 
 #include <math.h>
@@ -146,47 +145,37 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
     long x, y;
     event.Position(&x, &y);
 
+    // reset the cursor
+#ifdef __WXMOTIF__
+    SetCursor(* wxSTANDARD_CURSOR);
+#endif
+#ifdef __WXMSW__
+    SetCursor(wxCursor());
+#endif
+
     if (event.LeftDown())
     {
         if ( SashHitTest(x, y) )
         {
             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;
-        }
-    }
-    else if ( event.LeftUp() && m_dragMode == wxSPLIT_DRAG_LEFT_DOWN )
-    {
-        // Wasn't a proper drag
-        ReleaseMouse();
-        wxScreenDC::EndDrawingOnTop();
-        m_dragMode = wxSPLIT_DRAG_NONE;
+            m_dragMode = wxSPLIT_DRAG_DRAGGING;
 
-        SetCursor(*wxSTANDARD_CURSOR);
+            DrawSashTracker(x, y);
+            m_oldX = x;
+            m_oldY = y;
+            return;
+        }
     }
     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 +206,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
                 m_sashPosition = x;
             }
         }
-        else
+        else  // m_splitMode == wxSPLIT_VERTICAL
         {
             if ( !OnSashPositionChange(y) )
                 return;
@@ -244,9 +233,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
@@ -261,42 +250,15 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
                     SetCursor(*m_sashCursorNS);
                 }
         }
-        else
-        {
-            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 +266,6 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
     {
         OnDoubleClickSash(x, y);
     }
-    else
-    {
-    }
 }
 
 void wxSplitterWindow::OnSize(wxSizeEvent& WXUNUSED(event))
@@ -631,25 +590,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 +664,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;
   }