// Created:
 // RCS-ID:      $Id$
 // Copyright:   (c) Robin Dunn, Dirk Holtwick and Robert Roebling
+//              (c) 2003, Ron Lee
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 {
 public:
     // spacer
-    wxSizerItem( int width, int height, int option, int flag, int border, wxObject* userData);
+    wxSizerItem( int width,
+                 int height,
+                 int proportion,
+                 int flag,
+                 int border,
+                 wxObject* userData);
 
     // window
-    wxSizerItem( wxWindow *window, int option, int flag, int border, wxObject* userData );
+    wxSizerItem( wxWindow *window,
+                 int proportion,
+                 int flag,
+                 int border,
+                 wxObject* userData );
 
     // subsizer
-    wxSizerItem( wxSizer *sizer, int option, int flag, int border, wxObject* userData );
+    wxSizerItem( wxSizer *sizer,
+                 int proportion,
+                 int flag,
+                 int border,
+                 wxObject* userData );
 
     ~wxSizerItem();
     
 
     wxSize GetMinSize()
         { return m_minSize; }
+    void SetInitSize( int x, int y )
+        { m_minSize.x = x; m_minSize.y = y; }
 
     void SetRatio( int width, int height )
         // if either of dimensions is zero, ratio is assumed to be 1
     bool IsSizer();
     bool IsSpacer();
 
-    void SetInitSize( int x, int y )
-        { m_minSize.x = x; m_minSize.y = y; }
-    void SetOption( int option )
-        { m_option = option; }
+    // Deprecated in 2.6, use {G,S}etProportion instead.
+    wxDEPRECATED( void SetOption( int option ) );
+    wxDEPRECATED( int GetOption() const );
+
+    void SetProportion( int proportion )
+        { m_proportion = proportion; }
+    int GetProportion() const
+        { return m_proportion; }
     void SetFlag( int flag )
         { m_flag = flag; }
+    int GetFlag() const
+        { return m_flag; }
     void SetBorder( int border )
         { m_border = border; }
-    void Show ( bool show )
-        { m_show = show; }
+    int GetBorder() const
+        { return m_border; }
 
     wxWindow *GetWindow() const
         { return m_window; }
         { return m_sizer; }
     void SetSizer( wxSizer *sizer )
         { m_sizer = sizer; }
-    int GetOption() const
-        { return m_option; }
-    int GetFlag() const
-        { return m_flag; }
-    int GetBorder() const
-        { return m_border; }
+    const wxSize &GetSpacer() const
+        { return m_size; }
+    void SetSpacer( const wxSize &size )
+        { m_size = size; m_minSize = size; }
+
+    void Show ( bool show );
     bool IsShown() const
         { return m_show; }
+
     wxObject* GetUserData()
         { return m_userData; }
     wxPoint GetPosition()
     wxSize       m_size;
     wxPoint      m_pos;
     wxSize       m_minSize;
-    int          m_option;
+    int          m_proportion;
     int          m_border;
     int          m_flag;
 
-    // If TRUE, then this item is considered in the layout
+    // If true, then this item is considered in the layout
     // calculation.  Otherwise, it is skipped over. 
     bool         m_show;
-    // als: aspect ratio can always be calculated from m_size,
-    //      but this would cause precision loss when the window
-    //      is shrinked.  it is safer to preserve initial value.
+
+    // Aspect ratio can always be calculated from m_size,
+    // but this would cause precision loss when the window
+    // is shrunk.  It is safer to preserve the initial value.
     float        m_ratio;
 
     wxObject    *m_userData;
 
-private:
-    DECLARE_CLASS(wxSizerItem);
+    DECLARE_DYNAMIC_CLASS(wxSizerItem);
     DECLARE_NO_COPY_CLASS(wxSizerItem)
 };
 
+WX_DECLARE_EXPORTED_LIST( wxSizerItem, wxSizerItemList );
+
+
 //---------------------------------------------------------------------------
 // wxSizer
 //---------------------------------------------------------------------------
     ~wxSizer();
 
     /* These should be called Append() really. */
