X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ef52f19e6ad14e3740dee3e79b8e348a70054d09..26022721e88892446ebcfc34bc34384492952fa9:/src/common/sizer.cpp?ds=sidebyside diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 63a832d8ff..ad0abd60ed 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -137,7 +137,7 @@ wxSizerItem::wxSizerItem() // window item void wxSizerItem::DoSetWindow(wxWindow *window) { - wxCHECK_RET( window, _T("NULL window in wxSizerItem::SetWindow()") ); + wxCHECK_RET( window, wxT("NULL window in wxSizerItem::SetWindow()") ); m_kind = Item_Window; m_window = window; @@ -253,7 +253,7 @@ void wxSizerItem::Free() case Item_Max: default: - wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + wxFAIL_MSG( wxT("unexpected wxSizerItem::m_kind") ); } m_kind = Item_None; @@ -291,7 +291,7 @@ wxSize wxSizerItem::GetSize() const case Item_Max: default: - wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + wxFAIL_MSG( wxT("unexpected wxSizerItem::m_kind") ); } if (m_flag & wxWEST) @@ -350,7 +350,7 @@ bool wxSizerItem::InformFirstDirection(int direction, int size, int availableOth { if( !wxIsNullDouble(m_ratio) ) { - wxCHECK_MSG( (m_proportion==0), false, _T("Shaped item, non-zero proportion in wxSizerItem::InformFirstDirection()") ); + wxCHECK_MSG( (m_proportion==0), false, wxT("Shaped item, non-zero proportion in wxSizerItem::InformFirstDirection()") ); if( direction==wxHORIZONTAL && !wxIsNullDouble(m_ratio) ) { // Clip size so that we don't take too much @@ -476,14 +476,25 @@ void wxSizerItem::SetDimension( const wxPoint& pos_, const wxSize& size_ ) switch ( m_kind ) { case Item_None: - wxFAIL_MSG( _T("can't set size of uninitialized sizer item") ); + wxFAIL_MSG( wxT("can't set size of uninitialized sizer item") ); 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. +#if 1 + m_window->SetSize(pos.x, pos.y, size.x, size.y, + wxSIZE_ALLOW_MINUS_ONE|wxSIZE_FORCE_EVENT ); +#else m_window->SetSize(pos.x, pos.y, size.x, size.y, - wxSIZE_ALLOW_MINUS_ONE); + wxSIZE_ALLOW_MINUS_ONE ); +#endif break; - + } case Item_Sizer: m_sizer->SetDimension(pos, size); break; @@ -494,7 +505,7 @@ void wxSizerItem::SetDimension( const wxPoint& pos_, const wxSize& size_ ) case Item_Max: default: - wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + wxFAIL_MSG( wxT("unexpected wxSizerItem::m_kind") ); } } @@ -523,7 +534,7 @@ void wxSizerItem::DeleteWindows() case Item_Max: default: - wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + wxFAIL_MSG( wxT("unexpected wxSizerItem::m_kind") ); } } @@ -533,7 +544,7 @@ void wxSizerItem::Show( bool show ) switch ( m_kind ) { case Item_None: - wxFAIL_MSG( _T("can't show uninitialized sizer item") ); + wxFAIL_MSG( wxT("can't show uninitialized sizer item") ); break; case Item_Window: @@ -550,7 +561,7 @@ void wxSizerItem::Show( bool show ) case Item_Max: default: - wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + wxFAIL_MSG( wxT("unexpected wxSizerItem::m_kind") ); } } @@ -595,7 +606,7 @@ bool wxSizerItem::IsShown() const case Item_Max: default: - wxFAIL_MSG( _T("unexpected wxSizerItem::m_kind") ); + wxFAIL_MSG( wxT("unexpected wxSizerItem::m_kind") ); } return false; @@ -623,7 +634,7 @@ wxSizer::~wxSizer() WX_CLEAR_LIST(wxSizerItemList, m_children); } -wxSizerItem* wxSizer::Insert( size_t index, wxSizerItem *item ) +wxSizerItem* wxSizer::DoInsert( size_t index, wxSizerItem *item ) { m_children.Insert( index, item ); @@ -668,7 +679,7 @@ bool wxSizer::Remove( wxWindow *window ) bool wxSizer::Remove( wxSizer *sizer ) { - wxASSERT_MSG( sizer, _T("Removing NULL sizer") ); + wxASSERT_MSG( sizer, wxT("Removing NULL sizer") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) @@ -692,11 +703,11 @@ bool wxSizer::Remove( int index ) { wxCHECK_MSG( index >= 0 && (size_t)index < m_children.GetCount(), false, - _T("Remove index is out of range") ); + wxT("Remove index is out of range") ); wxSizerItemList::compatibility_iterator node = m_children.Item( index ); - wxCHECK_MSG( node, false, _T("Failed to find child node") ); + wxCHECK_MSG( node, false, wxT("Failed to find child node") ); delete node->GetData(); m_children.Erase( node ); @@ -706,7 +717,7 @@ bool wxSizer::Remove( int index ) bool wxSizer::Detach( wxSizer *sizer ) { - wxASSERT_MSG( sizer, _T("Detaching NULL sizer") ); + wxASSERT_MSG( sizer, wxT("Detaching NULL sizer") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) @@ -728,7 +739,7 @@ bool wxSizer::Detach( wxSizer *sizer ) bool wxSizer::Detach( wxWindow *window ) { - wxASSERT_MSG( window, _T("Detaching NULL window") ); + wxASSERT_MSG( window, wxT("Detaching NULL window") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) @@ -751,11 +762,11 @@ bool wxSizer::Detach( int index ) { wxCHECK_MSG( index >= 0 && (size_t)index < m_children.GetCount(), false, - _T("Detach index is out of range") ); + wxT("Detach index is out of range") ); wxSizerItemList::compatibility_iterator node = m_children.Item( index ); - wxCHECK_MSG( node, false, _T("Failed to find child node") ); + wxCHECK_MSG( node, false, wxT("Failed to find child node") ); wxSizerItem *item = node->GetData(); @@ -769,8 +780,8 @@ bool wxSizer::Detach( int index ) bool wxSizer::Replace( wxWindow *oldwin, wxWindow *newwin, bool recursive ) { - wxASSERT_MSG( oldwin, _T("Replacing NULL window") ); - wxASSERT_MSG( newwin, _T("Replacing with NULL window") ); + wxASSERT_MSG( oldwin, wxT("Replacing NULL window") ); + wxASSERT_MSG( newwin, wxT("Replacing with NULL window") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) @@ -797,8 +808,8 @@ bool wxSizer::Replace( wxWindow *oldwin, wxWindow *newwin, bool recursive ) bool wxSizer::Replace( wxSizer *oldsz, wxSizer *newsz, bool recursive ) { - wxASSERT_MSG( oldsz, _T("Replacing NULL sizer") ); - wxASSERT_MSG( newsz, _T("Replacing with NULL sizer") ); + wxASSERT_MSG( oldsz, wxT("Replacing NULL sizer") ); + wxASSERT_MSG( newsz, wxT("Replacing with NULL sizer") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) @@ -824,12 +835,12 @@ bool wxSizer::Replace( wxSizer *oldsz, wxSizer *newsz, bool recursive ) bool wxSizer::Replace( size_t old, wxSizerItem *newitem ) { - wxCHECK_MSG( old < m_children.GetCount(), false, _T("Replace index is out of range") ); - wxASSERT_MSG( newitem, _T("Replacing with NULL item") ); + wxCHECK_MSG( old < m_children.GetCount(), false, wxT("Replace index is out of range") ); + wxASSERT_MSG( newitem, wxT("Replacing with NULL item") ); wxSizerItemList::compatibility_iterator node = m_children.Item( old ); - wxCHECK_MSG( node, false, _T("Failed to find child node") ); + wxCHECK_MSG( node, false, wxT("Failed to find child node") ); wxSizerItem *item = node->GetData(); node->SetData(newitem); @@ -1021,7 +1032,7 @@ void wxSizer::DoSetMinSize( int width, int height ) bool wxSizer::DoSetItemMinSize( wxWindow *window, int width, int height ) { - wxASSERT_MSG( window, _T("SetMinSize for NULL window") ); + wxASSERT_MSG( window, wxT("SetMinSize for NULL window") ); // Is it our immediate child? @@ -1059,7 +1070,7 @@ bool wxSizer::DoSetItemMinSize( wxWindow *window, int width, int height ) bool wxSizer::DoSetItemMinSize( wxSizer *sizer, int width, int height ) { - wxASSERT_MSG( sizer, _T("SetMinSize for NULL sizer") ); + wxASSERT_MSG( sizer, wxT("SetMinSize for NULL sizer") ); // Is it our immediate child? @@ -1099,7 +1110,7 @@ bool wxSizer::DoSetItemMinSize( size_t index, int width, int height ) { wxSizerItemList::compatibility_iterator node = m_children.Item( index ); - wxCHECK_MSG( node, false, _T("Failed to find child node") ); + wxCHECK_MSG( node, false, wxT("Failed to find child node") ); wxSizerItem *item = node->GetData(); @@ -1119,7 +1130,7 @@ bool wxSizer::DoSetItemMinSize( size_t index, int width, int height ) wxSizerItem* wxSizer::GetItem( wxWindow *window, bool recursive ) { - wxASSERT_MSG( window, _T("GetItem for NULL window") ); + wxASSERT_MSG( window, wxT("GetItem for NULL window") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) @@ -1145,7 +1156,7 @@ wxSizerItem* wxSizer::GetItem( wxWindow *window, bool recursive ) wxSizerItem* wxSizer::GetItem( wxSizer *sizer, bool recursive ) { - wxASSERT_MSG( sizer, _T("GetItem for NULL sizer") ); + wxASSERT_MSG( sizer, wxT("GetItem for NULL sizer") ); wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); while (node) @@ -1173,7 +1184,7 @@ wxSizerItem* wxSizer::GetItem( size_t index ) { wxCHECK_MSG( index < m_children.GetCount(), NULL, - _T("GetItem index is out of range") ); + wxT("GetItem index is out of range") ); return m_children.Item( index )->GetData(); } @@ -1268,7 +1279,7 @@ bool wxSizer::IsShown( wxWindow *window ) const node = node->GetNext(); } - wxFAIL_MSG( _T("IsShown failed to find sizer item") ); + wxFAIL_MSG( wxT("IsShown failed to find sizer item") ); return false; } @@ -1287,7 +1298,7 @@ bool wxSizer::IsShown( wxSizer *sizer ) const node = node->GetNext(); } - wxFAIL_MSG( _T("IsShown failed to find sizer item") ); + wxFAIL_MSG( wxT("IsShown failed to find sizer item") ); return false; } @@ -1296,7 +1307,7 @@ bool wxSizer::IsShown( size_t index ) const { wxCHECK_MSG( index < m_children.GetCount(), false, - _T("IsShown index is out of range") ); + wxT("IsShown index is out of range") ); return m_children.Item( index )->GetData()->IsShown(); } @@ -1306,45 +1317,82 @@ bool wxSizer::IsShown( size_t index ) const // wxGridSizer //--------------------------------------------------------------------------- +wxGridSizer::wxGridSizer( int cols, int vgap, int hgap ) + : m_rows( cols == 0 ? 1 : 0 ), + m_cols( cols ), + m_vgap( vgap ), + m_hgap( hgap ) +{ +} + +wxGridSizer::wxGridSizer( int cols, const wxSize& gap ) + : m_rows( cols == 0 ? 1 : 0 ), + m_cols( cols ), + m_vgap( gap.GetHeight() ), + m_hgap( gap.GetWidth() ) +{ +} + wxGridSizer::wxGridSizer( int rows, int cols, int vgap, int hgap ) - : m_rows( ( cols == 0 && rows == 0 ) ? 1 : rows ) - , m_cols( cols ) - , m_vgap( vgap ) - , m_hgap( hgap ) + : m_rows( rows || cols ? rows : 1 ), + m_cols( cols ), + m_vgap( vgap ), + m_hgap( hgap ) { } -wxGridSizer::wxGridSizer( int cols, int vgap, int hgap ) - : m_rows( cols == 0 ? 1 : 0 ) - , m_cols( cols ) - , m_vgap( vgap ) - , m_hgap( hgap ) +wxGridSizer::wxGridSizer( int rows, int cols, const wxSize& gap ) + : m_rows( rows || cols ? rows : 1 ), + m_cols( cols ), + m_vgap( gap.GetHeight() ), + m_hgap( gap.GetWidth() ) { } -int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const +wxSizerItem *wxGridSizer::DoInsert(size_t index, wxSizerItem *item) { - int nitems = m_children.GetCount(); - if ( nitems) + // if only the number of columns or the number of rows is specified for a + // sizer, arbitrarily many items can be added to it but if both of them are + // fixed, then the sizer can't have more than that many items -- check for + // this here to ensure that we detect errors as soon as possible + if ( m_cols && m_rows ) { - if ( m_cols ) - { - ncols = m_cols; - nrows = (nitems + m_cols - 1) / m_cols; - } - else if ( m_rows ) + const int nitems = m_children.GetCount(); + if ( nitems == m_cols*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") ); + wxFAIL_MSG( + wxString::Format( + "too many items (%d > %d*%d) in grid sizer (maybe you " + "should omit the number of either rows or columns?)", + nitems + 1, m_cols, m_rows) + ); - nrows = ncols = 0; + // additionally, continuing to use the specified number of columns + // and rows is not a good idea as callers of CalcRowsCols() expect + // that all sizer items can fit into m_cols-/m_rows-sized arrays + // which is not the case if there are too many items and results in + // crashes, so let it compute the number of rows automatically by + // forgetting the (wrong) number of rows specified (this also has a + // nice side effect of giving only one assert even if there are + // many more items than allowed in this sizer) + m_rows = 0; } } + return wxSizer::DoInsert(index, item); +} + +int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const +{ + const int nitems = m_children.GetCount(); + + ncols = GetEffectiveColsCount(); + nrows = GetEffectiveRowsCount(); + + // Since Insert() checks for overpopulation, the following + // should only assert if the grid was shrunk via SetRows() / SetCols() + wxASSERT_MSG( nitems <= ncols*nrows, "logic error in wxGridSizer" ); + return nitems; } @@ -1371,7 +1419,7 @@ void wxGridSizer::RecalcSizes() { wxSizerItemList::compatibility_iterator node = m_children.Item( i ); - wxASSERT_MSG( node, _T("Failed to find SizerItemList node") ); + wxASSERT_MSG( node, wxT("Failed to find SizerItemList node") ); SetItemBounds( node->GetData(), x, y, w, h); } @@ -1474,6 +1522,20 @@ void wxGridSizer::SetItemBounds( wxSizerItem *item, int x, int y, int w, int h ) // wxFlexGridSizer //--------------------------------------------------------------------------- +wxFlexGridSizer::wxFlexGridSizer( int cols, int vgap, int hgap ) + : wxGridSizer( cols, vgap, hgap ), + m_flexDirection(wxBOTH), + m_growMode(wxFLEX_GROWMODE_SPECIFIED) +{ +} + +wxFlexGridSizer::wxFlexGridSizer( int cols, const wxSize& gap ) + : wxGridSizer( cols, gap ), + m_flexDirection(wxBOTH), + m_growMode(wxFLEX_GROWMODE_SPECIFIED) +{ +} + wxFlexGridSizer::wxFlexGridSizer( int rows, int cols, int vgap, int hgap ) : wxGridSizer( rows, cols, vgap, hgap ), m_flexDirection(wxBOTH), @@ -1481,8 +1543,8 @@ wxFlexGridSizer::wxFlexGridSizer( int rows, int cols, int vgap, int hgap ) { } -wxFlexGridSizer::wxFlexGridSizer( int cols, int vgap, int hgap ) - : wxGridSizer( cols, vgap, hgap ), +wxFlexGridSizer::wxFlexGridSizer( int rows, int cols, const wxSize& gap ) + : wxGridSizer( rows, cols, gap ), m_flexDirection(wxBOTH), m_growMode(wxFLEX_GROWMODE_SPECIFIED) { @@ -1762,6 +1824,38 @@ DoAdjustForGrowables(int delta, void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz) { +#if wxDEBUG_LEVEL + // 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 ) + { + if ( !m_rows ) + { + int nrows = CalcRows(); + + for ( size_t n = 0; n < m_growableRows.size(); n++ ) + { + wxASSERT_MSG( m_growableRows[n] < nrows, + "invalid growable row index" ); + } + } + + if ( !m_cols ) + { + int ncols = CalcCols(); + + for ( size_t n = 0; n < m_growableCols.size(); n++ ) + { + wxASSERT_MSG( m_growableCols[n] < ncols, + "invalid growable column index" ); + } + } + } +#endif // wxDEBUG_LEVEL + + if ( (m_flexDirection & wxHORIZONTAL) || (m_growMode != wxFLEX_GROWMODE_NONE) ) { DoAdjustForGrowables @@ -1776,17 +1870,17 @@ void wxFlexGridSizer::AdjustForGrowables(const wxSize& sz) // This gives nested objects that benefit from knowing one size // component in advance the chance to use that. bool didAdjustMinSize = false; - int nrows, ncols; - CalcRowsCols(nrows, ncols); // Iterate over all items and inform about column width - size_t n = 0; + const int ncols = GetEffectiveColsCount(); + int col = 0; for ( wxSizerItemList::iterator i = m_children.begin(); i != m_children.end(); - ++i, ++n ) + ++i ) { - const int col = n % ncols; didAdjustMinSize |= (*i)->InformFirstDirection(wxHORIZONTAL, m_colWidths[col], sz.y - m_calculatedMinSize.y); + if ( ++col == ncols ) + col = 0; } // Only redo if info was actually used @@ -1830,18 +1924,28 @@ bool wxFlexGridSizer::IsColGrowable( size_t idx ) void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) { - wxCHECK_RET( idx < (size_t)GetRows(), "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 ); } void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) { - wxCHECK_RET( idx < (size_t)GetCols(), "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)m_cols, "invalid column index" ); + m_growableCols.Add( idx ); m_growableColsProportions.Add( proportion ); } @@ -1861,7 +1965,7 @@ DoRemoveFromArrays(size_t idx, wxArrayInt& items, wxArrayInt& proportions) } } - wxFAIL_MSG( _T("column/row is already not growable") ); + wxFAIL_MSG( wxT("column/row is already not growable") ); } void wxFlexGridSizer::RemoveGrowableCol( size_t idx ) @@ -1878,16 +1982,22 @@ void wxFlexGridSizer::RemoveGrowableRow( size_t idx ) // wxBoxSizer //--------------------------------------------------------------------------- +wxSizerItem *wxBoxSizer::AddSpacer(int size) +{ + return IsVertical() ? Add(0, size) : Add(size, 0); +} + void wxBoxSizer::RecalcSizes() { if ( m_children.empty() ) return; const wxCoord totalMinorSize = GetSizeInMinorDir(m_size); + const wxCoord totalMajorSize = GetSizeInMajorDir(m_size); // the amount of free space which we should redistribute among the // stretchable items (i.e. those with non zero proportion) - int delta = GetSizeInMajorDir(m_size) - GetSizeInMajorDir(m_minSize); + int delta = totalMajorSize - GetSizeInMajorDir(m_minSize); // Inform child items about the size in minor direction, that can @@ -1920,11 +2030,14 @@ void wxBoxSizer::RecalcSizes() // might have a new delta now - delta = GetSizeInMajorDir(m_size) - GetSizeInMajorDir(m_minSize); + delta = totalMajorSize - GetSizeInMajorDir(m_minSize); // the position at which we put the next child wxPoint pt(m_position); + // space remaining for the items + wxCoord majorRemaining = totalMajorSize; + int totalProportion = m_totalProportion; for ( i = m_children.begin(); i != m_children.end(); @@ -1940,11 +2053,10 @@ void wxBoxSizer::RecalcSizes() // adjust the size in the major direction using the proportion wxCoord majorSize = GetSizeInMajorDir(sizeThis); - // if there is not enough space, don't try to distribute negative space - // among the children, this would result in overlapping windows which - // we don't want if ( delta > 0 ) { + // distribute extra space among the items respecting their + // proportions const int propItem = item->GetProportion(); if ( propItem ) { @@ -1956,6 +2068,18 @@ void wxBoxSizer::RecalcSizes() totalProportion -= propItem; } } + else // delta < 0 + { + // we're not going to have enough space for making all items even + // of their minimal size, check if this item still fits at all and + // truncate it if it doesn't -- even if it means giving it 0 size + // and thus making it invisible because we just can't do anything + // else + if ( majorSize > majorRemaining ) + majorSize = majorRemaining; + + majorRemaining -= majorSize; + } // apply the alignment in the minor direction @@ -1973,7 +2097,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; } @@ -2053,29 +2177,44 @@ wxStaticBoxSizer::~wxStaticBoxSizer() delete m_staticBox; } -static void GetStaticBoxBorders( wxStaticBox *box, - int *borderTop, - int *borderOther) -{ - // this has to be done platform by platform as there is no way to - // guess the thickness of a wxStaticBox border - box->GetBordersForSizer(borderTop, borderOther); -} - void wxStaticBoxSizer::RecalcSizes() { int top_border, other_border; - GetStaticBoxBorders(m_staticBox, &top_border, &other_border); + m_staticBox->GetBordersForSizer(&top_border, &other_border); m_staticBox->SetSize( m_position.x, m_position.y, m_size.x, m_size.y ); - wxPoint old_pos( m_position ); - m_position.x += other_border; - m_position.y += top_border; wxSize old_size( m_size ); m_size.x -= 2*other_border; m_size.y -= top_border + other_border; + wxPoint old_pos( m_position ); + if (m_staticBox->GetChildren().GetCount() > 0) + { +#if defined( __WXGTK20__ ) + // if the wxStaticBox has created a wxPizza to contain its children + // (see wxStaticBox::AddChild) then we need to place the items it contains + // in the wxBoxSizer::RecalcSizes() call below using coordinates relative + // to the top-left corner of the staticbox: + m_position.x = m_position.y = 0; +#else + // if the wxStaticBox has childrens, then these windows must be placed + // by the wxBoxSizer::RecalcSizes() call below using coordinates relative + // to the top-left corner of the staticbox (but unlike wxGTK, we need + // to keep in count the static borders here!): + m_position.x = other_border; + m_position.y = top_border; +#endif + } + else + { + // the windows contained in the staticbox have been created as siblings of the + // staticbox (this is the "old" way of staticbox contents creation); in this + // case we need to position them with coordinates relative to our common parent + m_position.x += other_border; + m_position.y += top_border; + } + wxBoxSizer::RecalcSizes(); m_position = old_pos; @@ -2085,10 +2224,17 @@ void wxStaticBoxSizer::RecalcSizes() wxSize wxStaticBoxSizer::CalcMin() { int top_border, other_border; - GetStaticBoxBorders(m_staticBox, &top_border, &other_border); + m_staticBox->GetBordersForSizer(&top_border, &other_border); wxSize ret( wxBoxSizer::CalcMin() ); ret.x += 2*other_border; + + // ensure that we're wide enough to show the static box label (there is no + // need to check for the static box best size in vertical direction though) + const int boxWidth = m_staticBox->GetBestSize().x; + if ( ret.x < boxWidth ) + ret.x = boxWidth; + ret.y += other_border + top_border; return ret; @@ -2116,6 +2262,10 @@ bool wxStaticBoxSizer::Detach( wxWindow *window ) #endif // wxUSE_STATBOX +//--------------------------------------------------------------------------- +// wxStdDialogButtonSizer +//--------------------------------------------------------------------------- + #if wxUSE_BUTTON wxStdDialogButtonSizer::wxStdDialogButtonSizer() @@ -2223,7 +2373,7 @@ void wxStdDialogButtonSizer::Realize() } // Extra space around and at the right - Add(12, 24); + Add(12, 40); #elif defined(__WXGTK20__) Add(0, 0, 0, wxLEFT, 9); if (m_buttonHelp)