X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/be90c029fd255fba3eb7379aabef5780df210ad8..a4353f07c6b37712634d4b2d86527b647a08044f:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index f3a5d5a04f..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()) @@ -409,6 +409,19 @@ void wxSizer::Fit( wxWindow *window ) size = GetMinWindowSize( window ); 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() @@ -419,29 +432,33 @@ void wxSizer::Layout() void wxSizer::SetSizeHints( wxWindow *window ) { - wxSize size = FitSize( window ); - window->SetSizeHints( size.x, size.y ); + // Preserve the window's max size hints, but set the + // lower bound according to the sizer calculations. + + wxSize size = Fit( window ); + + window->SetSizeHints( size.x, + size.y, + window->GetMaxWidth(), + window->GetMaxHeight() ); } -wxSize wxSizer::GetMaxWindowSize( wxWindow *WXUNUSED(window) ) +void wxSizer::SetVirtualSizeHints( wxWindow *window ) { - wxRect rect = wxGetClientDisplayRect(); - wxSize sizeMax (rect.width,rect.height); - - // Sorry, but this bit is wrong -- it makes a window that should just be - // able to fit onto the screen, not fit on the screen. -- JACS -#if 0 - // Make the max size a bit smaller than the visible portion of - // the screen. A window which takes the entire screen doesn't - // look very nice either - sizeMax.x *= 9; - sizeMax.x /= 10; + // Preserve the window's max size hints, but set the + // lower bound according to the sizer calculations. - sizeMax.y *= 9; - sizeMax.y /= 10; -#endif + FitInside( window ); + wxSize size( window->GetVirtualSize() ); + window->SetVirtualSizeHints( size.x, + size.y, + window->GetMaxWidth(), + window->GetMaxHeight() ); +} - return sizeMax; +wxSize wxSizer::GetMaxWindowSize( wxWindow *window ) +{ + return window->GetMaxSize(); } wxSize wxSizer::GetMinWindowSize( wxWindow *window ) @@ -459,9 +476,47 @@ wxSize wxSizer::FitSize( wxWindow *window ) wxSize size = GetMinWindowSize( window ); wxSize sizeMax = GetMaxWindowSize( window ); - if ( size.x > sizeMax.x ) + // Limit the size if sizeMax != wxDefaultSize + + if ( size.x > sizeMax.x && sizeMax.x != -1 ) size.x = sizeMax.x; - if ( size.y > sizeMax.y ) + if ( size.y > sizeMax.y && sizeMax.y != -1 ) + size.y = sizeMax.y; + + 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; @@ -656,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; @@ -756,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++) @@ -781,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 ); @@ -1016,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(); @@ -1089,7 +1160,7 @@ static void GetStaticBoxBorders(wxStaticBox *box, else #endif // __WXGTK__ *borderTop = 15; - (void)box; + (void)box; *borderOther = 5; } @@ -1183,3 +1254,5 @@ wxSize wxNotebookSizer::CalcMin() } #endif // wxUSE_NOTEBOOK + +// vi:sts=4:sw=4:et