-    virtual void Add( wxWindow *window, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-    virtual void Add( wxSizer *sizer, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-    virtual void Add( int width, int height, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-
-    virtual void Insert( int before, wxWindow *window, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-    virtual void Insert( int before, wxSizer *sizer, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-    virtual void Insert( int before, int width, int height, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-
-    virtual void Prepend( wxWindow *window, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-    virtual void Prepend( wxSizer *sizer, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-    virtual void Prepend( int width, int height, int option = 0, int flag = 0, int border = 0, wxObject* userData = NULL );
-
-    // Remove will delete a sizer, but not a window.
-    virtual bool Remove( wxWindow *window );
+    virtual void Add( wxWindow *window,
+                      int proportion = 0,
+                      int flag = 0,
+                      int border = 0,
+                      wxObject* userData = NULL );
+    virtual void Add( wxSizer *sizer,
+                      int proportion = 0,
+                      int flag = 0,
+                      int border = 0,
+                      wxObject* userData = NULL );
+    virtual void Add( int width,
+                      int height,
+                      int proportion = 0,
+                      int flag = 0,
+                      int border = 0,
+                      wxObject* userData = NULL );
+    virtual void Add( wxSizerItem *item );
+
+    virtual void Insert( size_t index,
+                         wxWindow *window,
+                         int proportion = 0,
+                         int flag = 0,
+                         int border = 0,
+                         wxObject* userData = NULL );
+    virtual void Insert( size_t index,
+                         wxSizer *sizer,
+                         int proportion = 0,
+                         int flag = 0,
+                         int border = 0,
+                         wxObject* userData = NULL );
+    virtual void Insert( size_t index,
+                         int width,
+                         int height,
+                         int proportion = 0,
+                         int flag = 0,
+                         int border = 0,
+                         wxObject* userData = NULL );
+    virtual void Insert( size_t index,
+                         wxSizerItem *item );
+
+    virtual void Prepend( wxWindow *window,
+                          int proportion = 0,
+                          int flag = 0,
+                          int border = 0,
+                          wxObject* userData = NULL );
+    virtual void Prepend( wxSizer *sizer,
+                          int proportion = 0,
+                          int flag = 0,
+                          int border = 0,
+                          wxObject* userData = NULL );
+    virtual void Prepend( int width,
+                          int height,
+                          int proportion = 0,
+                          int flag = 0,
+                          int border = 0,
+                          wxObject* userData = NULL );
+    virtual void Prepend( wxSizerItem *item );
+
+    // Deprecated in 2.6 since historically it does not delete the window,
+    // use Detach instead.
+    wxDEPRECATED( virtual bool Remove( wxWindow *window ) );
     virtual bool Remove( wxSizer *sizer );
-    virtual bool Remove( int pos );
+    virtual bool Remove( size_t index );
 
-    // Detach will never destroy a sizer or window.
-    virtual bool Detach( wxWindow *window )
-        { return Remove( window ); }
+    virtual bool Detach( wxWindow *window );
     virtual bool Detach( wxSizer *sizer );
-    virtual bool Detach( int pos );
+    virtual bool Detach( size_t index );
 
-    virtual void Clear( bool delete_windows=FALSE );
+    virtual void Clear( bool delete_windows=false );
     virtual void DeleteWindows();
 
     void SetMinSize( int width, int height )
     bool SetItemMinSize( wxSizer *sizer, wxSize size )
         { return DoSetItemMinSize( sizer, size.x, size.y ); }
 
-    bool SetItemMinSize( int pos, int width, int height )
-        { return DoSetItemMinSize( pos, width, height ); }
-    bool SetItemMinSize( int pos, wxSize size )
-        { return DoSetItemMinSize( pos, size.x, size.y ); }
+    bool SetItemMinSize( size_t index, int width, int height )
+        { return DoSetItemMinSize( index, width, height ); }
+    bool SetItemMinSize( size_t index, wxSize size )
+        { return DoSetItemMinSize( index, size.x, size.y ); }
 
     wxSize GetSize()
         { return m_size; }
     void SetSizeHints( wxWindow *window );
     void SetVirtualSizeHints( wxWindow *window );
 
-    wxList& GetChildren()
+    wxSizerItemList& GetChildren()
         { return m_children; }
 
     void SetDimension( int x, int y, int width, int height );
 
-    // Manage whether individual windows or sub-sizers are considered
+    // Manage whether individual scene items are considered
     // in the layout calculations or not.
-    void Show( wxWindow *window, bool show = TRUE );
-    void Hide( wxWindow *window )
-        { Show (window, FALSE); }
-    void Show( wxSizer *sizer, bool show = TRUE );
+    void Show( wxWindow *window, bool show = true );
+    void Show( wxSizer *sizer, bool show = true );
+    void Show( size_t index, bool show = true );
+
     void Hide( wxSizer *sizer )
-        { Show (sizer, FALSE); }
+        { Show( sizer, false ); }
+    void Hide( wxWindow *window )
+        { Show( window, false ); }
+    void Hide( size_t index )
+        { Show( index, false ); }
 
     bool IsShown( wxWindow *window );
     bool IsShown( wxSizer *sizer );
+    bool IsShown( size_t index );
     
     // Recursively call wxWindow::Show () on all sizer items.
     void ShowItems (bool show);
 
 protected:
-    wxSize  m_size;
-    wxSize  m_minSize;
-    wxPoint m_position;
-    wxList  m_children;
+    wxSize              m_size;
+    wxSize              m_minSize;
+    wxPoint             m_position;
+    wxSizerItemList     m_children;
 
     wxSize GetMaxWindowSize( wxWindow *window );
     wxSize GetMinWindowSize( wxWindow *window );
     virtual void DoSetMinSize( int width, int height );
     virtual bool DoSetItemMinSize( wxWindow *window, int width, int height );
     virtual bool DoSetItemMinSize( wxSizer *sizer, int width, int height );
-    virtual bool DoSetItemMinSize( int pos, int width, int height );
+    virtual bool DoSetItemMinSize( size_t index, int width, int height );
 
-private:
-    DECLARE_CLASS(wxSizer);
+    DECLARE_DYNAMIC_CLASS(wxSizer);
 };
 
 //---------------------------------------------------------------------------
 
     void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h );
 
-private:
-    DECLARE_CLASS(wxGridSizer);
+    DECLARE_DYNAMIC_CLASS(wxGridSizer);
 };
 
 //---------------------------------------------------------------------------
 
     void CreateArrays();
 
-private:
-    DECLARE_CLASS(wxFlexGridSizer);
+    DECLARE_DYNAMIC_CLASS(wxFlexGridSizer);
     DECLARE_NO_COPY_CLASS(wxFlexGridSizer)
 };
 
     int m_fixedWidth;
     int m_fixedHeight;
 
-private:
-    DECLARE_CLASS(wxBoxSizer);
+    DECLARE_DYNAMIC_CLASS(wxBoxSizer);
 };
 
 //---------------------------------------------------------------------------
 protected:
     wxStaticBox   *m_staticBox;
 
-private:
-    DECLARE_CLASS(wxStaticBoxSizer);
+    DECLARE_DYNAMIC_CLASS(wxStaticBoxSizer);
     DECLARE_NO_COPY_CLASS(wxStaticBoxSizer)
 };
 
 protected:
     wxNotebook   *m_notebook;
 
-private:
-    DECLARE_CLASS(wxNotebookSizer);
+    DECLARE_DYNAMIC_CLASS(wxNotebookSizer);
     DECLARE_NO_COPY_CLASS(wxNotebookSizer)
 };
 
 
 // Created:
 // RCS-ID:      $Id$
 // Copyright:   (c) Robin Dunn, Dirk Holtwick and Robert Roebling
+//              (c) 2003, Ron Lee
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/utils.h"
 #include "wx/statbox.h"
 #include "wx/notebook.h"
+#include <wx/listimpl.cpp>
 
 //---------------------------------------------------------------------------
 
 IMPLEMENT_ABSTRACT_CLASS(wxNotebookSizer, wxSizer)
 #endif
 
+WX_DEFINE_EXPORTED_LIST( wxSizerItemList );
+
+
 //---------------------------------------------------------------------------
 // wxSizerItem
 //---------------------------------------------------------------------------
 
-wxSizerItem::wxSizerItem( int width, int height, int option, int flag, int border, wxObject* userData )
-    : m_window( 0 )
-    , m_sizer( 0 )
+wxSizerItem::wxSizerItem( int width, int height, int proportion, int flag, int border, wxObject* userData )
+    : m_window( NULL )
+    , m_sizer( NULL )
     , m_size( wxSize( width, height ) ) // size is set directly
     , m_minSize( m_size )               // minimal size is the initial size
-    , m_option( option )
+    , m_proportion( proportion )
     , m_border( border )
     , m_flag( flag )
-    , m_show( TRUE )                    // Cannot be changed
+    , m_show( true )
     , m_userData( userData )
 {
     SetRatio( m_size );
 }
 
-wxSizerItem::wxSizerItem( wxWindow *window, int option, int flag, int border, wxObject* userData )
+wxSizerItem::wxSizerItem( wxWindow *window, int proportion, int flag, int border, wxObject* userData )
     : m_window( window )
-    , m_sizer( 0 )
+    , m_sizer( NULL )
     , m_minSize( window->GetSize() )    // minimal size is the initial size
-    , m_option( option )
+    , m_proportion( proportion )
     , m_border( border )
     , m_flag( flag )
-    , m_show( TRUE )
+    , m_show( true )
     , m_userData( userData )
 {
     // aspect ratio calculated from initial size
     // m_size is calculated later
 }
 
-wxSizerItem::wxSizerItem( wxSizer *sizer, int option, int flag, int border, wxObject* userData )
-    : m_window( 0 )
+wxSizerItem::wxSizerItem( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData )
+    : m_window( NULL )
     , m_sizer( sizer )
-    , m_option( option )
+    , m_proportion( proportion )
     , m_border( border )
     , m_flag( flag )
-    , m_show( TRUE )
-    , m_ratio( 0 )
+    , m_show( true )
+    , m_ratio( 0.0 )
     , m_userData( userData )
 {
     // m_minSize is calculated later
     return (m_window == NULL) && (m_sizer == NULL);
 }
 
+void wxSizerItem::Show( bool show )
+{
+    m_show = show;
+
+    if( IsWindow() )
+        m_window->Show( show );
+    else if( IsSizer() )
+        m_sizer->ShowItems( show );
+
+    // ... nothing else to do to hide/show spacers
+}
+
+void wxSizerItem::SetOption( int option )
+{
+    SetProportion( option );
+}
+
+int wxSizerItem::GetOption() const
+{
+    return GetProportion();
+}
+
+
 //---------------------------------------------------------------------------
 // wxSizer
 //---------------------------------------------------------------------------
 
 wxSizer::wxSizer()
+    : m_minSize( wxSize( 0, 0 ) )
 {
-    m_children.DeleteContents( TRUE );
-    m_minSize.x = 0;
-    m_minSize.y = 0;
+    m_children.DeleteContents( true );
 }
 
 wxSizer::~wxSizer()
     Clear();
 }
 
