X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6aa89a22b8e47000c98bff05c6f545f331f1c353..570aaadf1ff3f8c3f8ecfea44dbeae64532c82c4:/src/generic/splitter.cpp diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 2927eacbdb..6c5965e49a 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -16,6 +16,7 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if wxUSE_SPLITTER #ifdef __BORLANDC__ #pragma hdrstop #endif @@ -49,10 +50,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxSplitterEvent, wxNotifyEvent) BEGIN_EVENT_TABLE(wxSplitterWindow, wxWindow) EVT_PAINT(wxSplitterWindow::OnPaint) EVT_SIZE(wxSplitterWindow::OnSize) - EVT_IDLE(wxSplitterWindow::OnIdle) EVT_MOUSE_EVENTS(wxSplitterWindow::OnMouseEvent) -#ifdef __WXMSW__ +#if defined( __WXMSW__ ) || defined( __WXMAC__) EVT_SET_CURSOR(wxSplitterWindow::OnSetCursor) #endif // wxMSW @@ -155,12 +155,12 @@ void wxSplitterWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) DrawSash(dc); } -void wxSplitterWindow::OnIdle(wxIdleEvent& event) +void wxSplitterWindow::OnInternalIdle() { + wxWindow::OnInternalIdle(); + if (m_needUpdating) SizeWindows(); - - event.Skip(); } void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) @@ -168,11 +168,8 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) int x = (int)event.GetX(), y = (int)event.GetY(); - // reset the cursor -#if defined( __WXMOTIF__ ) || defined( __WXGTK__ ) || defined( __WXMAC__ ) - SetCursor(* wxSTANDARD_CURSOR); -#elif defined(__WXMSW__) - SetCursor(wxCursor()); +#if defined(__WXMSW__) + // SetCursor(wxCursor()); // Is this required? #endif if (GetWindowStyle() & wxSP_NOSASH) @@ -188,9 +185,12 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { if ( SashHitTest(x, y) ) { - CaptureMouse(); - + // Start the drag now m_dragMode = wxSPLIT_DRAG_DRAGGING; + + // Capture mouse and set the cursor + CaptureMouse(); + SetResizeCursor(); if ( !isLive ) { @@ -212,7 +212,10 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { // We can stop dragging now and see what we've got. m_dragMode = wxSPLIT_DRAG_NONE; + + // Release mouse and unset the cursor ReleaseMouse(); + SetCursor(* wxSTANDARD_CURSOR); // exit if unsplit after doubleclick if ( !IsSplit() ) @@ -249,6 +252,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) m_windowOne = m_windowTwo; m_windowTwo = (wxWindow *) NULL; OnUnsplit(removedWindow); + wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); + event.m_data.win = removedWindow; + (void)DoSendEvent(event); SetSashPositionAndNotify(0); } else if ( posSashNew == GetWindowSize() ) @@ -257,6 +263,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) wxWindow *removedWindow = m_windowTwo; m_windowTwo = (wxWindow *) NULL; OnUnsplit(removedWindow); + wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); + event.m_data.win = removedWindow; + (void)DoSendEvent(event); SetSashPositionAndNotify(0); } else @@ -271,34 +280,20 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) SizeWindows(); } // left up && dragging - else if (event.Moving() && !event.Dragging()) + else if ((event.Moving() || event.Leaving() || event.Entering()) && (m_dragMode == wxSPLIT_DRAG_NONE)) { - // Just change the cursor if required - if ( SashHitTest(x, y) ) + // Just change the cursor as required + if ( !event.Leaving() && SashHitTest(x, y) ) { SetResizeCursor(); } -#if defined(__WXGTK__) || defined(__WXMSW__) || defined(__WXMAC__) else { - // We must set the normal cursor in MSW, because - // if the child window doesn't have a cursor, the - // parent's (splitter window) will be used, and this - // must be the standard cursor. - - // where else do we unset the cursor? SetCursor(* wxSTANDARD_CURSOR); } -#endif // __WXGTK__ } else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) { -#if defined( __WXMSW__ ) || defined( __WXMAC__ ) - // Otherwise, the cursor sometimes reverts to the normal cursor - // during dragging. - SetResizeCursor(); -#endif // __WXMSW__ - int diff = m_splitMode == wxSPLIT_VERTICAL ? x - m_oldX : y - m_oldY; if ( !diff ) { @@ -358,7 +353,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) m_needUpdating = TRUE; } } - else if ( event.LeftDClick() ) + else if ( event.LeftDClick() && m_windowTwo ) { OnDoubleClickSash(x, y); } @@ -1062,6 +1057,8 @@ int wxSplitterWindow::OnSashPositionChanging(int newSashPosition) // the sash if the minimum pane size is zero. void wxSplitterWindow::OnDoubleClickSash(int x, int y) { + wxCHECK_RET(m_windowTwo, wxT("splitter: no window to remove")); + // new code should handle events instead of using the virtual functions wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_DOUBLECLICKED, this); event.m_data.pt.x = x; @@ -1070,7 +1067,13 @@ void wxSplitterWindow::OnDoubleClickSash(int x, int y) { if ( GetMinimumPaneSize() == 0 || m_permitUnsplitAlways ) { - Unsplit(); + wxWindow* win = m_windowTwo; + if ( Unsplit(win) ) + { + wxSplitterEvent unsplitEvent(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); + unsplitEvent.m_data.win = win; + (void)DoSendEvent(unsplitEvent); + } } } //else: blocked by user @@ -1078,16 +1081,11 @@ void wxSplitterWindow::OnDoubleClickSash(int x, int y) void wxSplitterWindow::OnUnsplit(wxWindow *winRemoved) { - // do it before calling the event handler which may delete the window + // call this before calling the event handler which may delete the window winRemoved->Show(FALSE); - - wxSplitterEvent event(wxEVT_COMMAND_SPLITTER_UNSPLIT, this); - event.m_data.win = winRemoved; - - (void)DoSendEvent(event); } -#ifdef __WXMSW__ +#if defined( __WXMSW__ ) || defined( __WXMAC__) // this is currently called (and needed) under MSW only... void wxSplitterWindow::OnSetCursor(wxSetCursorEvent& event) @@ -1104,5 +1102,6 @@ void wxSplitterWindow::OnSetCursor(wxSetCursorEvent& event) //else: do nothing, in particular, don't call Skip() } +#endif // wxUSE_SPLITTER #endif // wxMSW