X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/341287bf49066e5dd84e971bd508ee3919ff4b46..f03fc89fff2d6e823e7d4d14fbe14822ad6777b1:/src/generic/sashwin.cpp diff --git a/src/generic/sashwin.cpp b/src/generic/sashwin.cpp index f64ebd1805..32a708730e 100644 --- a/src/generic/sashwin.cpp +++ b/src/generic/sashwin.cpp @@ -32,6 +32,7 @@ #include "wx/string.h" #include "wx/dcscreen.h" #include "wx/sashwin.h" +#include "wx/laywin.h" #if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxSashWindow, wxWindow) @@ -59,8 +60,8 @@ wxSashWindow::wxSashWindow() m_minimumPaneSizeX = 0; m_minimumPaneSizeY = 0; - m_maximumPaneSizeX = 0; - m_maximumPaneSizeY = 0; + m_maximumPaneSizeX = 10000; + m_maximumPaneSizeY = 10000; } wxSashWindow::wxSashWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, @@ -77,8 +78,8 @@ wxSashWindow::wxSashWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_extraBorderSize = 0; m_minimumPaneSizeX = 0; m_minimumPaneSizeY = 0; - m_maximumPaneSizeX = 0; - m_maximumPaneSizeY = 0; + m_maximumPaneSizeX = 10000; + m_maximumPaneSizeY = 10000; m_sashCursorWE = new wxCursor(wxCURSOR_SIZEWE); m_sashCursorNS = new wxCursor(wxCURSOR_SIZENS); @@ -96,10 +97,8 @@ void wxSashWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); -#if 0 - if ( m_borderSize > 0 ) - DrawBorders(dc); -#endif + // if ( m_borderSize > 0 ) + DrawBorders(dc); DrawSashes(dc); } @@ -111,17 +110,33 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) wxSashEdgePosition sashHit = SashHitTest(x, y); + // reset the cursor +#ifdef __WXMOTIF__ + SetCursor(* wxSTANDARD_CURSOR); +#endif +#ifdef __WXMSW__ + SetCursor(wxCursor()); +#endif + if (event.LeftDown()) { if ( sashHit != wxSASH_NONE ) { - CaptureMouse(); + 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); + // that we wish to draw on top of all windows + // - and we optimise by specifying the area + // for creating the overlap window. + // Find the first frame or dialog and use this to specify + // the area to draw on. + wxWindow* parent = this; + + while (parent && !parent->IsKindOf(CLASSINFO(wxDialog)) && + !parent->IsKindOf(CLASSINFO(wxFrame))) + parent = parent->GetParent(); + + wxScreenDC::StartDrawingOnTop(parent); // We don't say we're dragging yet; we leave that // decision for the Dragging() branch, to ensure @@ -139,8 +154,6 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) wxScreenDC::EndDrawingOnTop(); m_dragMode = wxSASH_DRAG_NONE; m_draggingEdge = wxSASH_NONE; - - SetCursor(*wxSTANDARD_CURSOR); } else if (event.LeftUp() && m_dragMode == wxSASH_DRAG_DRAGGING) { @@ -171,6 +184,8 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) if (y > (yp + h)) status = wxSASH_STATUS_OUT_OF_RANGE; int newHeight = (h - y); + newHeight=wxMax(newHeight,m_minimumPaneSizeY); + newHeight=wxMin(newHeight,m_maximumPaneSizeY); dragRect = wxRect(xp, (yp + h) - newHeight, w, newHeight); break; } @@ -179,6 +194,8 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) if (y < 0) status = wxSASH_STATUS_OUT_OF_RANGE; int newHeight = y; + newHeight=wxMax(newHeight,m_minimumPaneSizeY); + newHeight=wxMin(newHeight,m_maximumPaneSizeY); dragRect = wxRect(xp, yp, w, newHeight); break; } @@ -187,6 +204,8 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) if (x > (xp + w)) status = wxSASH_STATUS_OUT_OF_RANGE; int newWidth = (w - x); + newWidth=wxMax(newWidth,m_minimumPaneSizeX); + newWidth=wxMin(newWidth,m_maximumPaneSizeX); dragRect = wxRect((xp + w) - newWidth, yp, newWidth, h); break; } @@ -195,6 +214,8 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) if (x < 0) status = wxSASH_STATUS_OUT_OF_RANGE; int newWidth = x; + newWidth=wxMax(newWidth,m_minimumPaneSizeX); + newWidth=wxMin(newWidth,m_maximumPaneSizeX); dragRect = wxRect(xp, yp, newWidth, h); break; } @@ -224,10 +245,6 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) SetCursor(*m_sashCursorNS); } } - else - { - SetCursor(*wxSTANDARD_CURSOR); - } } else if ( event.Dragging() && ((m_dragMode == wxSASH_DRAG_DRAGGING) || (m_dragMode == wxSASH_DRAG_LEFT_DOWN)) @@ -310,7 +327,7 @@ wxSashEdgePosition wxSashWindow::SashHitTest(int x, int y, int WXUNUSED(toleranc } case wxSASH_LEFT: { - if ((x >= GetEdgeMargin(position)) && (x >= 0)) + if ((x <= GetEdgeMargin(position)) && (x >= 0)) return wxSASH_LEFT; break; } @@ -519,9 +536,9 @@ void wxSashWindow::SizeWindows() int cw, ch; GetClientSize(&cw, &ch); - if (GetChildren()->Number() > 0) + if (GetChildren().Number() == 1) { - wxWindow* child = (wxWindow*) (GetChildren()->First()->Data()); + wxWindow* child = (wxWindow*) (GetChildren().First()->Data()); int x = 0; int y = 0; @@ -560,6 +577,16 @@ void wxSashWindow::SizeWindows() child->SetSize(x, y, width, height); } + else if (GetChildren().Number() > 1) + { + // Perhaps multiple children are themselves sash windows. + // TODO: this doesn't really work because the subwindows sizes/positions + // must be set to leave a gap for the parent's sash (hit-test and decorations). + // Perhaps we can allow for this within LayoutWindow, testing whether the parent + // is a sash window, and if so, allowing some space for the edges. + wxLayoutAlgorithm layout; + layout.LayoutWindow(this); + } wxClientDC dc(this); DrawBorders(dc);