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 );
{
}
-wxSizerItem *wxGridSizer::Insert(size_t index, wxSizerItem *item)
+wxSizerItem *wxGridSizer::DoInsert(size_t index, wxSizerItem *item)
{
// 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
}
}
- return wxSizer::Insert(index, item);
+ return wxSizer::DoInsert(index, item);
}
int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const
// 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
// 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();
// 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 )
{
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