From e8cfff879ef8f5fdf7323010c244cfb8cfcedc84 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 4 Sep 2006 12:05:49 +0000 Subject: [PATCH] added wxSizer::Get/SetContainingWindow() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40992 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/sizer.tex | 7 +++++++ include/wx/sizer.h | 9 ++++++++- src/common/sizer.cpp | 31 +++++++++++++++++++++++++++---- src/common/wincmn.cpp | 15 ++++++++++++--- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/docs/latex/wx/sizer.tex b/docs/latex/wx/sizer.tex index 50a7756a82..c196117396 100644 --- a/docs/latex/wx/sizer.tex +++ b/docs/latex/wx/sizer.tex @@ -233,6 +233,13 @@ windows which manage it. \helpref{wxSizer::SetVirtualSizeHints}{wxsizersetvirtualsizehints} +\membersection{wxSizer::GetContainingWindow}\label{wxsizergetcontainingwindow} + +\constfunc{wxWindow *}{GetContainingWindow}{\void} + +Returns the window this sizer is used in or \NULL if none. + + \membersection{wxSizer::GetItem}\label{wxsizergetitem} \func{wxSizerItem *}{GetItem}{\param{wxWindow* }{window}, \param{bool }{recursive = false}} diff --git a/include/wx/sizer.h b/include/wx/sizer.h index 9044840a99..baf079bd7d 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -329,7 +329,7 @@ WX_DECLARE_EXPORTED_LIST( wxSizerItem, wxSizerItemList ); class WXDLLEXPORT wxSizer: public wxObject, public wxClientDataContainer { public: - wxSizer() { } + wxSizer() { m_containingWindow = NULL; } ~wxSizer(); // methods for adding elements to the sizer: there are Add/Insert/Prepend @@ -410,6 +410,10 @@ public: inline wxSizerItem* PrependSpacer(int size); inline wxSizerItem* PrependStretchSpacer(int prop = 1); + // set (or possibly unset if window is NULL) or get the window this sizer + // is used in + void SetContainingWindow(wxWindow *window); + wxWindow *GetContainingWindow() const { return m_containingWindow; } #if WXWIN_COMPATIBILITY_2_6 // Deprecated in 2.6 since historically it does not delete the window, @@ -508,6 +512,9 @@ protected: wxPoint m_position; wxSizerItemList m_children; + // the window this sizer is used in, can be NULL + wxWindow *m_containingWindow; + wxSize GetMaxWindowSize( wxWindow *window ) const; wxSize GetMinWindowSize( wxWindow *window ); wxSize GetMaxClientSize( wxWindow *window ) const; diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index d645137e7c..89778aa339 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -506,6 +506,29 @@ wxSizerItem* wxSizer::Insert( size_t index, wxSizerItem *item ) return item; } +void wxSizer::SetContainingWindow(wxWindow *win) +{ + if ( win == m_containingWindow ) + return; + + m_containingWindow = win; + + // set the same window for all nested sizers as well, they also are in the + // same window + for ( wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); + node; + node = node->GetNext() ) + { + wxSizerItem *const item = node->GetData(); + wxSizer *const sizer = item->GetSizer(); + + if ( sizer ) + { + sizer->SetContainingWindow(win); + } + } +} + #if WXWIN_COMPATIBILITY_2_6 bool wxSizer::Remove( wxWindow *window ) { @@ -643,7 +666,7 @@ bool wxSizer::Replace( wxWindow *oldwin, wxWindow *newwin, bool recursive ) if (item->GetSizer()->Replace( oldwin, newwin, true )) return true; } - + node = node->GetNext(); } @@ -671,8 +694,8 @@ bool wxSizer::Replace( wxSizer *oldsz, wxSizer *newsz, bool recursive ) { if (item->GetSizer()->Replace( oldsz, newsz, true )) return true; - } - + } + node = node->GetNext(); } @@ -690,7 +713,7 @@ bool wxSizer::Replace( size_t old, wxSizerItem *newitem ) wxSizerItem *item = node->GetData(); node->SetData(newitem); - delete item; + delete item; return true; } diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 82aa246a64..fd9f090d5e 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -1650,12 +1650,21 @@ void wxWindowBase::SetSizer(wxSizer *sizer, bool deleteOld) if ( sizer == m_windowSizer) return; - if ( deleteOld ) - delete m_windowSizer; + if ( m_windowSizer ) + { + m_windowSizer->SetContainingWindow(NULL); + + if ( deleteOld ) + delete m_windowSizer; + } m_windowSizer = sizer; + if ( m_windowSizer ) + { + m_windowSizer->SetContainingWindow((wxWindow *)this); + } - SetAutoLayout( sizer != NULL ); + SetAutoLayout(m_windowSizer != NULL); } void wxWindowBase::SetSizerAndFit(wxSizer *sizer, bool deleteOld) -- 2.45.2