From: Vadim Zeitlin Date: Wed, 25 Feb 2009 21:01:19 +0000 (+0000) Subject: postpone the check for the validity of growable rows/columns indices until we know... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/4e4e06e3497733c5d5726656835b5a4127089f99 postpone the check for the validity of growable rows/columns indices until we know the total number of items in the sizer (closes #10294) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59136 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 173a0a4810..c4502c852e 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -1781,6 +1781,37 @@ DoAdjustForGrowables(int delta, void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz) { +#ifdef __WXDEBUG__ + // by the time this function is called, the sizer should be already fully + // initialized and hence the number of its columns and rows is known and we + // can check that all indices in m_growableCols/Rows are valid (see also + // comments in AddGrowableCol/Row()) + if ( !m_rows || !m_cols ) + { + int nrows, ncols; + CalcRowsCols(nrows, ncols); + + if ( !m_rows ) + { + for ( size_t n = 0; n < m_growableRows.size(); n++ ) + { + wxASSERT_MSG( m_growableRows[n] < nrows, + "invalid growable row index" ); + } + } + + if ( !m_cols ) + { + for ( size_t n = 0; n < m_growableCols.size(); n++ ) + { + wxASSERT_MSG( m_growableCols[n] < ncols, + "invalid growable column index" ); + } + } + } +#endif // __WXDEBUG__ + + if ( (m_flexDirection & wxHORIZONTAL) || (m_growMode != wxFLEX_GROWMODE_NONE) ) { DoAdjustForGrowables @@ -1851,10 +1882,16 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) { int nrows, ncols; CalcRowsCols(nrows, ncols); - wxCHECK_RET( idx < (size_t)nrows, "invalid row index" ); wxASSERT_MSG( !IsRowGrowable( idx ), "AddGrowableRow() called for growable row" ); + + // notice that we intentionally don't check the index validity here in (the + // common) case when the number of rows was not specified in the ctor -- in + // this case it will be computed only later, when all items are added to + // the sizer, and the check will be done in AdjustForGrowables() + wxCHECK_RET( !m_rows || idx < (size_t)m_rows, "invalid row index" ); + m_growableRows.Add( idx ); m_growableRowsProportions.Add( proportion ); } @@ -1863,10 +1900,14 @@ void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) { int nrows, ncols; CalcRowsCols(nrows, ncols); - wxCHECK_RET( idx < (size_t)ncols, "invalid column index" ); wxASSERT_MSG( !IsColGrowable( idx ), "AddGrowableCol() called for growable column" ); + + // see comment in AddGrowableRow(): although it's less common to omit the + // specification of the number of columns, it still can also happen + wxCHECK_RET( !m_cols || idx < (size_t)ncols, "invalid column index" ); + m_growableCols.Add( idx ); m_growableColsProportions.Add( proportion ); }