// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "sizer.h"
#endif
#if wxUSE_STATBOX
IMPLEMENT_CLASS(wxStaticBoxSizer, wxBoxSizer)
#endif
+#if wxUSE_BOOKCTRL
+IMPLEMENT_CLASS(wxBookCtrlSizer, wxSizer)
#if wxUSE_NOTEBOOK
-IMPLEMENT_CLASS(wxNotebookSizer, wxSizer)
-#endif
+IMPLEMENT_CLASS(wxNotebookSizer, wxBookCtrlSizer)
+#endif // wxUSE_NOTEBOOK
+#endif // wxUSE_BOOKCTRL
WX_DEFINE_EXPORTED_LIST( wxSizerItemList );
-
+/*
+ TODO PROPERTIES
+ sizeritem
+ object
+ object_ref
+ minsize
+ option
+ flag
+ border
+ spacer
+ option
+ flag
+ borfder
+ boxsizer
+ orient
+ staticboxsizer
+ orient
+ label
+ gridsizer
+ rows
+ cols
+ vgap
+ hgap
+ flexgridsizer
+ rows
+ cols
+ vgap
+ hgap
+ growablerows
+ growablecols
+ minsize
+*/
//---------------------------------------------------------------------------
// wxSizerItem
//---------------------------------------------------------------------------
wxSizerItem::~wxSizerItem()
{
- if (m_userData)
- delete m_userData;
- if (m_sizer)
+ delete m_userData;
+
+ if ( m_window )
+ {
+ m_window->SetContainingSizer(NULL);
+ }
+ else // we must be a sizer
+ {
delete m_sizer;
+ }
}
wxSizer::wxSizer()
: m_minSize( wxSize( 0, 0 ) )
{
- m_children.DeleteContents( true );
}
wxSizer::~wxSizer()
{
- Clear();
+ WX_CLEAR_LIST(wxSizerItemList, m_children);
}
void wxSizer::Add( wxWindow *window, int proportion, int flag, int border, wxObject* userData )
{
wxASSERT_MSG( sizer, _T("Removing NULL sizer") );
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
if (item->GetSizer() == sizer)
- return m_children.DeleteNode( node );
+ {
+ delete item;
+ m_children.Erase( node );
+ return true;
+ }
node = node->GetNext();
}
false,
_T("Remove index is out of range") );
- wxSizerItemList::Node *node = m_children.Item( index );
+ wxSizerItemList::compatibility_iterator node = m_children.Item( index );
wxCHECK_MSG( node, false, _T("Failed to find child node") );
if( item->IsWindow() )
item->GetWindow()->SetContainingSizer( NULL );
- return m_children.DeleteNode( node );
+ delete item;
+ m_children.Erase( node );
+ return true;
}
bool wxSizer::Detach( wxSizer *sizer )
{
wxASSERT_MSG( sizer, _T("Detaching NULL sizer") );
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
if (item->GetSizer() == sizer)
{
item->DetachSizer();
- return m_children.DeleteNode( node );
+ delete item;
+ m_children.Erase( node );
+ return true;
}
node = node->GetNext();
}
{
wxASSERT_MSG( window, _T("Detaching NULL window") );
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
if (item->GetWindow() == window)
{
item->GetWindow()->SetContainingSizer( NULL );
- return m_children.DeleteNode( node );
+ delete item;
+ m_children.Erase( node );
+ return true;
}
node = node->GetNext();
}
false,
_T("Detach index is out of range") );
- wxSizerItemList::Node *node = m_children.Item( index );
+ wxSizerItemList::compatibility_iterator node = m_children.Item( index );
wxCHECK_MSG( node, false, _T("Failed to find child node") );
else if( item->IsWindow() )
item->GetWindow()->SetContainingSizer( NULL );
- return m_children.DeleteNode( node );
+ delete item;
+ m_children.Erase( node );
+ return true;
}
void wxSizer::Clear( bool delete_windows )
{
// First clear the ContainingSizer pointers
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
DeleteWindows();
// Now empty the list
- m_children.Clear();
+ WX_CLEAR_LIST(wxSizerItemList, m_children);
}
void wxSizer::DeleteWindows()
{
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
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 );
// Is it our immediate child?
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
// Is it our immediate child?
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
bool wxSizer::DoSetItemMinSize( size_t index, int width, int height )
{
- wxSizerItemList::Node *node = m_children.Item( index );
+ wxSizerItemList::compatibility_iterator node = m_children.Item( index );
wxCHECK_MSG( node, false, _T("Failed to find child node") );
{
wxASSERT_MSG( window, _T("Show for NULL window") );
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
{
wxASSERT_MSG( sizer, _T("Show for NULL sizer") );
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
void wxSizer::ShowItems( bool show )
{
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
node->GetData()->Show( show );
bool wxSizer::IsShown( wxWindow *window ) const
{
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
bool wxSizer::IsShown( wxSizer *sizer ) const
{
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
int i = r * ncols + c;
if (i < nitems)
{
- wxSizerItemList::Node *node = m_children.Item( i );
+ wxSizerItemList::compatibility_iterator node = m_children.Item( i );
wxASSERT_MSG( node, _T("Failed to find SizerItemList node") );
wxSize wxGridSizer::CalcMin()
{
- int nitems, nrows, ncols;
- if ( (nitems = CalcRowsCols(nrows, ncols)) == 0 )
+ int nrows, ncols;
+ if ( CalcRowsCols(nrows, ncols) == 0 )
return wxSize(10, 10);
// Find the max width and height for any component
int w = 0;
int h = 0;
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
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
{
int i = r * ncols + c;
if (i < nitems)
{
- wxSizerItemList::Node *node = m_children.Item( i );
+ wxSizerItemList::compatibility_iterator node = m_children.Item( i );
wxASSERT_MSG( node, _T("Failed to find node") );
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;
for( s = m_colWidths.GetCount(), i = 0; i < s; ++i )
m_colWidths[ i ] = -1;
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
i = 0;
while (node)
// -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 );
- wxSizerItemList::Node *node = m_children.GetFirst();
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
wxSizerItem *item = node->GetData();
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::Node *node = m_children.GetFirst();
+ 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();
}
#endif // wxUSE_STATBOX
-//---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
// wxNotebookSizer
-//---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
-#if wxUSE_NOTEBOOK
+#if wxUSE_BOOKCTRL
-wxNotebookSizer::wxNotebookSizer( wxNotebook *nb )
- : m_notebook( nb )
+wxBookCtrlSizer::wxBookCtrlSizer(wxBookCtrl *bookctrl)
+ : m_bookctrl(bookctrl)
{
- wxASSERT_MSG( nb, wxT("wxNotebookSizer needs a notebook") );
+ wxASSERT_MSG( bookctrl, wxT("wxBookCtrlSizer needs a control") );
}
-void wxNotebookSizer::RecalcSizes()
+void wxBookCtrlSizer::RecalcSizes()
{
- m_notebook->SetSize( m_position.x, m_position.y, m_size.x, m_size.y );
+ m_bookctrl->SetSize( m_position.x, m_position.y, m_size.x, m_size.y );
}
-wxSize wxNotebookSizer::CalcMin()
+wxSize wxBookCtrlSizer::CalcMin()
{
- wxSize sizeBorder = m_notebook->CalcSizeFromPage(wxSize(0, 0));
+ wxSize sizeBorder = m_bookctrl->CalcSizeFromPage(wxSize(0, 0));
sizeBorder.x += 5;
sizeBorder.y += 5;
- if (m_notebook->GetChildren().GetCount() == 0)
+ if ( m_bookctrl->GetPageCount() == 0 )
{
return wxSize(sizeBorder.x + 10, sizeBorder.y + 10);
}
int maxX = 0;
int maxY = 0;
- wxWindowList::Node *node = m_notebook->GetChildren().GetFirst();
+ wxWindowList::compatibility_iterator
+ node = m_bookctrl->GetChildren().GetFirst();
while (node)
{
wxWindow *item = node->GetData();
return wxSize( maxX, maxY ) + sizeBorder;
}
-#endif // wxUSE_NOTEBOOK
-// vi:sts=4:sw=4:et
+#if wxUSE_NOTEBOOK
+
+wxNotebookSizer::wxNotebookSizer(wxNotebook *nb)
+ : wxBookCtrlSizer(nb)
+{
+}
+
+#endif // wxUSE_NOTEBOOOK
+#endif // wxUSE_BOOKCTRL
+