From e8cfff879ef8f5fdf7323010c244cfb8cfcedc84 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
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.50.0

