X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b3208e1158e3bbc38b73eeda606d92be9e649c1c..a333f34d91ae845d39ca8a833290e9a1c3d04749:/src/generic/splitter.cpp?ds=sidebyside diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 588657f137..7f7db32428 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -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 ;