+
+    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))
+    {
+        delta = (sz.y - minsz.y) / num;
+        for (idx = 0; idx < num; idx++)
+            m_rowHeights[ temp[idx] ] += delta;
+    }
+
+    temp.Empty();
+    // See above
+    for (idx = 0; idx < m_growableCols.GetCount(); idx++)
+        if (m_growableCols[idx] < ncols)
+            temp.Add( m_growableCols[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;
+    }
+
+    sz = wxSize( pt.x + sz.x, pt.y + sz.y );
+
+    int x = pt.x;
+    for (int c = 0; c < ncols; c++)