From 8b2bac626c3fb981dad0d3e6d04a9b16744022d6 Mon Sep 17 00:00:00 2001
From: =?utf8?q?W=C5=82odzimierz=20Skiba?= <abx@abx.art.pl>
Date: Mon, 13 Sep 2004 13:46:45 +0000
Subject: [PATCH] Recursive wxSizer::Show for subsizer and return value if
 element was found.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29120 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt        |   3 +-
 docs/latex/wx/sizer.tex |   9 ++--
 include/wx/sizer.h      |  30 +++++------
 src/common/sizer.cpp    | 109 ++++++++++++++++++++++++----------------
 4 files changed, 88 insertions(+), 63 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index 84a7a1a586..ab450d5a7d 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -207,7 +207,6 @@ All:
 - added wxMicroSleep() and wxMilliSleep() replacing deprecated wxUsleep()
 - basic UDP sockets support (Lenny Maiorani)
 - fixed wxDateTime::GetWeekDayName() for some dates (Daniel Kaps)
-- support for comma in contrib gizmo wxLEDNumberCtrl (Grant Likely)
 - deprecated wxDateTime::SetToTheWeek() in favour of SetToWeekOfYear()
 
 All (GUI):
@@ -226,6 +225,8 @@ All (GUI):
 - added samples/splash
 - added support for stock buttons
 - added wxTopLevelWindow::RequestUserAttention()
+- support for comma in contrib gizmo wxLEDNumberCtrl (Grant Likely)
+- recursive wxSizer::Show for subsizer and return value if element was found
 
 Unix:
 
diff --git a/docs/latex/wx/sizer.tex b/docs/latex/wx/sizer.tex
index 4c0c69cf1a..77515c4697 100644
--- a/docs/latex/wx/sizer.tex
+++ b/docs/latex/wx/sizer.tex
@@ -391,14 +391,17 @@ minimal size. For windows with managed scrollbars this will set them appropriate
 
 \membersection{wxSizer::Show}\label{wxsizershow}
 
-\func{void}{Show}{\param{wxWindow* }{window}, \param{bool }{show = true}}
+\func{bool}{Show}{\param{wxWindow* }{window}, \param{bool }{show = true}, \param{bool }{recursive = false}}
 
-\func{void}{Show}{\param{wxSizer* }{sizer}, \param{bool }{show = true}}
+\func{bool}{Show}{\param{wxSizer* }{sizer}, \param{bool }{show = true}, \param{bool }{recursive = false}}
 
-\func{void}{Show}{\param{size\_t }{index}, \param{bool }{show = true}}
+\func{bool}{Show}{\param{size\_t }{index}, \param{bool }{show = true}}
 
 Shows or hides the {\it window}, {\it sizer}, or item at {\it index}.
 To make a sizer item disappear or reappear, use Show() followed by Layout().
+Use parameter {\it recursive} to show or hide elements found in subsizers.
+
+Returns true if the child item was found, false otherwise.
 
 Note that this only works with wxBoxSizer and wxFlexGridSizer, since they
 are the only two sizer classes that can size rows/columns independently.
diff --git a/include/wx/sizer.h b/include/wx/sizer.h
index 86550a0e9a..425ef0af1f 100644
--- a/include/wx/sizer.h
+++ b/include/wx/sizer.h
@@ -80,10 +80,10 @@ public:
     void SetMinSize(const wxSize& size)
         {
             if (IsWindow()) m_window->SetMinSize(size);
-            m_minSize = size;            
+            m_minSize = size;
         }
     void SetMinSize( int x, int y )
-        { SetMinSize(wxSize(x, y)); }    
+        { SetMinSize(wxSize(x, y)); }
     void SetInitSize( int x, int y )
         { SetMinSize(wxSize(x, y)); }
 
@@ -308,16 +308,16 @@ public:
 
     // Manage whether individual scene items are considered
     // in the layout calculations or not.
-    void Show( wxWindow *window, bool show = true );
-    void Show( wxSizer *sizer, bool show = true );
-    void Show( size_t index, bool show = true );
+    bool Show( wxWindow *window, bool show = true, bool recursive = false );
+    bool Show( wxSizer *sizer, bool show = true, bool recursive = false );
+    bool Show( size_t index, bool show = true );
 
