wxSize wxSizer::Fit( wxWindow *window )
{
- wxSize size;
- if (window->IsTopLevel())
- size = FitSize( window );
- else
- size = GetMinWindowSize( window );
+ wxSize size(window->IsTopLevel() ? FitSize(window)
+ : GetMinWindowSize(window));
window->SetSize( size );
size_t idx;
for (idx = 0; idx < m_growableRows.GetCount(); idx++)
{
- // Since the number of rows/columns can change as items are inserted/deleted, we need
+ // Since the number of rows/columns can change as items are inserted/deleted, we need
// to verify at runtime that the requested growable rows/columns are still valid.
- if (m_growableRows[idx] >= nrows)
+ if (m_growableRows[idx] >= nrows)
continue;
// If all items in a row/column are hidden, that row/column will have a dimension of -1.
// This causes the row/column to be hidden completely.
- if (m_rowHeights[ m_growableRows[idx] ] == -1)
+ if (m_rowHeights[ m_growableRows[idx] ] == -1)
continue;
sum_proportions += m_growableRowsProportions[idx];
growable_space += m_rowHeights[ m_growableRows[idx] ];
{
for (idx = 0; idx < m_growableRows.GetCount(); idx++)
{
- if (m_growableRows[idx] >= nrows )
+ if (m_growableRows[idx] >= nrows )
continue;
- if (m_rowHeights[ m_growableRows[idx] ] == -1)
+ if (m_rowHeights[ m_growableRows[idx] ] == -1)
m_rowHeights[ m_growableRows[idx] ] = 0;
else
{
size_t idx;
for (idx = 0; idx < m_growableCols.GetCount(); idx++)
{
- // Since the number of rows/columns can change as items are inserted/deleted, we need
+ // Since the number of rows/columns can change as items are inserted/deleted, we need
// to verify at runtime that the requested growable rows/columns are still valid.
- if (m_growableCols[idx] >= ncols)
+ if (m_growableCols[idx] >= ncols)
continue;
// If all items in a row/column are hidden, that row/column will have a dimension of -1.
// This causes the column to be hidden completely.
- if (m_colWidths[ m_growableCols[idx] ] == -1)
+ if (m_colWidths[ m_growableCols[idx] ] == -1)
continue;
sum_proportions += m_growableColsProportions[idx];
// wtb 5/12/02 bugfix - was m_ColWidths[idx]!!
{
for (idx = 0; idx < m_growableCols.GetCount(); idx++)
{
- if (m_growableCols[idx] >= ncols )
+ if (m_growableCols[idx] >= ncols )
continue;
- if (m_colWidths[ m_growableCols[idx] ] == -1)
+ if (m_colWidths[ m_growableCols[idx] ] == -1)
m_colWidths[ m_growableCols[idx] ] = 0;
else
{
m_rowHeights.SetCount(nrows);
m_colWidths.SetCount(ncols);
- // We have to recalcuate the sizes in case an item has wxADJUST_MINSIZE, has changed
+ // We have to recalcuate the sizes in case an item has wxADJUST_MINSIZE, has changed
// minimum size since the previous layout, or has been hidden using wxSizer::Show().
- // If all the items in a row/column are hidden, the final dimension of the row/column
+ // If all the items in a row/column are hidden, the final dimension of the row/column
// will be -1, indicating that the column itself is hidden.
for( s = m_rowHeights.GetCount(), i = 0; i < s; ++i )
m_rowHeights[ i ] = -1;
// -1 is used as a magic number meaning empty column.
int width = 0;
for (int col = 0; col < ncols; col++)
- if ( m_colWidths[ col ] != -1 )
+ if ( m_colWidths[ col ] != -1 )
width += m_colWidths[ col ] + ( col == ncols-1 ? 0 : m_hgap );
int height = 0;
return;
int delta = 0;
- int extra = 0;
if (m_stretchable)
{
if (m_orient == wxHORIZONTAL)
- {
- delta = (m_size.x - m_fixedWidth) / m_stretchable;
- extra = (m_size.x - m_fixedWidth) % m_stretchable;
- }
+ delta = m_size.x - m_fixedWidth;
else
- {
- delta = (m_size.y - m_fixedHeight) / m_stretchable;
- extra = (m_size.y - m_fixedHeight) % m_stretchable;
- }
+ delta = m_size.y - m_fixedHeight;
}
wxPoint pt( m_position );
if (item->IsShown())
{
- int weight = 1;
- if (item->GetProportion())
- weight = item->GetProportion();
-
wxSize size( item->CalcMin() );
if (m_orient == wxVERTICAL)
wxCoord height = size.y;
if (item->GetProportion())
{
- height = (delta * weight) + extra;
- extra = 0; // only the first item will get the remainder as extra size
+ // Because of at least one visible item has non-zero
+ // proportion then m_stretchable is not zero
+ height = (delta * item->GetProportion()) / m_stretchable;
}
wxPoint child_pos( pt );
wxCoord width = size.x;
if (item->GetProportion())
{
- width = (delta * weight) + extra;
- extra = 0; // only the first item will get the remainder as extra size
+ // Because of at least one visible item has non-zero
+ // proportion then m_stretchable is not zero
+ width = (delta * item->GetProportion()) / m_stretchable;
}
wxPoint child_pos( pt );
m_fixedWidth = 0;
m_fixedHeight = 0;
- // Find how long each stretch unit needs to be
- int stretchSize = 1;
wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
+ while (node)
+ {
+ wxSizerItem *item = node->GetData();
+
+ if (item->IsShown() && item->GetProportion() != 0)
+ m_stretchable += item->GetProportion();
+ node = node->GetNext();
+ }
+
+ // Total minimum size (width or height) of sizer
+ int maxMinSize = 0;
+
+ node = m_children.GetFirst();
while (node)
{
- wxSizerItem *item = node->GetData();
+ wxSizerItem *item = node->GetData();
if (item->IsShown() && item->GetProportion() != 0)
{
int stretch = item->GetProportion();
wxSize size( item->CalcMin() );
- int sizePerStretch;
+ int minSize;
+
// Integer division rounded up is (a + b - 1) / b
+ // Round up needed in order to guarantee that all
+ // all items will have size not less then their min size
if (m_orient == wxHORIZONTAL)
- sizePerStretch = ( size.x + stretch - 1 ) / stretch;
+ minSize = ( size.x*m_stretchable + stretch - 1)/stretch;
else
- sizePerStretch = ( size.y + stretch - 1 ) / stretch;
- if (sizePerStretch > stretchSize)
- stretchSize = sizePerStretch;
+ minSize = ( size.y*m_stretchable + stretch - 1)/stretch;
+
+ if (minSize > maxMinSize)
+ maxMinSize = minSize;
}
node = node->GetNext();
}
node = m_children.GetFirst();
while (node)
{
- wxSizerItem *item = node->GetData();
+ wxSizerItem *item = node->GetData();
if (item->IsShown())
{
- m_stretchable += item->GetProportion();
-
wxSize size( item->CalcMin() );
if (item->GetProportion() != 0)
{
if (m_orient == wxHORIZONTAL)
- size.x = stretchSize * item->GetProportion();
+ size.x = (maxMinSize*item->GetProportion())/m_stretchable;
else
- size.y = stretchSize * item->GetProportion();
- }
-
- if (m_orient == wxHORIZONTAL)
- {
- m_minWidth += size.x;
- m_minHeight = wxMax( m_minHeight, size.y );
+ size.y = (maxMinSize*item->GetProportion())/m_stretchable;
}
else
- {
- m_minHeight += size.y;
- m_minWidth = wxMax( m_minWidth, size.x );
- }
-
- if (item->GetProportion() == 0)
{
if (m_orient == wxVERTICAL)
{
m_fixedHeight = wxMax( m_fixedHeight, size.y );
}
}
+
+ if (m_orient == wxHORIZONTAL)
+ {
+ m_minWidth += size.x;
+ m_minHeight = wxMax( m_minHeight, size.y );
+ }
+ else
+ {
+ m_minHeight += size.y;
+ m_minWidth = wxMax( m_minWidth, size.x );
+ }
}
node = node->GetNext();
}
return wxSize( maxX, maxY ) + sizeBorder;
}
+
+#if wxUSE_NOTEBOOK
+
+wxNotebookSizer::wxNotebookSizer(wxNotebook *nb)
+ : wxBookCtrlSizer(nb)
+{
+}
+
+#endif // wxUSE_NOTEBOOOK
#endif // wxUSE_BOOKCTRL