+
+ // the same logic as above but for the columns
+ if ( sz.x > minsz.x && ( (m_flexDirection & wxHORIZONTAL) || (m_growMode == wxFLEX_GROWMODE_SPECIFIED) ) )
+ {
+ int sum_proportions = 0;
+ int growable_space = 0;
+ int num = 0;
+ size_t idx;
+ for (idx = 0; idx < m_growableCols.GetCount(); idx++)
+ {
+ // Since the number of rows/columns can change as items are inserted/deleted, we need
+ // to verify at runtime that the requested growable rows/columns are still valid.
+ if (m_growableCols[idx] >= ncols)
+ continue;
+ // If all items in a row/column are hidden, that row/column will have a dimension of -1.
+ // This causes the column to be hidden completely.
+ if (m_colWidths[ m_growableCols[idx] ] == -1)
+ continue;
+ sum_proportions += m_growableColsProportions[idx];
+ // wtb 5/12/02 bugfix - was m_ColWidths[idx]!!
+ growable_space += m_colWidths[ m_growableCols[idx] ];
+ num++;
+ }
+
+ if (num > 0)
+ {
+ for (idx = 0; idx < m_growableCols.GetCount(); idx++)
+ {
+ if (m_growableCols[idx] >= ncols )
+ continue;
+ if (m_colWidths[ m_growableCols[idx] ] == -1)
+ m_colWidths[ m_growableCols[idx] ] = 0;
+ else
+ {
+ int delta = (sz.x - minsz.x);
+ if (sum_proportions == 0)
+ delta = (delta/num) + m_colWidths[ m_growableCols[idx] ];
+ else
+ delta = ((delta+growable_space)*m_growableColsProportions[idx])/sum_proportions;
+ m_colWidths[ m_growableCols[idx] ] = delta;
+ }
+ }
+ }
+ }
+ else if ( (m_growMode == wxFLEX_GROWMODE_ALL) && (sz.x > minsz.x) )
+ {
+ for ( int col=0; col < ncols; ++col )
+ m_colWidths[ col ] = sz.x / ncols;
+ }
+
+ sz = wxSize( pt.x + sz.x, pt.y + sz.y );
+
+ int x = pt.x;
+ for (int c = 0; c < ncols; c++)
+ {
+ int y = pt.y;
+ for (int r = 0; r < nrows; r++)
+ {
+ int i = r * ncols + c;
+ if (i < nitems)
+ {
+ wxSizerItemList::compatibility_iterator node = m_children.Item( i );
+
+ wxASSERT_MSG( node, _T("Failed to find node") );
+
+ int w = wxMax( 0, wxMin( m_colWidths[c], sz.x - x ) );
+ int h = wxMax( 0, wxMin( m_rowHeights[r], sz.y - y ) );
+
+ SetItemBounds( node->GetData(), x, y, w, h);
+ }
+ y = y + m_rowHeights[r] + m_vgap;
+ }
+ x = x + m_colWidths[c] + m_hgap;
+ }
+}
+
+wxSize wxFlexGridSizer::CalcMin()
+{
+ int nrows,
+ ncols;
+ size_t i, s;
+
+ // Number of rows/columns can change as items are added or removed.
+ if ( !CalcRowsCols(nrows, ncols) )
+ return wxSize(10, 10);
+
+ m_rowHeights.SetCount(nrows);
+ m_colWidths.SetCount(ncols);
+
+ // We have to recalcuate the sizes in case an item has wxADJUST_MINSIZE, has changed
+ // minimum size since the previous layout, or has been hidden using wxSizer::Show().
+ // If all the items in a row/column are hidden, the final dimension of the row/column
+ // will be -1, indicating that the column itself is hidden.
+ for( s = m_rowHeights.GetCount(), i = 0; i < s; ++i )
+ m_rowHeights[ i ] = -1;
+ for( s = m_colWidths.GetCount(), i = 0; i < s; ++i )
+ m_colWidths[ i ] = -1;
+
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
+
+ i = 0;
+ while (node)
+ {
+ wxSizerItem *item = node->GetData();
+ if ( item->IsShown() )
+ {
+ wxSize sz( item->CalcMin() );
+ int row = i / ncols;
+ int col = i % ncols;
+
+ m_rowHeights[ row ] = wxMax( wxMax( 0, sz.y ), m_rowHeights[ row ] );
+ m_colWidths[ col ] = wxMax( wxMax( 0, sz.x ), m_colWidths[ col ] );
+ }
+
+ node = node->GetNext();
+ i++;
+ }
+
+ // the logic above works when we resize flexibly in both directions but
+ // maybe this is not the case
+ if ( m_flexDirection != wxBOTH )
+ {
+ // select the array corresponding to the direction in which we do *not*
+ // resize flexibly
+ wxArrayInt& array = m_flexDirection == wxVERTICAL ? m_colWidths
+ : m_rowHeights;
+
+ const int count = array.GetCount();
+
+ // find the largest value in this array
+ int n, largest = 0;
+ for ( n = 0; n < count; ++n )
+ {
+ if ( array[n] > largest )
+ largest = array[n];
+ }
+
+ // and now fill it with the largest value
+ for ( n = 0; n < count; ++n )
+ {
+ array[n] = largest;
+ }
+ }
+
+ // Sum total minimum size, including gaps between rows/columns.
+ // -1 is used as a magic number meaning empty column.
+ int width = 0;
+ for (int col = 0; col < ncols; col++)
+ if ( m_colWidths[ col ] != -1 )
+ width += m_colWidths[ col ] + ( col == ncols-1 ? 0 : m_hgap );
+
+ int height = 0;
+ for (int row = 0; row < nrows; row++)
+ if ( m_rowHeights[ row ] != -1 )
+ height += m_rowHeights[ row ] + ( row == nrows-1 ? 0 : m_vgap );
+
+ return wxSize( width, height );
+}
+
+void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
+{
+ m_growableRows.Add( idx );
+ m_growableRowsProportions.Add( proportion );
+}
+
+void wxFlexGridSizer::RemoveGrowableRow( size_t idx )
+{
+ m_growableRows.Remove( idx );
+}
+
+void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
+{
+ m_growableCols.Add( idx );
+ m_growableColsProportions.Add( proportion );
+}
+
+void wxFlexGridSizer::RemoveGrowableCol( size_t idx )
+{
+ m_growableCols.Remove( idx );
+}
+
+//---------------------------------------------------------------------------
+// wxBoxSizer
+//---------------------------------------------------------------------------
+
+wxBoxSizer::wxBoxSizer( int orient )
+ : m_orient( orient )
+{
+}
+
+void wxBoxSizer::RecalcSizes()
+{
+ if (m_children.GetCount() == 0)
+ return;
+
+ int delta = 0;
+ if (m_stretchable)
+ {
+ if (m_orient == wxHORIZONTAL)
+ delta = m_size.x - m_fixedWidth;
+ else
+ delta = m_size.y - m_fixedHeight;
+ }
+