X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/27529614c292a298e67dd8db1f169c94a4df204c..e459f82d0110709444984bf739314f4a84de48d3:/src/generic/laywin.cpp diff --git a/src/generic/laywin.cpp b/src/generic/laywin.cpp index c3b2c3fd96..6b9ee02ebc 100644 --- a/src/generic/laywin.cpp +++ b/src/generic/laywin.cpp @@ -48,16 +48,13 @@ wxSashLayoutWindow::wxSashLayoutWindow(wxWindow *parent, wxWindowID id, const wx m_alignment = wxLAYOUT_TOP; } -// These are the functions that wxWin will call to ascertain the window +// This is the function that wxLayoutAlgorithm calls to ascertain the window // dimensions. void wxSashLayoutWindow::OnQueryLayoutInfo(wxQueryLayoutInfoEvent& event) { - int flags = event.GetFlags(); + // int flags = event.GetFlags(); int requestedLength = event.GetRequestedLength(); - // This code won't be in the final thing, it's just so we don't have to give it - // real windows: mock up some dimensions. - event.SetOrientation(m_orientation); event.SetAlignment(m_alignment); @@ -69,7 +66,6 @@ void wxSashLayoutWindow::OnQueryLayoutInfo(wxQueryLayoutInfoEvent& event) // Called by parent to allow window to take a bit out of the // client rectangle, and size itself if not in wxLAYOUT_QUERY mode. -// Will eventually be an event. void wxSashLayoutWindow::OnCalculateLayout(wxCalculateLayoutEvent& event) { @@ -145,6 +141,11 @@ void wxSashLayoutWindow::OnCalculateLayout(wxCalculateLayoutEvent& event) clientSize.height -= thisRect.height; break; } + case wxLAYOUT_NONE: + { + break; + } + } if ((flags & wxLAYOUT_QUERY) == 0) @@ -163,17 +164,19 @@ void wxSashLayoutWindow::OnCalculateLayout(wxCalculateLayoutEvent& event) // Lays out windows for an MDI frame. The MDI client area gets what's left // over. -bool wxLayoutAlgorithm::LayoutMDIFrame(wxMDIParentFrame* frame) +bool wxLayoutAlgorithm::LayoutMDIFrame(wxMDIParentFrame* frame, wxRect* r) { int cw, ch; frame->GetClientSize(& cw, & ch); wxRect rect(0, 0, cw, ch); + if (r) + rect = * r; wxCalculateLayoutEvent event; event.SetRect(rect); - wxNode* node = frame->GetChildren()->First(); + wxNode* node = frame->GetChildren().First(); while (node) { wxWindow* win = (wxWindow*) node->Data(); @@ -196,18 +199,41 @@ bool wxLayoutAlgorithm::LayoutMDIFrame(wxMDIParentFrame* frame) return TRUE; } -// Layout algorithm for normal frame. mainWindow gets what's left over. -bool wxLayoutAlgorithm::LayoutFrame(wxFrame* frame, wxWindow* mainWindow) +// Layout algorithm for any window. mainWindow gets what's left over. +bool wxLayoutAlgorithm::LayoutWindow(wxWindow* parent, wxWindow* mainWindow) { + // Test if the parent is a sash window, and if so, + // reduce the available space to allow space for any active edges. + + int leftMargin = 0, rightMargin = 0, topMargin = 0, bottomMargin = 0; + if (parent->IsKindOf(CLASSINFO(wxSashWindow))) + { + wxSashWindow* sashWindow = (wxSashWindow*) parent; + + leftMargin = sashWindow->GetExtraBorderSize(); + rightMargin = sashWindow->GetExtraBorderSize(); + topMargin = sashWindow->GetExtraBorderSize(); + bottomMargin = sashWindow->GetExtraBorderSize(); + + if (sashWindow->GetSashVisible(wxSASH_LEFT)) + leftMargin += sashWindow->GetDefaultBorderSize(); + if (sashWindow->GetSashVisible(wxSASH_RIGHT)) + rightMargin += sashWindow->GetDefaultBorderSize(); + if (sashWindow->GetSashVisible(wxSASH_TOP)) + topMargin += sashWindow->GetDefaultBorderSize(); + if (sashWindow->GetSashVisible(wxSASH_BOTTOM)) + bottomMargin += sashWindow->GetDefaultBorderSize(); + } + int cw, ch; - frame->GetClientSize(& cw, & ch); + parent->GetClientSize(& cw, & ch); - wxRect rect(0, 0, cw, ch); + wxRect rect(leftMargin, topMargin, cw - leftMargin - rightMargin, ch - topMargin - bottomMargin); wxCalculateLayoutEvent event; event.SetRect(rect); - wxNode* node = frame->GetChildren()->First(); + wxNode* node = parent->GetChildren().First(); while (node) { wxWindow* win = (wxWindow*) node->Data(); @@ -223,7 +249,8 @@ bool wxLayoutAlgorithm::LayoutFrame(wxFrame* frame, wxWindow* mainWindow) rect = event.GetRect(); - mainWindow->SetSize(rect.x, rect.y, rect.width, rect.height); + if (mainWindow) + mainWindow->SetSize(rect.x, rect.y, rect.width, rect.height); return TRUE; }