]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxSizer::Get/SetContainingWindow()
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 4 Sep 2006 12:05:49 +0000 (12:05 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 4 Sep 2006 12:05:49 +0000 (12:05 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40992 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/sizer.tex
include/wx/sizer.h
src/common/sizer.cpp
src/common/wincmn.cpp

index 50a7756a8256c1e89a1baf775590366f74c1af09..c1961173964c495e6d52732df1bee9cb03f329cf 100644 (file)
@@ -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}}
index 9044840a99ddec46a9a1a4ef0974e08bb061f074..baf079bd7defdf7968e8339bc695ed5d6fbaa3d4 100644 (file)
@@ -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;
index d645137e7c3b6220a5c52100cd2eff2b9da189c6..89778aa339e9dc3a441e4cee76bb61f183455874 100644 (file)
@@ -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;
 }
index 82aa246a647b75e0aa6bd3247f77357cd257bc4a..fd9f090d5eabb1417fafd02facca0b9334a61be9 100644 (file)
@@ -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)