From e8800dcfa76ba8ff79c2d171dc5d45028dca4574 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Thu, 27 Feb 2003 11:55:26 +0000
Subject: [PATCH] added proportion parameter to
 wxFlexGridSizer::AddGrowableRow/Col()

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19361 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt           |  1 +
 docs/latex/wx/flexsizr.tex | 13 ++++++++---
 include/wx/sizer.h         |  8 +++++--
 src/common/sizer.cpp       | 44 ++++++++++++++++++++++++++++++++------
 4 files changed, 55 insertions(+), 11 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index aa04782a0e..4e0c9d2eb3 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -29,6 +29,7 @@ wxBase:
 All GUI ports:
 
 - added wxSplitterWindow handler to XRC
+- added proportion to wxFlexGridSizer::AddGrowableRow/Col (Maxim Babitski)
 - added wxFlexGridSizer::SetFlexibleDirection() (Szczepan Holyszewski)
 - implemented GetEditControl for wxGenericTreeCtrl (Peter Stieber)
 - improved contrib/utils/convertrc parsing (David J. Cooke)
diff --git a/docs/latex/wx/flexsizr.tex b/docs/latex/wx/flexsizr.tex
index 6b85373992..92c1f8d5c2 100644
--- a/docs/latex/wx/flexsizr.tex
+++ b/docs/latex/wx/flexsizr.tex
@@ -41,18 +41,25 @@ all children.
 
 \membersection{wxFlexGridSizer::AddGrowableCol}\label{wxflexgridsizeraddgrowablecol}
 
-\func{void}{AddGrowableCol}{\param{size\_t }{idx}}
+\func{void}{AddGrowableCol}{\param{size\_t }{idx}, \param{int }{proportion = $0$}}
 
-Specifies that column idx (starting from zero) should be grown if
+Specifies that column {\it idx} (starting from zero) should be grown if
 there is extra space available to the sizer.
 
+The {\it proportion} parameter has the same meaning as the stretch factor for
+the \helpref{sizers}{sizeroverview} except that if all proportions are $0$,
+then all columns are resized equally (instead of not being resized at all).
+
 \membersection{wxFlexGridSizer::AddGrowableRow}\label{wxflexgridsizeraddgrowablerow}
 
-\func{void}{AddGrowableRow}{\param{size\_t }{idx}}
+\func{void}{AddGrowableRow}{\param{size\_t }{idx}, \param{int }{proportion = $0$}}
 
 Specifies that row idx (starting from zero) should be grown if there
 is extra space available to the sizer.
 
+See \helpref{AddGrowableCol}{wxflexgridsizeraddgrowablecol} for the description
+of {\it proportion} parameter.
+
 \membersection{wxFlexGridSizer::GetFlexibleDirection}\label{wxflexgridsizergetflexibledrection}
 
 \constfunc{int}{GetFlexibleDirections}{\void}
diff --git a/include/wx/sizer.h b/include/wx/sizer.h
index b5f0665955..314d374d9f 100644
--- a/include/wx/sizer.h
+++ b/include/wx/sizer.h
@@ -395,9 +395,9 @@ public:
 
     // set the rows/columns which will grow (the others will remain of the
     // constant initial size)
-    void AddGrowableRow( size_t idx );
+    void AddGrowableRow( size_t idx, int proportion = 0 );
     void RemoveGrowableRow( size_t idx );
-    void AddGrowableCol( size_t idx );
+    void AddGrowableCol( size_t idx, int proportion = 0 );
     void RemoveGrowableCol( size_t idx );
 
 
@@ -427,6 +427,10 @@ protected:
     wxArrayInt  m_growableRows,
                 m_growableCols;
 
+    // proportion values of the corresponding growable rows and columns
+    wxArrayInt  m_growableRowsProportions,
+                m_growableColsProportions;
+
     // parameters describing whether the growable cells should be resized in
     // both directions or only one
     int m_flexDirection;
diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp
index 9e430cdb84..30cd5d68ec 100644
--- a/src/common/sizer.cpp
+++ b/src/common/sizer.cpp
@@ -1029,6 +1029,9 @@ void wxFlexGridSizer::RecalcSizes()
     int    delta;
     size_t idx, num;
     wxArrayInt temp;
+    wxArrayInt temp_proportions;
+    int sum_proportions = 0;
+    int growable_space = 0;
 
     // what to do with the rows? by default, resize them proportionally
     if ( (m_flexDirection & wxVERTICAL) ||
@@ -1040,18 +1043,33 @@ void wxFlexGridSizer::RecalcSizes()
         for (idx = 0; idx < m_growableRows.GetCount(); idx++)
         {
             if (m_growableRows[idx] < nrows)
+            {
                 temp.Add( m_growableRows[idx] );
+                temp_proportions.Add( m_growableRowsProportions[idx] );
+                sum_proportions += m_growableRowsProportions[idx];
+                growable_space += m_rowHeights[ temp[idx] ];
+            }
         }
 
         num = temp.GetCount();
 
         if ((num > 0) && (sz.y > minsz.y))
         {
-            delta = (sz.y - minsz.y) / num;
             for (idx = 0; idx < num; idx++)
-                m_rowHeights[ temp[idx] ] += delta;
+            {
+                delta = (sz.y - minsz.y);
+                if (sum_proportions == 0)
+                    delta = (delta/num) + m_rowHeights[ temp[idx] ];
+                else
+                    delta = ((delta+growable_space)*temp_proportions[idx])/
+                                                     sum_proportions;
+                m_rowHeights[ temp[idx] ] = delta;
+            }
         }
         temp.Empty();
+        temp_proportions.Empty();
+		sum_proportions = 0;
+		growable_space = 0;
     }
     else if ( (m_growMode == wxFLEX_GROWMODE_ALL) && (sz.y > minsz.y) )
     {
@@ -1068,16 +1086,28 @@ void wxFlexGridSizer::RecalcSizes()
         for (idx = 0; idx < m_growableCols.GetCount(); idx++)
         {
             if (m_growableCols[idx] < ncols)
+            {
                 temp.Add( m_growableCols[idx] );
+                temp_proportions.Add( m_growableColsProportions[idx] );
+                sum_proportions += m_growableColsProportions[idx];
+                growable_space += m_colWidths[idx];
+            }
         }
 
         num = temp.GetCount();
 
         if ((num > 0) && (sz.x > minsz.x))
         {
-            delta = (sz.x - minsz.x) / num;
             for (idx = 0; idx < num; idx++)
-                m_colWidths[ temp[idx] ] += delta;
+            {
+                delta = (sz.x - minsz.x);
+                if (sum_proportions == 0)
+                    delta = (delta/num) + m_colWidths[ temp[idx] ];
+		else
+                    delta = ((delta+growable_space)*temp_proportions[idx])/
+                                                     sum_proportions;
+                m_colWidths[ temp[idx] ] = delta;
+            }
         }
     }
     else if ( (m_growMode == wxFLEX_GROWMODE_ALL) && (sz.x > minsz.x) )
@@ -1191,18 +1221,20 @@ wxSize wxFlexGridSizer::CalcMin()
                    height + (nrows-1) * m_vgap);
 }
 
-void wxFlexGridSizer::AddGrowableRow( size_t idx )
+void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
 {
     m_growableRows.Add( idx );
+    m_growableRowsProportions.Add( proportion );
 }
 
 void wxFlexGridSizer::RemoveGrowableRow( size_t WXUNUSED(idx) )
 {
 }
 
-void wxFlexGridSizer::AddGrowableCol( size_t idx )
+void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
 {
     m_growableCols.Add( idx );
+    m_growableColsProportions.Add( proportion );
 }
 
 void wxFlexGridSizer::RemoveGrowableCol( size_t WXUNUSED(idx) )
-- 
2.50.0

