]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sizer.cpp
don't include private headers from wx/unix/evtloop.h
[wxWidgets.git] / src / common / sizer.cpp
index 63a832d8ff9beb1f321595d47655360fa26e8b50..a13599bf3ca559163113181c0695c5d04906b2bd 100644 (file)
@@ -480,10 +480,16 @@ void wxSizerItem::SetDimension( const wxPoint& pos_, const wxSize& size_ )
             break;
 
         case Item_Window:
+        {
+            // Use wxSIZE_FORCE_EVENT here since a sizer item might
+            // have changed alignment or some other property which would
+            // not change the size of the window. In such a case, no
+            // wxSizeEvent would normally be generated and thus the
+            // control wouldn't get layed out correctly here.
             m_window->SetSize(pos.x, pos.y, size.x, size.y,
-                              wxSIZE_ALLOW_MINUS_ONE);
+                              wxSIZE_ALLOW_MINUS_ONE|wxSIZE_FORCE_EVENT );
             break;
-
+        }
         case Item_Sizer:
             m_sizer->SetDimension(pos, size);
             break;
@@ -1324,25 +1330,33 @@ 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 ( m_cols && m_rows )
     {
-        if ( m_cols )
-        {
-            ncols = m_cols;
-            nrows = (nitems + m_cols - 1) / m_cols;
-        }
-        else if ( m_rows )
-        {
-            ncols = (nitems + m_rows - 1) / m_rows;
-            nrows = m_rows;
-        }
-        else // 0 columns, 0 rows?
-        {
-            wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") );
+        // if both rows and columns are specified by user, use the provided
+        // values even if we don't have enough items but check that we don't
+        // have too many of them as this is going to result in problems later
+        ncols = m_cols;
+        nrows = m_rows;
 
-            nrows = ncols = 0;
-        }
+        wxASSERT_MSG( ncols*nrows >= nitems, "too many items in grid sizer" );
+    }
+    else if ( m_cols )
+    {
+        ncols = m_cols;
+        nrows = (nitems + m_cols - 1) / m_cols;
+    }
+    else if ( m_rows )
+    {
+        ncols = (nitems + m_rows - 1) / m_rows;
+        nrows = m_rows;
+    }
+    else // 0 columns, 0 rows?
+    {
+        wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") );
+
+        nrows =
+        ncols = 0;
     }
 
     return nitems;
@@ -1830,7 +1844,10 @@ bool wxFlexGridSizer::IsColGrowable( size_t idx )
 
 void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
 {
-    wxCHECK_RET( idx < (size_t)GetRows(), "invalid row index" );
+    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 );
@@ -1839,7 +1856,10 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
 
 void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
 {
-    wxCHECK_RET( idx < (size_t)GetCols(), "invalid column index" );
+    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 );
@@ -1973,7 +1993,7 @@ void wxBoxSizer::RecalcSizes()
         }
         // NB: wxCENTRE is used here only for backwards compatibility,
         //     wxALIGN_CENTRE should be used in new code
-        else if ( flag & (wxCENTER | wxALIGN_CENTRE) )
+        else if ( flag & (wxCENTER | (IsVertical() ? wxALIGN_CENTRE_HORIZONTAL : wxALIGN_CENTRE_VERTICAL)))
         {
             PosInMinorDir(posChild) += (totalMinorSize - minorSize) / 2;
         }