X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b3208e1158e3bbc38b73eeda606d92be9e649c1c..1978421a6d8b81c1f8a961da4b8ddf544fec7b1b:/src/generic/splitter.cpp diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 588657f137..078cdb7f7b 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) @@ -110,6 +119,7 @@ void wxSplitterWindow::Init() m_sashTrackerPen = new wxPen(*wxBLACK, 2, wxSOLID); m_needUpdating = FALSE; + m_isHot = false; } wxSplitterWindow::~wxSplitterWindow() @@ -117,12 +127,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 +297,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)) { @@ -382,23 +421,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 +454,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 ); }