-void wxSizer::Add( wxWindow *window, int option, int flag, int border, wxObject* userData )
+void wxSizer::Add( wxWindow *window, int proportion, int flag, int border, wxObject* userData )
 {
-    m_children.Append( new wxSizerItem( window, option, flag, border, userData ) );
-    window->SetContainingSizer(this);
+    m_children.Append( new wxSizerItem( window, proportion, flag, border, userData ) );
+    window->SetContainingSizer( this );
 }
 
-void wxSizer::Add( wxSizer *sizer, int option, int flag, int border, wxObject* userData )
+void wxSizer::Add( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData )
 {
-    m_children.Append( new wxSizerItem( sizer, option, flag, border, userData ) );
+    m_children.Append( new wxSizerItem( sizer, proportion, flag, border, userData ) );
 }
 
-void wxSizer::Add( int width, int height, int option, int flag, int border, wxObject* userData )
+void wxSizer::Add( int width, int height, int proportion, int flag, int border, wxObject* userData )
 {
-    m_children.Append( new wxSizerItem( width, height, option, flag, border, userData ) );
+    m_children.Append( new wxSizerItem( width, height, proportion, flag, border, userData ) );
 }
 
-void wxSizer::Prepend( wxWindow *window, int option, int flag, int border, wxObject* userData )
+void wxSizer::Add( wxSizerItem *item )
 {
-    m_children.Insert( new wxSizerItem( window, option, flag, border, userData ) );
-    window->SetContainingSizer(this);
+    m_children.Append( item );
+
+    if( item->GetWindow() )
+        item->GetWindow()->SetContainingSizer( this );
 }
 