-    void Hide( wxSizer *sizer )
-        { Show( sizer, false ); }
-    void Hide( wxWindow *window )
-        { Show( window, false ); }
-    void Hide( size_t index )
-        { Show( index, false ); }
+    bool Hide( wxSizer *sizer, bool recursive = false )
+        { return Show( sizer, false, recursive ); }
+    bool Hide( wxWindow *window, bool recursive = false )
+        { return Show( window, false, recursive ); }
+    bool Hide( size_t index )
+        { return Show( index, false ); }
 
     bool IsShown( wxWindow *window ) const;
     bool IsShown( wxSizer *sizer ) const;
@@ -435,7 +435,7 @@ public:
     // Read-only access to the row heights and col widths arrays
     const wxArrayInt& GetRowHeights() const { return m_rowHeights; }
     const wxArrayInt& GetColWidths() const  { return m_colWidths; }
-    
+
     // implementation
     virtual void RecalcSizes();
     virtual wxSize CalcMin();
@@ -444,7 +444,7 @@ protected:
     void AdjustForFlexDirection();
     void AdjustForGrowables(const wxSize& sz, const wxSize& minsz,
                             int nrows, int ncols);
-    
+
     // the heights/widths of all rows/columns
     wxArrayInt  m_rowHeights,
                 m_colWidths;
@@ -553,7 +553,7 @@ public:
     wxDEPRECATED( wxBookCtrlSizer(wxBookCtrl *bookctrl) );
 
     wxBookCtrl *GetControl() const { return m_bookctrl; }
-    
+
     virtual void RecalcSizes();
     virtual wxSize CalcMin();
 
@@ -561,7 +561,7 @@ protected:
     // this protected ctor lets us mark the real one above as deprecated
     // and still have warning-free build of the library itself:
     wxBookCtrlSizer() {}
-    
+
     wxBookCtrl *m_bookctrl;
 
 private:
diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp
index b171d66ae5..a9bcc42f04 100644
--- a/src/common/sizer.cpp
+++ b/src/common/sizer.cpp
@@ -47,35 +47,35 @@ IMPLEMENT_CLASS(wxStaticBoxSizer, wxBoxSizer)
 WX_DEFINE_EXPORTED_LIST( wxSizerItemList );
 
 /*
-	TODO PROPERTIES
-	  sizeritem
-	    object
-		object_ref
-		  minsize
-		  option
-		  flag
-		  border
+    TODO PROPERTIES
+      sizeritem
+        object
+        object_ref
+          minsize
+          option
+          flag
+          border
      spacer
-		option
-		flag
-		borfder
-	boxsizer
-	   orient
+        option
+        flag
+        borfder
+    boxsizer
+       orient
     staticboxsizer
-	   orient
-	   label
-	gridsizer
-	   rows
-	   cols
-	   vgap
-	   hgap
-	flexgridsizer
-	   rows
-	   cols
-	   vgap
-	   hgap
-	   growablerows
-	   growablecols
+       orient
+       label
+    gridsizer
+       rows
+       cols
+       vgap
+       hgap
+    flexgridsizer
+       rows
+       cols
+       vgap
+       hgap
+       growablerows
+       growablecols
     minsize
 */
 //---------------------------------------------------------------------------
@@ -108,7 +108,7 @@ wxSizerItem::wxSizerItem( wxWindow *window, int proportion, int flag, int border
     if (flag & wxFIXED_MINSIZE)
         window->SetMinSize(window->GetSize());
     m_minSize = window->GetSize();
-    
+
     // aspect ratio calculated from initial size
     SetRatio( m_minSize );
 
@@ -211,7 +211,7 @@ wxSize wxSizerItem::GetMinSizeWithBorder() const
         ret.y += m_border;
     if (m_flag & wxSOUTH)
         ret.y += m_border;
-    
+
     return ret;
 }
 
@@ -858,7 +858,7 @@ bool wxSizer::DoSetItemMinSize( size_t index, int width, int height )
     return true;
 }
 
-void wxSizer::Show( wxWindow *window, bool show )
+bool wxSizer::Show( wxWindow *window, bool show, bool recursive )
 {
     wxASSERT_MSG( window, _T("Show for NULL window") );
 
@@ -870,13 +870,22 @@ void wxSizer::Show( wxWindow *window, bool show )
         if (item->GetWindow() == window)
         {
             item->Show( show );
-            break;
+
+            return true;
         }
+        else if (recursive && item->IsSizer())
+        {
+            if (item->GetSizer()->Show(window, show, recursive))
+                return true;
+        }
+
         node = node->GetNext();
     }
