X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a6d7030871f1376e727902c93f5537165a305e08..c8b4eea8f23cd90e8b8390f2a742f0f828c57461:/src/generic/laywin.cpp diff --git a/src/generic/laywin.cpp b/src/generic/laywin.cpp index 1f2094ed20..2c9afa2c7d 100644 --- a/src/generic/laywin.cpp +++ b/src/generic/laywin.cpp @@ -9,9 +9,13 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ +#pragma implementation "laywin.h" +#endif + // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -29,6 +33,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxQueryLayoutInfoEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxCalculateLayoutEvent, wxEvent) +#if wxUSE_SASH IMPLEMENT_CLASS(wxSashLayoutWindow, wxSashWindow) BEGIN_EVENT_TABLE(wxSashLayoutWindow, wxSashWindow) @@ -44,16 +49,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); @@ -65,7 +67,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) { @@ -141,6 +142,11 @@ void wxSashLayoutWindow::OnCalculateLayout(wxCalculateLayoutEvent& event) clientSize.height -= thisRect.height; break; } + case wxLAYOUT_NONE: + { + break; + } + } if ((flags & wxLAYOUT_QUERY) == 0) @@ -152,6 +158,7 @@ void wxSashLayoutWindow::OnCalculateLayout(wxCalculateLayoutEvent& event) event.SetRect(clientSize); } +#endif // wxUSE_SASH /* * wxLayoutAlgorithm @@ -159,17 +166,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(); @@ -192,18 +201,43 @@ 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 wxUSE_SASH + 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(); + } +#endif // wxUSE_SASH + 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(); @@ -219,7 +253,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; }