-void wxSizer::Prepend( wxSizer *sizer, int option, int flag, int border, wxObject* userData )
+void wxSizer::Prepend( wxWindow *window, int proportion, int flag, int border, wxObject* userData )
 {
-    m_children.Insert( new wxSizerItem( sizer, option, flag, border, userData ) );
+    m_children.Insert( new wxSizerItem( window, proportion, flag, border, userData ) );
+    window->SetContainingSizer( this );
 }
 
-void wxSizer::Prepend( int width, int height, int option, int flag, int border, wxObject* userData )
+void wxSizer::Prepend( wxSizer *sizer, int proportion, int flag, int border, wxObject* userData )
 {
-    m_children.Insert( new wxSizerItem( width, height, option, flag, border, userData ) );
+    m_children.Insert( new wxSizerItem( sizer, proportion, flag, border, userData ) );
 }
 
-void wxSizer::Insert( int before, wxWindow *window, int option, int flag, int border, wxObject* userData )
+void wxSizer::Prepend( int width, int height, int proportion, int flag, int border, wxObject* userData )
 {
-    m_children.Insert( before, new wxSizerItem( window, option, flag, border, userData ) );
-    window->SetContainingSizer(this);
+    m_children.Insert( new wxSizerItem( width, height, proportion, flag, border, userData ) );
 }
 
-void wxSizer::Insert( int before, wxSizer *sizer, int option, int flag, int border, wxObject* userData )
+void wxSizer::Prepend( wxSizerItem *item )
 {
-    m_children.Insert( before, new wxSizerItem( sizer, option, flag, border, userData ) );
+    m_children.Insert( item );
+
+    if( item->GetWindow() )
+        item->GetWindow()->SetContainingSizer( this );
 }
 
-void wxSizer::Insert( int before, int width, int height, int option, int flag, int border, wxObject* userData )
+void wxSizer::Insert( size_t index,
+                      wxWindow *window,
+                      int proportion,
+                      int flag,
+                      int border,
+                      wxObject* userData )
 {
-    m_children.Insert( before, new wxSizerItem( width, height, option, flag, border, userData ) );
+    m_children.Insert( index,
+                       new wxSizerItem( window, proportion, flag, border, userData ) );
+    window->SetContainingSizer( this );
 }
 
-bool wxSizer::Remove( wxWindow *window )
+void wxSizer::Insert( size_t index,
+                      wxSizer *sizer,
+                      int proportion,
+                      int flag,
+                      int border,
+                      wxObject* userData )
 {
-    wxASSERT( window );
+    m_children.Insert( index,
+                       new wxSizerItem( sizer, proportion, flag, border, userData ) );
+}
 
