]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sizer.cpp
update the size of the wxGridSizer as items are added to wxGBSizer to avoid asserts...
[wxWidgets.git] / src / common / sizer.cpp
index 206f09a255ff4ee3fe6ea8ec7b881580abf30f38..65d2f3d9cbb12d3bb355aea5b63c706f46e3fe86 100644 (file)
@@ -17,7 +17,6 @@
     #pragma hdrstop
 #endif
 
-#include "wx/display.h"
 #include "wx/sizer.h"
 #include "wx/private/flagscheck.h"
 
@@ -32,6 +31,7 @@
     #include "wx/toplevel.h"
 #endif // WX_PRECOMP
 
+#include "wx/display.h"
 #include "wx/listimpl.cpp"
 
 
@@ -1324,10 +1324,17 @@ wxGridSizer::wxGridSizer( int cols, int vgap, int hgap )
 
 int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const
 {
-    int nitems = m_children.GetCount();
-    if ( nitems)
+    const int nitems = m_children.GetCount();
+    if ( nitems )
     {
-        if ( m_cols )
+        if ( m_cols && m_rows )
+        {
+            // if both rows and columns are specified by user, use the provided
+            // values even if we don't have enough items
+            ncols = m_cols;
+            nrows = m_rows;
+        }
+        else if ( m_cols )
         {
             ncols = m_cols;
             nrows = (nitems + m_cols - 1) / m_cols;
@@ -1341,7 +1348,8 @@ int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const
         {
             wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") );
 
-            nrows = ncols = 0;
+            nrows =
+            ncols = 0;
         }
     }
 
@@ -1631,11 +1639,9 @@ wxSize wxFlexGridSizer::CalcMin()
     m_rowHeights.assign(nrows, -1);
     m_colWidths.assign(ncols, -1);
 
-    // n is the index of the item in left-to-right top-to-bottom order
-    size_t n = 0;
     for ( wxSizerItemList::iterator i = m_children.begin();
           i != m_children.end();
-          ++i, ++n )
+          ++i)
     {
         wxSizerItem * const item = *i;
         if ( item->IsShown() )
@@ -1789,21 +1795,21 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz)
         {
             const int col = n % ncols;
             didAdjustMinSize |= (*i)->InformFirstDirection(wxHORIZONTAL, m_colWidths[col], sz.y - m_calculatedMinSize.y);
-    }
+        }
 
         // Only redo if info was actually used
         if( didAdjustMinSize )
-    {
-        DoAdjustForGrowables
-        (
-            sz.x - m_calculatedMinSize.x,
-            m_growableCols,
-            m_colWidths,
-            m_growMode == wxFLEX_GROWMODE_SPECIFIED ? &m_growableColsProportions
-                                                    : NULL
-        );
+        {
+            DoAdjustForGrowables
+            (
+                sz.x - m_calculatedMinSize.x,
+                m_growableCols,
+                m_colWidths,
+                m_growMode == wxFLEX_GROWMODE_SPECIFIED ? &m_growableColsProportions
+                                                        : NULL
+            );
+        }
     }
-}
 
     if ( (m_flexDirection & wxVERTICAL) || (m_growMode != wxFLEX_GROWMODE_NONE) )
     {
@@ -1832,7 +1838,11 @@ bool wxFlexGridSizer::IsColGrowable( size_t idx )
 
 void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
 {
-    wxASSERT_MSG( !IsRowGrowable( idx ), 
+    int nrows, ncols;
+    CalcRowsCols(nrows, ncols);
+    wxCHECK_RET( idx < (size_t)nrows, "invalid row index" );
+
+    wxASSERT_MSG( !IsRowGrowable( idx ),
                   "AddGrowableRow() called for growable row" );
     m_growableRows.Add( idx );
     m_growableRowsProportions.Add( proportion );
@@ -1840,7 +1850,11 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
 
 void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
 {
-    wxASSERT_MSG( !IsColGrowable( idx ), 
+    int nrows, ncols;
+    CalcRowsCols(nrows, ncols);
+    wxCHECK_RET( idx < (size_t)ncols, "invalid column index" );
+
+    wxASSERT_MSG( !IsColGrowable( idx ),
                   "AddGrowableCol() called for growable column" );
     m_growableCols.Add( idx );
     m_growableColsProportions.Add( proportion );