]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sizer.cpp
fix Alt-letter navigation with spin controls (bug 672974)
[wxWidgets.git] / src / common / sizer.cpp
index a0ee65773c2cb0c7c69578e2a1e10544d6d08cb2..5a9c11a99f4aa066d0f4e952563e9cfba6c26e29 100644 (file)
@@ -1,12 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        sizer.cpp
 // Purpose:     provide new wxSizer class for layout
-// Author:      Robert Roebling and Robin Dunn
+// Author:      Robert Roebling and Robin Dunn, contributions by
+//              Dirk Holtwick, Ron Lee
 // Modified by: Ron Lee
 // Created:
 // RCS-ID:      $Id$
-// Copyright:   (c) Robin Dunn, Dirk Holtwick and Robert Roebling
-//              (c) 2003, Ron Lee
+// Copyright:   (c) Robin Dunn, Robert Roebling
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -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) )
@@ -1114,16 +1144,29 @@ void wxFlexGridSizer::RecalcSizes()
 
 wxSize wxFlexGridSizer::CalcMin()
 {
-    int nrows, ncols;
+    int     nrows,
+            ncols;
+    size_t  i, s;
+
     if ( !CalcRowsCols(nrows, ncols) )
         return wxSize(10, 10);
 
+    // We have to clear the old sizes out if any item has wxADJUST_MINSIZE
+    // set on it.  Its probably quicker to just always do it than test for
+    // that though.  At least do it before resizing the arrays, SetCount will
+    // initialise new elements to zero.
+    for( s = m_rowHeights.GetCount(), i = 0; i < s; ++i )
+        m_rowHeights[ i ] = 0;
+
+    for( s = m_colWidths.GetCount(), i = 0; i < s; ++i )
+        m_colWidths[ i ] = 0;
+
     m_rowHeights.SetCount(nrows);
     m_colWidths.SetCount(ncols);
 
-    int                      i = 0;
     wxSizerItemList::Node   *node = m_children.GetFirst();
 
+    i = 0;
     while (node)
     {
         wxSizerItem    *item = node->GetData();
@@ -1178,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) )
@@ -1406,8 +1451,8 @@ static void GetStaticBoxBorders( wxStaticBox *box,
         *borderTop = 5;
     else
 #endif // __WXGTK__
-        *borderTop = 15;
-    (void)box;
+        *borderTop = box->GetCharHeight();
+
     *borderOther = 5;
 }