X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f4a4bd13d46c34069661766e9d3d2cfbdd0dbb86..e296ac9f3d5fb224e0717b2ff410b913905f6b5f:/src/generic/splitter.cpp diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index bc24c4bae5..0288be3808 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -6,23 +6,22 @@ // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation "splitter.h" -// #pragma interface + #pragma implementation "splitter.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP -#include "wx/wx.h" + #include "wx/wx.h" #endif #include @@ -146,47 +145,37 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) long x, y; event.Position(&x, &y); + // reset the cursor +#ifdef __WXMOTIF__ + SetCursor(* wxSTANDARD_CURSOR); +#endif +#ifdef __WXMSW__ + SetCursor(wxCursor()); +#endif + if (event.LeftDown()) { if ( SashHitTest(x, y) ) { CaptureMouse(); - // Required for X to specify that - // that we wish to draw on top of all windows - // - and we optimise by specifying the area - // for creating the overlap window. - wxScreenDC::StartDrawingOnTop(this); - - // We don't say we're dragging yet; we leave that - // decision for the Dragging() branch, to ensure - // the user has dragged a little bit. - m_dragMode = wxSPLIT_DRAG_LEFT_DOWN; - m_firstX = x; - m_firstY = y; - } - } - else if ( event.LeftUp() && m_dragMode == wxSPLIT_DRAG_LEFT_DOWN ) - { - // Wasn't a proper drag - ReleaseMouse(); - wxScreenDC::EndDrawingOnTop(); - m_dragMode = wxSPLIT_DRAG_NONE; + m_dragMode = wxSPLIT_DRAG_DRAGGING; - SetCursor(*wxSTANDARD_CURSOR); + DrawSashTracker(x, y); + m_oldX = x; + m_oldY = y; + return; + } } else if (event.LeftUp() && m_dragMode == wxSPLIT_DRAG_DRAGGING) { // We can stop dragging now and see what we've got. m_dragMode = wxSPLIT_DRAG_NONE; ReleaseMouse(); + // Erase old tracker DrawSashTracker(m_oldX, m_oldY); - // End drawing on top (frees the window used for drawing - // over the screen) - wxScreenDC::EndDrawingOnTop(); - int w, h; GetClientSize(&w, &h); if ( m_splitMode == wxSPLIT_VERTICAL ) @@ -217,7 +206,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) m_sashPosition = x; } } - else + else // m_splitMode == wxSPLIT_VERTICAL { if ( !OnSashPositionChange(y) ) return; @@ -244,9 +233,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { m_sashPosition = y; } - } + } // m_splitMode == wxSPLIT_VERTICAL SizeWindows(); - } + } // left up && dragging else if (event.Moving() && !event.Dragging()) { // Just change the cursor if required @@ -261,42 +250,15 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) SetCursor(*m_sashCursorNS); } } - else - { - SetCursor(*wxSTANDARD_CURSOR); - } } - else if ( (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) || - (event.Dragging() && SashHitTest(x, y, 4)) ) + else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) { - if ( m_splitMode == wxSPLIT_VERTICAL ) - { - SetCursor(*m_sashCursorWE); - } - else - { - SetCursor(*m_sashCursorNS); - } - - // Detect that this is really a drag: we've moved more than 1 pixel either way - if ((m_dragMode == wxSPLIT_DRAG_LEFT_DOWN) && -// (abs((int)x - m_firstX) > 1 || abs((int)y - m_firstY) > 1) ) - (abs((int)x - m_firstX) > 0 || abs((int)y - m_firstY) > 1) ) - { - m_dragMode = wxSPLIT_DRAG_DRAGGING; - DrawSashTracker(x, y); - } - else - { - if ( m_dragMode == wxSPLIT_DRAG_DRAGGING ) - { - // Erase old tracker - DrawSashTracker(m_oldX, m_oldY); + // Erase old tracker + DrawSashTracker(m_oldX, m_oldY); + + // Draw new one + DrawSashTracker(x, y); - // Draw new one - DrawSashTracker(x, y); - } - } m_oldX = x; m_oldY = y; } @@ -304,9 +266,6 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { OnDoubleClickSash(x, y); } - else - { - } } void wxSplitterWindow::OnSize(wxSizeEvent& WXUNUSED(event)) @@ -631,25 +590,54 @@ bool wxSplitterWindow::Unsplit(wxWindow *toRemove) if ( ! IsSplit() ) return FALSE; + wxWindow *win = NULL; if ( toRemove == NULL || toRemove == m_windowTwo) { - wxWindow *win = m_windowTwo ; + win = m_windowTwo ; m_windowTwo = (wxWindow *) NULL; - m_sashPosition = 0; - OnUnsplit(win); - SizeWindows(); } else if ( toRemove == m_windowOne ) { - wxWindow *win = m_windowOne ; + win = m_windowOne ; m_windowOne = m_windowTwo; m_windowTwo = (wxWindow *) NULL; - m_sashPosition = 0; - OnUnsplit(win); - SizeWindows(); } else + { + wxFAIL_MSG("splitter: attempt to remove a non-existent window"); + return FALSE; + } + + OnUnsplit(win); + m_sashPosition = 0; + SizeWindows(); + + return TRUE; +} + +// Replace a window with another one +bool wxSplitterWindow::ReplaceWindow(wxWindow *winOld, wxWindow *winNew) +{ + wxCHECK_MSG( winOld, FALSE, "use one of Split() functions instead" ); + wxCHECK_MSG( winNew, FALSE, "use Unsplit() functions instead" ); + + if ( winOld == m_windowTwo ) + { + m_windowTwo = winNew; + } + else if ( winOld == m_windowOne ) + { + m_windowOne = winNew; + } + else + { + wxFAIL_MSG("splitter: attempt to replace a non-existent window"); + + return FALSE; + } + + SizeWindows(); return TRUE; }