X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e2c86ca5c20a2e6a5a22788b431d1419b1adef2..77611ad4da9df336a0805508276a81b8f4437107:/src/generic/splitter.cpp diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index ba57b2732e..6950009cb0 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -21,7 +21,9 @@ #endif #ifndef WX_PRECOMP - #include "wx/wx.h" + #include "wx/window.h" + #include "wx/dialog.h" + #include "wx/frame.h" #endif #include @@ -29,8 +31,8 @@ #include "wx/string.h" #include "wx/splitter.h" #include "wx/dcscreen.h" +#include "wx/settings.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxSplitterWindow, wxWindow) IMPLEMENT_DYNAMIC_CLASS(wxSplitterEvent, wxCommandEvent) @@ -47,7 +49,6 @@ BEGIN_EVENT_TABLE(wxSplitterWindow, wxWindow) EVT_SPLITTER_DCLICK(-1, wxSplitterWindow::OnDoubleClick) EVT_SPLITTER_UNSPLIT(-1, wxSplitterWindow::OnUnsplitEvent) END_EVENT_TABLE() -#endif wxSplitterWindow::wxSplitterWindow() { @@ -161,8 +162,8 @@ void wxSplitterWindow::OnIdle(wxIdleEvent& WXUNUSED(event)) void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { - long x = event.GetX(); - long y = event.GetY(); + wxCoord x = (wxCoord)event.GetX(), + y = (wxCoord)event.GetY(); // reset the cursor #ifdef __WXMOTIF__ @@ -182,12 +183,21 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) m_dragMode = wxSPLIT_DRAG_DRAGGING; if ((GetWindowStyleFlag() & wxSP_LIVE_UPDATE) == 0) - { - DrawSashTracker(x, y); - } - + { + DrawSashTracker(x, y); + } + m_oldX = x; m_oldY = y; + + if ( m_splitMode == wxSPLIT_VERTICAL ) + { + SetCursor(*m_sashCursorWE); + } + else + { + SetCursor(*m_sashCursorNS); + } return; } } @@ -199,9 +209,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) // Erase old tracker if ((GetWindowStyleFlag() & wxSP_LIVE_UPDATE) == 0) - { + { DrawSashTracker(m_oldX, m_oldY); - } + } // Obtain window size. We are only interested in the dimension the sash // splits up @@ -279,8 +289,21 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) } #endif // __WXGTK__ } - else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) + else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) { +#ifdef __WXMSW__ + // Otherwise, the cursor sometimes reverts to the normal cursor + // during dragging. + if ( m_splitMode == wxSPLIT_VERTICAL ) + { + SetCursor(*m_sashCursorWE); + } + else + { + SetCursor(*m_sashCursorNS); + } +#endif + // Obtain window size. We are only interested in the dimension the sash // splits up int new_sash_position = @@ -301,9 +324,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) // Erase old tracker if ((GetWindowStyleFlag() & wxSP_LIVE_UPDATE) == 0) - { + { DrawSashTracker(m_oldX, m_oldY); - } + } if (m_splitMode == wxSPLIT_VERTICAL) x = new_sash_position; @@ -332,14 +355,14 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) // Draw new one if ((GetWindowStyleFlag() & wxSP_LIVE_UPDATE) == 0) - { + { DrawSashTracker(m_oldX, m_oldY); - } - else - { + } + else + { m_sashPosition = new_sash_position; - m_needUpdating = TRUE; - } + m_needUpdating = TRUE; + } } else if ( event.LeftDClick() ) { @@ -373,7 +396,7 @@ void wxSplitterWindow::OnSize(wxSizeEvent& event) if ( dialog ) iconized = dialog->IsIconized(); else - wxFAIL_MSG(_T("should have a top level frame or dialog parent!")); + wxFAIL_MSG(wxT("should have a top level frame or dialog parent!")); } if ( iconized ) @@ -421,8 +444,6 @@ bool wxSplitterWindow::SashHitTest(int x, int y, int tolerance) else return FALSE; } - - return FALSE; } // Draw 3D effect borders @@ -433,7 +454,7 @@ void wxSplitterWindow::DrawBorders(wxDC& dc) if ( GetWindowStyleFlag() & wxSP_3D ) { - + dc.SetPen(*m_facePen); dc.SetBrush(*m_faceBrush); dc.DrawRectangle(1, 1 , w-1, m_borderSize-2 ); //high @@ -489,14 +510,14 @@ void wxSplitterWindow::DrawSash(wxDC& dc) dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.SetPen(*m_lightShadowPen); - int xShadow = m_borderSize ? m_borderSize - 1 : 0 ; + int xShadow = m_borderSize ? m_borderSize - 1 : 0 ; dc.DrawLine(m_sashPosition, xShadow , m_sashPosition, h-m_borderSize); dc.SetPen(*m_hilightPen); dc.DrawLine(m_sashPosition+1, m_borderSize - 2, m_sashPosition+1, h - m_borderSize+2); dc.SetPen(*m_mediumShadowPen); - int yMedium = m_borderSize ? h-m_borderSize+1 : h ; + int yMedium = m_borderSize ? h-m_borderSize+1 : h ; dc.DrawLine(m_sashPosition+m_sashSize-2, xShadow, m_sashPosition+m_sashSize-2, yMedium); dc.SetPen(*m_darkShadowPen); @@ -618,9 +639,7 @@ void wxSplitterWindow::SizeWindows() if ( m_windowOne && !m_windowTwo ) { m_windowOne->SetSize(m_borderSize, m_borderSize, w - 2*m_borderSize, h - 2*m_borderSize); - - if (m_windowOne->GetAutoLayout()) - m_windowOne->Layout(); + } else if ( m_windowOne && m_windowTwo ) { @@ -638,11 +657,7 @@ void wxSplitterWindow::SizeWindows() m_windowOne->SetSize(x1, y1, w1, h1); m_windowTwo->SetSize(x2, y2, w2, h2); - - if (m_windowOne->GetAutoLayout()) - m_windowOne->Layout(); - if (m_windowTwo->GetAutoLayout()) - m_windowTwo->Layout(); + } else { @@ -650,16 +665,12 @@ void wxSplitterWindow::SizeWindows() w - 2*m_borderSize, m_sashPosition - m_borderSize); m_windowTwo->SetSize(m_borderSize, m_sashPosition + m_sashSize, w - 2*m_borderSize, h - 2*m_borderSize - m_sashSize - (m_sashPosition - m_borderSize)); - - if (m_windowOne->GetAutoLayout()) - m_windowOne->Layout(); - if (m_windowTwo->GetAutoLayout()) - m_windowTwo->Layout(); + } } wxClientDC dc(this); - if ( m_borderSize > 0 ) - DrawBorders(dc); + if ( m_borderSize > 0 ) + DrawBorders(dc); DrawSash(dc); } @@ -742,7 +753,7 @@ bool wxSplitterWindow::Unsplit(wxWindow *toRemove) } else { - wxFAIL_MSG(_T("splitter: attempt to remove a non-existent window")); + wxFAIL_MSG(wxT("splitter: attempt to remove a non-existent window")); return FALSE; } @@ -757,8 +768,8 @@ bool wxSplitterWindow::Unsplit(wxWindow *toRemove) // Replace a window with another one bool wxSplitterWindow::ReplaceWindow(wxWindow *winOld, wxWindow *winNew) { - wxCHECK_MSG( winOld, FALSE, _T("use one of Split() functions instead") ); - wxCHECK_MSG( winNew, FALSE, _T("use Unsplit() functions instead") ); + wxCHECK_MSG( winOld, FALSE, wxT("use one of Split() functions instead") ); + wxCHECK_MSG( winNew, FALSE, wxT("use Unsplit() functions instead") ); if ( winOld == m_windowTwo ) { @@ -770,7 +781,7 @@ bool wxSplitterWindow::ReplaceWindow(wxWindow *winOld, wxWindow *winNew) } else { - wxFAIL_MSG(_T("splitter: attempt to replace a non-existent window")); + wxFAIL_MSG(wxT("splitter: attempt to replace a non-existent window")); return FALSE; } @@ -900,8 +911,7 @@ void wxSplitterWindow::OnDoubleClick(wxSplitterEvent& event) // for compatibility, call the virtual function OnDoubleClickSash(event.GetX(), event.GetY()); - if ( GetMinimumPaneSize() == 0 - || m_permitUnsplitAlways) + if ( GetMinimumPaneSize() == 0 || m_permitUnsplitAlways ) { Unsplit(); } @@ -911,8 +921,9 @@ void wxSplitterWindow::OnUnsplitEvent(wxSplitterEvent& event) { wxWindow *win = event.GetWindowBeingRemoved(); + // do it before calling OnUnsplit() which may delete the window + win->Show(FALSE); + // for compatibility, call the virtual function OnUnsplit(win); - - win->Show(FALSE); }