]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/splitter.cpp
oops, more fixes needed
[wxWidgets.git] / src / generic / splitter.cpp
index 588657f137e9fc1155c22bfa416e3b271fb7f6fc..7f7db32428ed727186e199d02e4700919b0dde7e 100644 (file)
@@ -9,7 +9,7 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "splitter.h"
 #endif
 
@@ -36,7 +36,6 @@
     #include "wx/settings.h"
 #endif
 
-#include "wx/dcmirror.h"
 #include "wx/renderer.h"
 
 #include "wx/splitter.h"
@@ -49,6 +48,16 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_DOUBLECLICKED)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPLITTER_UNSPLIT)
 
 IMPLEMENT_DYNAMIC_CLASS(wxSplitterWindow, wxWindow)
+
+/*
+       TODO PROPERTIES
+               style wxSP_3D
+               sashpos (long , 0 )
+               minsize (long -1 )
+               object, object_ref
+               orientation
+*/
+
 IMPLEMENT_DYNAMIC_CLASS(wxSplitterEvent, wxNotifyEvent)
 
 BEGIN_EVENT_TABLE(wxSplitterWindow, wxWindow)
@@ -78,10 +87,6 @@ bool wxSplitterWindow::Create(wxWindow *parent, wxWindowID id,
     style &= ~wxBORDER_MASK;
     style |= wxBORDER_NONE;
 
-    // we don't need to be completely repainted after resize and doing it
-    // results in horrible flicker
-    style |= wxNO_FULL_REPAINT_ON_RESIZE;
-
     if ( !wxWindow::Create(parent, id, pos, size, style, name) )
         return FALSE;
 
@@ -110,6 +115,7 @@ void wxSplitterWindow::Init()
     m_sashTrackerPen = new wxPen(*wxBLACK, 2, wxSOLID);
 
     m_needUpdating = FALSE;
+    m_isHot = false;
 }
 
 wxSplitterWindow::~wxSplitterWindow()
@@ -117,12 +123,46 @@ wxSplitterWindow::~wxSplitterWindow()
     delete m_sashTrackerPen;
 }
 
+// ----------------------------------------------------------------------------
+// entering/leaving sash
+// ----------------------------------------------------------------------------
+
+void wxSplitterWindow::RedrawIfHotSensitive(bool isHot)
+{
+    if ( wxRendererNative::Get().GetSplitterParams(this).isHotSensitive )
+    {
+        m_isHot = isHot;
+
+        wxClientDC dc(this);
+        DrawSash(dc);
+    }
+    //else: we don't change our appearance, don't redraw to avoid flicker
+}
+
+void wxSplitterWindow::OnEnterSash()
+{
+    SetResizeCursor();
+
+    RedrawIfHotSensitive(true);
+}
+
+void wxSplitterWindow::OnLeaveSash()
+{
+    SetCursor(*wxSTANDARD_CURSOR);
+
+    RedrawIfHotSensitive(false);
+}
+
 void wxSplitterWindow::SetResizeCursor()
 {
     SetCursor(m_splitMode == wxSPLIT_VERTICAL ? m_sashCursorWE
                                               : m_sashCursorNS);
 }
 
+// ----------------------------------------------------------------------------
+// other event handlers
+// ----------------------------------------------------------------------------
+
 void wxSplitterWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
     wxPaintDC dc(this);
@@ -253,15 +293,10 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
     }  // left up && dragging
     else if ((event.Moving() || event.Leaving() || event.Entering()) && (m_dragMode == wxSPLIT_DRAG_NONE))
     {
-        // Just change the cursor as required
-        if ( !event.Leaving() && SashHitTest(x, y) )
-        {
-            SetResizeCursor();
-        }
+        if ( event.Leaving() || !SashHitTest(x, y) )
+            OnLeaveSash();
         else
-        {
-            SetCursor(* wxSTANDARD_CURSOR);
-        }
+            OnEnterSash();
     }
     else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING))
     {
@@ -341,7 +376,7 @@ void wxSplitterWindow::OnSize(wxSizeEvent& event)
         parent = parent->GetParent();
     }
 
-    bool iconized = FALSE;
+    bool iconized;
 
     wxTopLevelWindow *winTop = wxDynamicCast(parent, wxTopLevelWindow);
     if ( winTop )
@@ -382,23 +417,25 @@ bool wxSplitterWindow::SashHitTest(int x, int y, int tolerance)
 
     int z = m_splitMode == wxSPLIT_VERTICAL ? x : y;
 
-    return z >= m_sashPosition - tolerance && z <= m_sashPosition + tolerance;
+    return z >= m_sashPosition - tolerance &&
+            z <= m_sashPosition + GetSashSize() + tolerance;
 }
 
 int wxSplitterWindow::GetSashSize() const
 {
-    return wxRendererNative::Get().GetSplitterSashAndBorder(this).x;
+    return wxRendererNative::Get().GetSplitterParams(this).widthSash;
 }
 
 int wxSplitterWindow::GetBorderSize() const
 {
-    return wxRendererNative::Get().GetSplitterSashAndBorder(this).y;
+    return wxRendererNative::Get().GetSplitterParams(this).border;
 }
 
 // Draw the sash
 void wxSplitterWindow::DrawSash(wxDC& dc)
 {
-    wxRendererNative::Get().DrawSplitterBorder
+    if (HasFlag(wxSP_3DBORDER))
+        wxRendererNative::Get().DrawSplitterBorder
                             (
                                 this,
                                 dc,
@@ -413,13 +450,15 @@ void wxSplitterWindow::DrawSash(wxDC& dc)
     if ( HasFlag(wxSP_NOSASH) )
         return;
 
-    wxMirrorDC dcMirror(dc, m_splitMode != wxSPLIT_VERTICAL);
     wxRendererNative::Get().DrawSplitterSash
                             (
                                 this,
-                                dcMirror,
-                                dcMirror.Reflect(GetClientSize()),
-                                m_sashPosition
+                                dc,
+                                GetClientSize(),
+                                m_sashPosition,
+                                m_splitMode == wxSPLIT_VERTICAL ? wxVERTICAL
+                                                                : wxHORIZONTAL,
+                                m_isHot ? wxCONTROL_CURRENT : 0
                             );
 }
 
@@ -681,7 +720,7 @@ bool wxSplitterWindow::Unsplit(wxWindow *toRemove)
     if ( ! IsSplit() )
         return FALSE;
 
-    wxWindow *win = NULL;
+    wxWindow *win;
     if ( toRemove == NULL || toRemove == m_windowTwo)
     {
         win = m_windowTwo ;