+
+    return false;
 }
 
-void wxSizer::Show( wxSizer *sizer, bool show )
+bool wxSizer::Show( wxSizer *sizer, bool show, bool recursive )
 {
     wxASSERT_MSG( sizer, _T("Show for NULL sizer") );
 
@@ -888,18 +897,30 @@ void wxSizer::Show( wxSizer *sizer, bool show )
         if (item->GetSizer() == sizer)
         {
             item->Show( show );
-            break;
+
+            return true;
         }
+        else if (recursive && item->IsSizer())
+        {
+            if (item->GetSizer()->Show(sizer, show, recursive))
+                return true;
+        }
+
         node = node->GetNext();
     }
+
+    return false;
 }
 
-void wxSizer::Show( size_t index, bool show )
+bool wxSizer::Show( size_t index, bool show)
 {
-    wxCHECK_RET( index < m_children.GetCount(),
+    wxCHECK_MSG( index < m_children.GetCount(),
+                 false,
                  _T("Show index is out of range") );
 
     m_children.Item( index )->GetData()->Show( show );
+
+    return true;
 }
 
 void wxSizer::ShowItems( bool show )
@@ -1072,7 +1093,7 @@ wxSize wxGridSizer::CalcMin()
 void wxGridSizer::SetItemBounds( wxSizerItem *item, int x, int y, int w, int h )
 {
     wxPoint pt( x,y );
-    wxSize sz( item->GetMinSizeWithBorder() ); 
+    wxSize sz( item->GetMinSizeWithBorder() );
     int flag = item->GetFlag();
 
     if ((flag & wxEXPAND) || (flag & wxSHAPED))
@@ -1206,7 +1227,7 @@ wxSize wxFlexGridSizer::CalcMin()
     }
 
     AdjustForFlexDirection();
-    
+
     // Sum total minimum size, including gaps between rows/columns.
     // -1 is used as a magic number meaning empty column.
     int width = 0;
@@ -1250,7 +1271,7 @@ void wxFlexGridSizer::AdjustForFlexDirection()
             array[n] = largest;
         }
     }
-}    
+}
 
 
 void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz, const wxSize& minsz,
@@ -1270,7 +1291,7 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz, const wxSize& minsz,
             // requested growable rows/columns are still valid.
             if (m_growableRows[idx] >= nrows)
                 continue;
-            
+
             // If all items in a row/column are hidden, that row/column will
             // have a dimension of -1.  This causes the row/column to be
             // hidden completely.
@@ -1322,7 +1343,7 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz, const wxSize& minsz,
             // requested growable rows/columns are still valid.
             if (m_growableCols[idx] >= ncols)
                 continue;
-            
+
             // If all items in a row/column are hidden, that row/column will
             // have a dimension of -1.  This causes the column to be hidden
             // completely.
@@ -1494,7 +1515,7 @@ wxSize wxBoxSizer::CalcMin()
 
         if (item->IsShown())
             item->CalcMin();  // result is stored in the item
-        
+
         if (item->IsShown() && item->GetProportion() != 0)
             m_stretchable += item->GetProportion();
 
@@ -1514,7 +1535,7 @@ wxSize wxBoxSizer::CalcMin()
             int stretch = item->GetProportion();
             wxSize size( item->GetMinSizeWithBorder() );
             int minSize;
-            
+
             // Integer division rounded up is (a + b - 1) / b
             // Round up needed in order to guarantee that all
             // all items will have size not less then their min size
@@ -1522,7 +1543,7 @@ wxSize wxBoxSizer::CalcMin()
                 minSize = ( size.x*m_stretchable + stretch - 1)/stretch;
             else
                 minSize = ( size.y*m_stretchable + stretch - 1)/stretch;
-            
+
             if (minSize > maxMinSize)
                 maxMinSize = minSize;
         }
@@ -1614,7 +1635,7 @@ static void GetStaticBoxBorders( wxStaticBox *box,
             // pixels (otherwise overlapping occurs at the top). The "other"
             // border has to be 11.
             extraTop = 11;
-            other = 11; 
+            other = 11;
         }
 
     }
-- 
2.50.0

