break;
case Item_Window:
+ {
+ // Use wxSIZE_FORCE_EVENT here since a sizer item might
+ // have changed alignment or some other property which would
+ // not change the size of the window. In such a case, no
+ // wxSizeEvent would normally be generated and thus the
+ // control wouldn't get layed out correctly here.
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;
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;
void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
{
- wxCHECK_RET( idx < (size_t)GetRows(), "invalid row index" );
+ 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 );
void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
{
- wxCHECK_RET( idx < (size_t)GetCols(), "invalid column index" );
+ 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 );
}
// 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;
}