-    wxNode *node = m_children.First();
-    while (node)
-    {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
-        if (item->GetWindow() == window)
-        {
-            item->GetWindow()->SetContainingSizer(NULL);
-            m_children.DeleteNode( node );
-            return TRUE;
-        }
-        node = node->Next();
-    }
+void wxSizer::Insert( size_t index,
+                      int width,
+                      int height,
+                      int proportion,
+                      int flag,
+                      int border,
+                      wxObject* userData )
+{
+    m_children.Insert( index,
+                       new wxSizerItem( width, height, proportion, flag, border, userData ) );
+}
+
+void wxSizer::Insert( size_t index, wxSizerItem *item )
+{
+    m_children.Insert( index, item );
 
-    return FALSE;
+    if( item->GetWindow() )
+        item->GetWindow()->SetContainingSizer( this );
+}
+
+bool wxSizer::Remove( wxWindow *window )
+{
+    return Detach( window );
 }
 
 bool wxSizer::Remove( wxSizer *sizer )
 {
-    wxASSERT( sizer );
+    wxASSERT_MSG( sizer, _T("Removing NULL sizer") );
 
-    wxNode *node = m_children.First();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
+        wxSizerItem     *item = node->GetData();
+
         if (item->GetSizer() == sizer)
-        {
-            m_children.DeleteNode( node );
-            return TRUE;
-        }
-        node = node->Next();
+            return m_children.DeleteNode( node );
+
+        node = node->GetNext();
     }
 
-    return FALSE;
+    return false;
 }
 
