X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b0674f799ec703083140f20b3b1280ba236917f..229653c99e1d679aab15772a4a25909ca52c4d94:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 678dd70433..c4bb285cae 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -400,7 +400,7 @@ void wxSizer::DeleteWindows() } } -void wxSizer::Fit( wxWindow *window ) +wxSize wxSizer::Fit( wxWindow *window ) { wxSize size; if (window->IsTopLevel()) @@ -408,8 +408,9 @@ void wxSizer::Fit( wxWindow *window ) else size = GetMinWindowSize( window ); - //window->SetClientSize( size ); window->SetSize( size ); + + return size; } void wxSizer::FitInside( wxWindow *window ) @@ -434,8 +435,8 @@ void wxSizer::SetSizeHints( wxWindow *window ) // Preserve the window's max size hints, but set the // lower bound according to the sizer calculations. - Fit( window ); - wxSize size( window->GetSize() ); + wxSize size = Fit( window ); + window->SetSizeHints( size.x, size.y, window->GetMaxWidth(), @@ -710,7 +711,7 @@ wxSize wxGridSizer::CalcMin() else ncols = (nitems + nrows-1) / nrows; - /* Find the max width and height for any component */ + // Find the max width and height for any component int w = 0; int h = 0; @@ -810,7 +811,7 @@ void wxFlexGridSizer::CreateArrays() 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++) @@ -835,20 +836,36 @@ void wxFlexGridSizer::RecalcSizes() wxSize minsz( CalcMin() ); wxPoint pt( GetPosition() ); int delta; - size_t idx; - - if ((m_growableRows.GetCount() > 0) && (sz.y > minsz.y)) + 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) / m_growableRows.GetCount(); - for (idx = 0; idx < m_growableRows.GetCount(); idx++) - m_rowHeights[ m_growableRows[idx] ] += delta; + delta = (sz.y - minsz.y) / num; + for (idx = 0; idx < num; idx++) + m_rowHeights[ temp[idx] ] += delta; } - if ((m_growableCols.GetCount() > 0) && (sz.x > minsz.x)) + 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) / m_growableCols.GetCount(); - for (idx = 0; idx < m_growableCols.GetCount(); idx++) - m_colWidths[ m_growableCols[idx] ] += delta; + 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 ); @@ -1070,8 +1087,8 @@ wxSize wxBoxSizer::CalcMin() } node = node->Next(); } - // Calculate overall minimum size - node = m_children.GetFirst(); + // Calculate overall minimum size + node = m_children.GetFirst(); while (node) { wxSizerItem *item = (wxSizerItem*) node->Data(); @@ -1143,7 +1160,7 @@ static void GetStaticBoxBorders(wxStaticBox *box, else #endif // __WXGTK__ *borderTop = 15; - (void)box; + (void)box; *borderOther = 5; }