X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77424cfbdde7866610700b6daacd0f8fe7350d57..832e44d38a9c283ea1b03a76f80efb52519de21f:/src/common/sizer.cpp?ds=sidebyside diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index f20410f51d..c4bb285cae 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -2,7 +2,7 @@ // Name: sizer.cpp // Purpose: provide new wxSizer class for layout // Author: Robert Roebling and Robin Dunn -// Modified by: +// Modified by: Ron Lee // Created: // RCS-ID: $Id$ // Copyright: (c) Robin Dunn, Dirk Holtwick and Robert Roebling @@ -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,20 @@ void wxSizer::Fit( wxWindow *window ) else size = GetMinWindowSize( window ); - //window->SetClientSize( size ); window->SetSize( size ); + + return size; +} + +void wxSizer::FitInside( wxWindow *window ) +{ + wxSize size; + if (window->IsTopLevel()) + size = VirtualFitSize( window ); + else + size = GetMinClientSize( window ); + + window->SetVirtualSize( size ); } void wxSizer::Layout() @@ -423,13 +435,27 @@ void wxSizer::SetSizeHints( wxWindow *window ) // Preserve the window's max size hints, but set the // lower bound according to the sizer calculations. - wxSize size = FitSize( window ); + wxSize size = Fit( window ); + window->SetSizeHints( size.x, size.y, window->GetMaxWidth(), window->GetMaxHeight() ); } +void wxSizer::SetVirtualSizeHints( wxWindow *window ) +{ + // Preserve the window's max size hints, but set the + // lower bound according to the sizer calculations. + + FitInside( window ); + wxSize size( window->GetVirtualSize() ); + window->SetVirtualSizeHints( size.x, + size.y, + window->GetMaxWidth(), + window->GetMaxHeight() ); +} + wxSize wxSizer::GetMaxWindowSize( wxWindow *window ) { return window->GetMaxSize(); @@ -460,6 +486,42 @@ wxSize wxSizer::FitSize( wxWindow *window ) return size; } +wxSize wxSizer::GetMaxClientSize( wxWindow *window ) +{ + wxSize maxSize( window->GetMaxSize() ); + + if( maxSize != wxDefaultSize ) + { + wxSize size( window->GetSize() ); + wxSize client_size( window->GetClientSize() ); + + return wxSize( maxSize.x + client_size.x - size.x, + maxSize.y + client_size.y - size.y ); + } + else + return wxDefaultSize; +} + +wxSize wxSizer::GetMinClientSize( wxWindow *WXUNUSED(window) ) +{ + return GetMinSize(); // Already returns client size. +} + +wxSize wxSizer::VirtualFitSize( wxWindow *window ) +{ + wxSize size = GetMinClientSize( window ); + wxSize sizeMax = GetMaxClientSize( window ); + + // Limit the size if sizeMax != wxDefaultSize + + if ( size.x > sizeMax.x && sizeMax.x != -1 ) + size.x = sizeMax.x; + if ( size.y > sizeMax.y && sizeMax.y != -1 ) + size.y = sizeMax.y; + + return size; +} + void wxSizer::SetDimension( int x, int y, int width, int height ) { m_position.x = x; @@ -649,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; @@ -749,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++) @@ -774,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 ); @@ -1009,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(); @@ -1082,7 +1160,7 @@ static void GetStaticBoxBorders(wxStaticBox *box, else #endif // __WXGTK__ *borderTop = 15; - (void)box; + (void)box; *borderOther = 5; }