-bool wxSizer::Remove( int pos )
+bool wxSizer::Remove( size_t index )
 {
-    if ((size_t)pos >= m_children.GetCount())
-        return FALSE;
-    wxNode *node = m_children.Nth( pos );
-    if (!node) return FALSE;
+    wxCHECK_MSG( index < m_children.GetCount(),
+                 false,
+                 _T("Remove index is out of range") );
 
-    m_children.DeleteNode( node );
+    wxSizerItemList::Node   *node = m_children.Item( index );
 
-    return TRUE;
+    wxCHECK_MSG( node, false, _T("Failed to find child node") );
+
+    return m_children.DeleteNode( node );
 }
 
 bool wxSizer::Detach( wxSizer *sizer )
 {
-    wxASSERT( sizer );
+    wxASSERT_MSG( sizer, _T("Detaching NULL sizer") );
 
-    wxNode *node = m_children.First();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
+        wxSizerItem     *item = node->GetData();
+
         if (item->GetSizer() == sizer)
         {
             item->DetachSizer();
-            m_children.DeleteNode( node );
-            return TRUE;
+            return m_children.DeleteNode( node );
+        }
+        node = node->GetNext();
+    }
+
+    return false;
+}
+
+bool wxSizer::Detach( wxWindow *window )
+{
+    wxASSERT_MSG( window, _T("Detaching NULL window") );
+
+    wxSizerItemList::Node   *node = m_children.GetFirst();
+    while (node)
+    {
+        wxSizerItem     *item = node->GetData();
+
+        if (item->GetWindow() == window)
+        {
+            item->GetWindow()->SetContainingSizer( NULL );
+            return m_children.DeleteNode( node );
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 
-    return FALSE;
+    return false;
 }
 
-bool wxSizer::Detach( int pos )
+bool wxSizer::Detach( size_t index )
 {
-    if ((size_t)pos >= m_children.GetCount())
-        return FALSE;
-    wxNode *node = m_children.Nth( pos );
-    if (!node) return FALSE;
+    wxCHECK_MSG( index < m_children.GetCount(),
+                 false,
+                 _T("Detach index is out of range") );
+
+    wxSizerItemList::Node   *node = m_children.Item( index );
 
-    ( (wxSizerItem*)node->Data() )->DetachSizer();
-    m_children.DeleteNode( node );
+    wxCHECK_MSG( node, false, _T("Failed to find child node") );
 
-    return TRUE;
+    node->GetData()->DetachSizer();
+
+    return m_children.DeleteNode( node );
 }
 
 void wxSizer::Clear( bool delete_windows )
 {
     // First clear the ContainingSizer pointers
-    wxNode *node = m_children.First();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
+        wxSizerItem     *item = node->GetData();
+
         if (item->IsWindow())
-            item->GetWindow()->SetContainingSizer(NULL);
-        node = node->Next();
+            item->GetWindow()->SetContainingSizer( NULL );
+        node = node->GetNext();
     }
 
     // Destroy the windows if needed
 
 void wxSizer::DeleteWindows()
 {
-    wxNode *node = m_children.First();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
+        wxSizerItem     *item = node->GetData();
+
         item->DeleteWindows();
-        node = node->Next();
+        node = node->GetNext();
     }
 }
 
 
 wxSize wxSizer::GetMinWindowSize( wxWindow *window )
 {
-    wxSize minSize( GetMinSize() );
-    wxSize size( window->GetSize() );
-    wxSize client_size( window->GetClientSize() );
+    wxSize      minSize( GetMinSize() );
+    wxSize      size( window->GetSize() );
+    wxSize      client_size( window->GetClientSize() );
+
     return wxSize( minSize.x+size.x-client_size.x,
                    minSize.y+size.y-client_size.y );
 }
 
 bool wxSizer::DoSetItemMinSize( wxWindow *window, int width, int height )
 {
-    wxASSERT( window );
+    wxASSERT_MSG( window, _T("SetMinSize for NULL window") );
+
+    // Is it our immediate child?
 
-    wxNode *node = m_children.First();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
+        wxSizerItem     *item = node->GetData();
+
         if (item->GetWindow() == window)
         {
             item->SetInitSize( width, height );
-            return TRUE;
+            return true;
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 
-    node = m_children.First();
+    // No?  Search any subsizers we own then
+
+    node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
-        if (item->GetSizer())
+        wxSizerItem     *item = node->GetData();
+
+        if ( item->GetSizer() &&
+             item->GetSizer()->DoSetItemMinSize( window, width, height ) )
         {
-            // It's a sizer, so lets search recursively.
-            if (item->GetSizer()->DoSetItemMinSize( window, width, height ))
-            {
-                // A child sizer found the requested windw, exit.
-                return TRUE;
-            }
+            // A child sizer found the requested windw, exit.
+            return true;
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 
-    return FALSE;
+    return false;
 }
 
 bool wxSizer::DoSetItemMinSize( wxSizer *sizer, int width, int height )
 {
-    wxASSERT( sizer );
+    wxASSERT_MSG( sizer, _T("SetMinSize for NULL sizer") );
 
-    wxNode *node = m_children.First();
+    // Is it our immediate child?
+
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
+        wxSizerItem     *item = node->GetData();
+
         if (item->GetSizer() == sizer)
         {
             item->GetSizer()->DoSetMinSize( width, height );
-            return TRUE;
+            return true;
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 
-    node = m_children.First();
+    // No?  Search any subsizers we own then
+
+    node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
-        if (item->GetSizer())
+        wxSizerItem     *item = node->GetData();
+
+        if ( item->GetSizer() &&
+             item->GetSizer()->DoSetItemMinSize( sizer, width, height ) )
         {
-            // It's a sizer, so lets search recursively.
-            if (item->GetSizer()->DoSetItemMinSize( sizer, width, height ))
-            {
-                // A child sizer found the requested windw, exit.
-                return TRUE;
-            }
+            // A child found the requested sizer, exit.
+            return true;
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 
-    return FALSE;
+    return false;
 }
 
-bool wxSizer::DoSetItemMinSize( int pos, int width, int height )
+bool wxSizer::DoSetItemMinSize( size_t index, int width, int height )
 {
-    wxNode *node = m_children.Nth( pos );
-    if (!node) return FALSE;
+    wxSizerItemList::Node   *node = m_children.Item( index );
+
+    wxCHECK_MSG( node, false, _T("Failed to find child node") );
+
+    wxSizerItem     *item = node->GetData();
 
-    wxSizerItem *item = (wxSizerItem*) node->Data();
     if (item->GetSizer())
     {
         // Sizers contains the minimal size in them, if not calculated ...
         item->SetInitSize( width, height );
     }
 
-    return TRUE;
+    return true;
 }
 
-void wxSizer::Show(wxWindow *window, bool show)
+void wxSizer::Show( wxWindow *window, bool show )
 {
-    wxNode *node = m_children.GetFirst();
+    wxASSERT_MSG( window, _T("Show for NULL window") );
+
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*) node->Data();
+        wxSizerItem     *item = node->GetData();
 
-        if (item->IsWindow() && item->GetWindow() == window)
+        if (item->GetWindow() == window)
         {
-            item->Show(show);
-            window->Show(show);
-            return;
+            item->Show( show );
+            break;
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 }
 
-void wxSizer::Show(wxSizer *sizer, bool show)
+void wxSizer::Show( wxSizer *sizer, bool show )
 {
-    wxNode *node = m_children.GetFirst();
+    wxASSERT_MSG( sizer, _T("Show for NULL sizer") );
+
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*) node->Data();
+        wxSizerItem     *item = node->GetData();
 
-        if (item->IsSizer() && item->GetSizer() == sizer)
+        if (item->GetSizer() == sizer)
         {
-            item->Show(show);
-            sizer->ShowItems(show);
-            return;
+            item->Show( show );
+            break;
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 }
 
-void wxSizer::ShowItems (bool show)
+void wxSizer::Show( size_t index, bool show )
 {
-    wxNode *node = m_children.GetFirst();
-    while (node)
-    {
-        wxSizerItem *item = (wxSizerItem*) node->Data();
+    wxCHECK_RET( index < m_children.GetCount(),
+                 _T("Show index is out of range") );
 
-        if (item->IsWindow())
-            item->GetWindow()->Show (show);
-        else if (item->IsSizer())
-            item->GetSizer()->ShowItems (show);
+    m_children.Item( index )->GetData()->Show( show );
+}
 
-        node = node->Next();
+void wxSizer::ShowItems( bool show )
+{
+    wxSizerItemList::Node   *node = m_children.GetFirst();
+    while (node)
+    {
+        node->GetData()->Show( show );
+        node = node->GetNext();
     }
 }
 
-bool wxSizer::IsShown (wxWindow *window)
+bool wxSizer::IsShown( wxWindow *window )
 {
-    wxNode *node = m_children.GetFirst();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*) node->Data();
+        wxSizerItem     *item = node->GetData();
         
-        if (item->IsWindow() && item->GetWindow() == window)
+        if (item->GetWindow() == window)
         {
             return item->IsShown();
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 
-    return FALSE;
+    wxFAIL_MSG( _T("IsShown failed to find sizer item") );
+
+    return false;
 }
 
-bool wxSizer::IsShown (wxSizer *sizer)
+bool wxSizer::IsShown( wxSizer *sizer )
 {
-    wxNode *node = m_children.GetFirst();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*) node->Data();
+        wxSizerItem     *item = node->GetData();
 
-        if (item->IsSizer() && item->GetSizer() == sizer)
+        if (item->GetSizer() == sizer)
         {
             return item->IsShown();
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 
-    return FALSE;
+    wxFAIL_MSG( _T("IsShown failed to find sizer item") );
+
+    return false;
 }
 
+bool wxSizer::IsShown( size_t index )
+{
+    wxCHECK_MSG( index < m_children.GetCount(),
+                 false,
+                 _T("IsShown index is out of range") );
+
+    return m_children.Item( index )->GetData()->IsShown();
+}
+
+
 //---------------------------------------------------------------------------
 // wxGridSizer
 //---------------------------------------------------------------------------
 
 wxGridSizer::wxGridSizer( int rows, int cols, int vgap, int hgap )
+    : m_rows( rows )
+    , m_cols( cols )
+    , m_vgap( vgap )
+    , m_hgap( hgap )
 {
-    m_rows = rows;
-    m_cols = cols;
-    m_vgap = vgap;
-    m_hgap = hgap;
 }
 
 wxGridSizer::wxGridSizer( int cols, int vgap, int hgap )
+    : m_rows( 0 )
+    , m_cols( cols )
+    , m_vgap( vgap )
+    , m_hgap( hgap )
 {
-    m_rows = 0;
-    m_cols = cols;
-    m_vgap = vgap;
-    m_hgap = hgap;
 }
 
 int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const
             int i = r * ncols + c;
             if (i < nitems)
             {
-                wxNode *node = m_children.Nth( i );
-                wxASSERT( node );
+                wxSizerItemList::Node   *node = m_children.Item( i );
+
+                wxASSERT_MSG( node, _T("Failed to find SizerItemList node") );
 
-                SetItemBounds( (wxSizerItem*) node->Data(), x, y, w, h);
+                SetItemBounds( node->GetData(), x, y, w, h);
             }
             y = y + h + m_vgap;
         }
     int w = 0;
     int h = 0;
 
-    wxNode *node = m_children.First();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
-        wxSize sz( item->CalcMin() );
+        wxSizerItem     *item = node->GetData();
+        wxSize           sz( item->CalcMin() );
+
         w = wxMax( w, sz.x );
         h = wxMax( h, sz.y );
 
-        node = node->Next();
+        node = node->GetNext();
     }
 
-    return wxSize(ncols * w + (ncols-1) * m_hgap,
-                  nrows * h + (nrows-1) * m_vgap);
+    return wxSize( ncols * w + (ncols-1) * m_hgap,
+                   nrows * h + (nrows-1) * m_vgap );
 }
 
 void wxGridSizer::SetItemBounds( wxSizerItem *item, int x, int y, int w, int h )
 
 wxFlexGridSizer::wxFlexGridSizer( int rows, int cols, int vgap, int hgap )
    : wxGridSizer( rows, cols, vgap, hgap )
+   , m_rowHeights( NULL )
+   , m_colWidths( NULL )
 {
-    m_rowHeights = (int*) NULL;
-    m_colWidths = (int*) NULL;
 }
 
 wxFlexGridSizer::wxFlexGridSizer( int cols, int vgap, int hgap )
    : wxGridSizer( cols, vgap, hgap )
+   , m_rowHeights( NULL )
+   , m_colWidths( NULL )
 {
-    m_rowHeights = (int*) NULL;
-    m_colWidths = (int*) NULL;
 }
 
 wxFlexGridSizer::~wxFlexGridSizer()
             int i = r * ncols + c;
             if (i < nitems)
             {
-                wxNode *node = m_children.Nth( i );
-                wxASSERT( node );
+                wxSizerItemList::Node   *node = m_children.Item( i );
+
+                wxASSERT_MSG( node, _T("Failed to find node") );
 
                 int w = wxMax( 0, wxMin( m_colWidths[c], sz.x - x ) );
                 int h = wxMax( 0, wxMin( m_rowHeights[r], sz.y - y ) );
 
-                SetItemBounds( (wxSizerItem*) node->Data(), x, y, w, h);
+                SetItemBounds( node->GetData(), x, y, w, h);
             }
             y = y + m_rowHeights[r] + m_vgap;
         }
 
     CreateArrays();
 
-    int i = 0;
-    wxNode *node = m_children.First();
+    int                      i = 0;
+    wxSizerItemList::Node   *node = m_children.GetFirst();
+
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*)node->Data();
-        wxSize sz( item->CalcMin() );
-        int row = i / ncols;
-        int col = i % ncols;
+        wxSizerItem    *item = node->GetData();
+        wxSize          sz( item->CalcMin() );
+        int             row = i / ncols;
+        int             col = i % ncols;
+
         m_rowHeights[ row ] = wxMax( sz.y, m_rowHeights[ row ] );
         m_colWidths[ col ] = wxMax( sz.x, m_colWidths[ col ] );
 
-        node = node->Next();
+        node = node->GetNext();
         i++;
     }
 
 //---------------------------------------------------------------------------
 
 wxBoxSizer::wxBoxSizer( int orient )
