X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d559d69c8115c8aaabba70f37d49b4effbc2ab2..750b78ba359e7d30c7d3ad49d268923e986268cb:/src/generic/splitter.cpp diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index 7f631aa457..d43a1244d3 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -152,41 +152,23 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { 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; + m_dragMode = wxSPLIT_DRAG_DRAGGING; + + DrawSashTracker(x, y); + m_oldX = x; + m_oldY = y; + return; } } - else if ( event.LeftUp() && m_dragMode == wxSPLIT_DRAG_LEFT_DOWN ) - { - // Wasn't a proper drag - ReleaseMouse(); - wxScreenDC::EndDrawingOnTop(); - m_dragMode = wxSPLIT_DRAG_NONE; - - SetCursor(*wxSTANDARD_CURSOR); - } 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 +199,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) m_sashPosition = x; } } - else + else // m_splitMode == wxSPLIT_VERTICAL { if ( !OnSashPositionChange(y) ) return; @@ -244,9 +226,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 @@ -266,37 +248,14 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) 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 +263,6 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { OnDoubleClickSash(x, y); } - else - { - } } void wxSplitterWindow::OnSize(wxSizeEvent& WXUNUSED(event)) @@ -631,25 +587,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; } @@ -676,12 +661,12 @@ bool wxSplitterWindow::OnSashPositionChange(int newSashPosition) if ( m_splitMode == wxSPLIT_VERTICAL ) { - if ( h - newSashPosition < m_minimumPaneSize ) + if ( w - newSashPosition < m_minimumPaneSize ) return FALSE; } else // m_splitMode = wxSPLIT_HORIZONTAL { - if ( w - newSashPosition < m_minimumPaneSize ) + if ( h - newSashPosition < m_minimumPaneSize ) return FALSE; }