X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/62dc9cb4f159e2d4cac08308b96e63238935e6bb..a333f34d91ae845d39ca8a833290e9a1c3d04749:/src/generic/splitter.cpp diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 70fbed666e..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 @@ -48,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) @@ -77,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; @@ -109,6 +115,7 @@ void wxSplitterWindow::Init() m_sashTrackerPen = new wxPen(*wxBLACK, 2, wxSOLID); m_needUpdating = FALSE; + m_isHot = false; } wxSplitterWindow::~wxSplitterWindow() @@ -116,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); @@ -252,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)) { @@ -340,7 +376,7 @@ void wxSplitterWindow::OnSize(wxSizeEvent& event) parent = parent->GetParent(); } - bool iconized = FALSE; + bool iconized; wxTopLevelWindow *winTop = wxDynamicCast(parent, wxTopLevelWindow); if ( winTop ) @@ -387,18 +423,19 @@ bool wxSplitterWindow::SashHitTest(int x, int y, int 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, @@ -419,9 +456,9 @@ void wxSplitterWindow::DrawSash(wxDC& dc) dc, GetClientSize(), m_sashPosition, - m_splitMode == wxSPLIT_VERTICAL - ? wxVERTICAL - : wxHORIZONTAL + m_splitMode == wxSPLIT_VERTICAL ? wxVERTICAL + : wxHORIZONTAL, + m_isHot ? wxCONTROL_CURRENT : 0 ); } @@ -683,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 ;