X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec07419336652454bc305659e9cd9b8fc767f3bd..b53aea81d2e102224b452ef5bf7aee1132f37c6f:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 206f09a255..3cd52cb4ae 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -17,7 +17,6 @@ #pragma hdrstop #endif -#include "wx/display.h" #include "wx/sizer.h" #include "wx/private/flagscheck.h" @@ -32,6 +31,7 @@ #include "wx/toplevel.h" #endif // WX_PRECOMP +#include "wx/display.h" #include "wx/listimpl.cpp" @@ -480,10 +480,11 @@ void wxSizerItem::SetDimension( const wxPoint& pos_, const wxSize& size_ ) break; case Item_Window: + { m_window->SetSize(pos.x, pos.y, size.x, size.y, - wxSIZE_ALLOW_MINUS_ONE); + wxSIZE_ALLOW_MINUS_ONE|wxSIZE_FORCE_EVENT ); break; - + } case Item_Sizer: m_sizer->SetDimension(pos, size); break; @@ -1324,25 +1325,33 @@ wxGridSizer::wxGridSizer( int cols, int vgap, int hgap ) int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const { - int nitems = m_children.GetCount(); - if ( nitems) + const int nitems = m_children.GetCount(); + if ( m_cols && m_rows ) { - if ( m_cols ) - { - ncols = m_cols; - nrows = (nitems + m_cols - 1) / m_cols; - } - else if ( m_rows ) - { - ncols = (nitems + m_rows - 1) / m_rows; - nrows = m_rows; - } - else // 0 columns, 0 rows? - { - wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") ); + // if both rows and columns are specified by user, use the provided + // values even if we don't have enough items but check that we don't + // have too many of them as this is going to result in problems later + ncols = m_cols; + nrows = m_rows; - nrows = ncols = 0; - } + wxASSERT_MSG( ncols*nrows >= nitems, "too many items in grid sizer" ); + } + else if ( m_cols ) + { + ncols = m_cols; + nrows = (nitems + m_cols - 1) / m_cols; + } + else if ( m_rows ) + { + ncols = (nitems + m_rows - 1) / m_rows; + nrows = m_rows; + } + else // 0 columns, 0 rows? + { + wxFAIL_MSG( _T("grid sizer must have either rows or columns fixed") ); + + nrows = + ncols = 0; } return nitems; @@ -1631,11 +1640,9 @@ wxSize wxFlexGridSizer::CalcMin() m_rowHeights.assign(nrows, -1); m_colWidths.assign(ncols, -1); - // n is the index of the item in left-to-right top-to-bottom order - size_t n = 0; for ( wxSizerItemList::iterator i = m_children.begin(); i != m_children.end(); - ++i, ++n ) + ++i) { wxSizerItem * const item = *i; if ( item->IsShown() ) @@ -1789,21 +1796,21 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz) { const int col = n % ncols; didAdjustMinSize |= (*i)->InformFirstDirection(wxHORIZONTAL, m_colWidths[col], sz.y - m_calculatedMinSize.y); - } + } // Only redo if info was actually used if( didAdjustMinSize ) - { - DoAdjustForGrowables - ( - sz.x - m_calculatedMinSize.x, - m_growableCols, - m_colWidths, - m_growMode == wxFLEX_GROWMODE_SPECIFIED ? &m_growableColsProportions - : NULL - ); + { + DoAdjustForGrowables + ( + sz.x - m_calculatedMinSize.x, + m_growableCols, + m_colWidths, + m_growMode == wxFLEX_GROWMODE_SPECIFIED ? &m_growableColsProportions + : NULL + ); + } } -} if ( (m_flexDirection & wxVERTICAL) || (m_growMode != wxFLEX_GROWMODE_NONE) ) { @@ -1832,7 +1839,11 @@ bool wxFlexGridSizer::IsColGrowable( size_t idx ) void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) { - wxASSERT_MSG( !IsRowGrowable( idx ), + int nrows, ncols; + CalcRowsCols(nrows, ncols); + wxCHECK_RET( idx < (size_t)nrows, "invalid row index" ); + + wxASSERT_MSG( !IsRowGrowable( idx ), "AddGrowableRow() called for growable row" ); m_growableRows.Add( idx ); m_growableRowsProportions.Add( proportion ); @@ -1840,7 +1851,11 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) { - wxASSERT_MSG( !IsColGrowable( idx ), + int nrows, ncols; + CalcRowsCols(nrows, ncols); + wxCHECK_RET( idx < (size_t)ncols, "invalid column index" ); + + wxASSERT_MSG( !IsColGrowable( idx ), "AddGrowableCol() called for growable column" ); m_growableCols.Add( idx ); m_growableColsProportions.Add( proportion ); @@ -1973,7 +1988,7 @@ void wxBoxSizer::RecalcSizes() } // NB: wxCENTRE is used here only for backwards compatibility, // wxALIGN_CENTRE should be used in new code - else if ( flag & (wxCENTER | wxALIGN_CENTRE) ) + else if ( flag & (wxCENTER | (IsVertical() ? wxALIGN_CENTRE_HORIZONTAL : wxALIGN_CENTRE_VERTICAL))) { PosInMinorDir(posChild) += (totalMinorSize - minorSize) / 2; }