+
+ return wxSize(ncols * w + (ncols-1) * m_hgap,
+ nrows * h + (nrows-1) * m_vgap);
+}
+
+void wxGridSizer::SetItemBounds( wxSizerItem *item, int x, int y, int w, int h )
+{
+ wxPoint pt( x,y );
+ wxSize sz( item->CalcMin() );
+ int flag = item->GetFlag();
+
+ if ((flag & wxEXPAND) || (flag & wxSHAPED))
+ {
+ sz = wxSize(w, h);
+ }
+ else
+ {
+ if (flag & wxALIGN_CENTER_HORIZONTAL)
+ {
+ pt.x = x + (w - sz.x) / 2;
+ }
+ else if (flag & wxALIGN_RIGHT)
+ {
+ pt.x = x + (w - sz.x);
+ }
+
+ if (flag & wxALIGN_CENTER_VERTICAL)
+ {
+ pt.y = y + (h - sz.y) / 2;
+ }
+ else if (flag & wxALIGN_BOTTOM)
+ {
+ pt.y = y + (h - sz.y);
+ }
+ }
+
+ item->SetDimension(pt, sz);
+}
+
+//---------------------------------------------------------------------------
+// wxFlexGridSizer
+//---------------------------------------------------------------------------
+
+wxFlexGridSizer::wxFlexGridSizer( int rows, int cols, int vgap, int hgap )
+ : wxGridSizer( rows, cols, vgap, hgap )
+{
+ m_rowHeights = (int*) NULL;
+ m_colWidths = (int*) NULL;
+}
+
+wxFlexGridSizer::wxFlexGridSizer( int cols, int vgap, int hgap )
+ : wxGridSizer( cols, vgap, hgap )
+{
+ m_rowHeights = (int*) NULL;
+ m_colWidths = (int*) NULL;
+}
+
+wxFlexGridSizer::~wxFlexGridSizer()
+{
+ if (m_rowHeights)
+ delete[] m_rowHeights;
+ if (m_colWidths)
+ delete[] m_colWidths;
+}
+
+void wxFlexGridSizer::CreateArrays()
+{
+ if (m_rowHeights)
+ delete[] m_rowHeights;
+ if (m_colWidths)
+ delete[] m_colWidths;
+
+ int nitems, nrows, ncols;
+ if ( (nitems = CalcRowsCols(nrows, ncols)) == 0 )
+ {
+ m_rowHeights =
+ m_colWidths = NULL;
+ }
+
+ m_rowHeights = new int[nrows];
+ m_colWidths = new int[ncols];
+
+ for (int col = 0; col < ncols; col++)
+ m_colWidths[ col ] = 0;
+ for (int row = 0; row < nrows; row++)
+ m_rowHeights[ row ] = 0;
+}
+
+void wxFlexGridSizer::RecalcSizes()
+{
+ int nitems, nrows, ncols;
+ if ( (nitems = CalcRowsCols(nrows, ncols)) == 0 )
+ return;
+
+ wxSize sz( GetSize() );
+ wxSize minsz( CalcMin() );
+ wxPoint pt( GetPosition() );
+ int delta;
+ size_t idx,num;
+ wxArrayInt temp;
+
+ // Transfer only those rows into temp which exist in the sizer
+ // ignoring the superflouus ones. This prevents a segfault when
+ // calling AddGrowableRow( 3 ) if the sizer only has 2 rows.
+ for (idx = 0; idx < m_growableRows.GetCount(); idx++)
+ if (m_growableRows[idx] < nrows)
+ temp.Add( m_growableRows[idx] );
+ num = temp.GetCount();
+
+ if ((num > 0) && (sz.y > minsz.y))