+    : m_orient( orient )
 {
-    m_orient = orient;
 }
 
 void wxBoxSizer::RecalcSizes()
 
     wxPoint pt( m_position );
 
-    wxNode *node = m_children.GetFirst();
+    wxSizerItemList::Node   *node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*) node->Data();
+        wxSizerItem     *item = node->GetData();
+
         if (item->IsShown())
         {
             int weight = 1;
-            if (item->GetOption())
-                weight = item->GetOption();
+            if (item->GetProportion())
+                weight = item->GetProportion();
 
             wxSize size( item->CalcMin() );
 
             if (m_orient == wxVERTICAL)
             {
                 wxCoord height = size.y;
-                if (item->GetOption())
+                if (item->GetProportion())
                 {
                     height = (delta * weight) + extra;
                     extra = 0; // only the first item will get the remainder as extra size
             else
             {
                 wxCoord width = size.x;
-                if (item->GetOption())
+                if (item->GetProportion())
                 {
                     width = (delta * weight) + extra;
                     extra = 0; // only the first item will get the remainder as extra size
             }
         }
 
-        node = node->Next();
+        node = node->GetNext();
     }
 }
 
     m_fixedHeight = 0;
 
     // Find how long each stretch unit needs to be
-    int stretchSize = 1;
-    wxNode *node = m_children.GetFirst();
+    int                      stretchSize = 1;
+    wxSizerItemList::Node   *node = m_children.GetFirst();
+
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*) node->Data();
-        if (item->IsShown() && item->GetOption() != 0)
+        wxSizerItem     *item = node->GetData();
+
+        if (item->IsShown() && item->GetProportion() != 0)
         {
-            int stretch = item->GetOption();
+            int stretch = item->GetProportion();
             wxSize size( item->CalcMin() );
             int sizePerStretch;
             // Integer division rounded up is (a + b - 1) / b
             if (sizePerStretch > stretchSize)
                 stretchSize = sizePerStretch;
         }
-        node = node->Next();
+        node = node->GetNext();
     }
+
     // Calculate overall minimum size
     node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem *item = (wxSizerItem*) node->Data();
+        wxSizerItem     *item = node->GetData();
+
         if (item->IsShown())
         {
-            m_stretchable += item->GetOption();
+            m_stretchable += item->GetProportion();
 
             wxSize size( item->CalcMin() );
-            if (item->GetOption() != 0)
+            if (item->GetProportion() != 0)
             {
                 if (m_orient == wxHORIZONTAL)
-                    size.x = stretchSize * item->GetOption();
+                    size.x = stretchSize * item->GetProportion();
                 else
-                    size.y = stretchSize * item->GetOption();
+                    size.y = stretchSize * item->GetProportion();
             }
 
             if (m_orient == wxHORIZONTAL)
                 m_minWidth = wxMax( m_minWidth, size.x );
             }
 
-            if (item->GetOption() == 0)
+            if (item->GetProportion() == 0)
             {
                 if (m_orient == wxVERTICAL)
                 {
                 }
             }
         }
-        node = node->Next();
+        node = node->GetNext();
     }
 
     return wxSize( m_minWidth, m_minHeight );
 #if wxUSE_STATBOX
 
 wxStaticBoxSizer::wxStaticBoxSizer( wxStaticBox *box, int orient )
-                : wxBoxSizer( orient )
+    : wxBoxSizer( orient )
+    , m_staticBox( box )
 {
     wxASSERT_MSG( box, wxT("wxStaticBoxSizer needs a static box") );
-
-    m_staticBox = box;
 }
 
-static void GetStaticBoxBorders(wxStaticBox *box,
-                                int *borderTop, int *borderOther)
+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
 #if wxUSE_NOTEBOOK
 
 wxNotebookSizer::wxNotebookSizer( wxNotebook *nb )
+    : m_notebook( nb )
 {
     wxASSERT_MSG( nb, wxT("wxNotebookSizer needs a notebook") );
-
-    m_notebook = nb;
 }
 
 void wxNotebookSizer::RecalcSizes()