X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e6feb95a79834836e88143b15d9f424ebe79621..8f5e92dbe5b8adca2af32da6d43165b1c78dacfd:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 3686b3978a..f3a5d5a04f 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -27,16 +27,16 @@ //--------------------------------------------------------------------------- -IMPLEMENT_ABSTRACT_CLASS(wxSizerItem, wxObject); -IMPLEMENT_ABSTRACT_CLASS(wxSizer, wxObject); -IMPLEMENT_ABSTRACT_CLASS(wxGridSizer, wxSizer); -IMPLEMENT_ABSTRACT_CLASS(wxFlexGridSizer, wxGridSizer); -IMPLEMENT_ABSTRACT_CLASS(wxBoxSizer, wxSizer); +IMPLEMENT_ABSTRACT_CLASS(wxSizerItem, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxSizer, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxGridSizer, wxSizer) +IMPLEMENT_ABSTRACT_CLASS(wxFlexGridSizer, wxGridSizer) +IMPLEMENT_ABSTRACT_CLASS(wxBoxSizer, wxSizer) #if wxUSE_STATBOX -IMPLEMENT_ABSTRACT_CLASS(wxStaticBoxSizer, wxBoxSizer); +IMPLEMENT_ABSTRACT_CLASS(wxStaticBoxSizer, wxBoxSizer) #endif #if wxUSE_NOTEBOOK -IMPLEMENT_ABSTRACT_CLASS(wxNotebookSizer, wxSizer); +IMPLEMENT_ABSTRACT_CLASS(wxNotebookSizer, wxSizer) #endif //--------------------------------------------------------------------------- @@ -232,6 +232,15 @@ void wxSizerItem::SetDimension( wxPoint pos, wxSize size ) m_size = size; } +void wxSizerItem::DeleteWindows() +{ + if (m_window) + m_window->Destroy(); + + if (m_sizer) + m_sizer->DeleteWindows(); +} + bool wxSizerItem::IsWindow() { return (m_window != NULL); @@ -260,11 +269,13 @@ wxSizer::wxSizer() wxSizer::~wxSizer() { + Clear(); } void wxSizer::Add( wxWindow *window, int option, int flag, int border, wxObject* userData ) { m_children.Append( new wxSizerItem( window, option, flag, border, userData ) ); + window->SetContainingSizer(this); } void wxSizer::Add( wxSizer *sizer, int option, int flag, int border, wxObject* userData ) @@ -280,6 +291,7 @@ void wxSizer::Add( int width, int height, int option, int flag, int border, wxOb void wxSizer::Prepend( wxWindow *window, int option, int flag, int border, wxObject* userData ) { m_children.Insert( new wxSizerItem( window, option, flag, border, userData ) ); + window->SetContainingSizer(this); } void wxSizer::Prepend( wxSizer *sizer, int option, int flag, int border, wxObject* userData ) @@ -295,6 +307,7 @@ void wxSizer::Prepend( int width, int height, int option, int flag, int border, void wxSizer::Insert( int before, wxWindow *window, int option, int flag, int border, wxObject* userData ) { m_children.Insert( before, new wxSizerItem( window, option, flag, border, userData ) ); + window->SetContainingSizer(this); } void wxSizer::Insert( int before, wxSizer *sizer, int option, int flag, int border, wxObject* userData ) @@ -317,6 +330,7 @@ bool wxSizer::Remove( wxWindow *window ) wxSizerItem *item = (wxSizerItem*)node->Data(); if (item->GetWindow() == window) { + item->GetWindow()->SetContainingSizer(NULL); m_children.DeleteNode( node ); return TRUE; } @@ -355,6 +369,37 @@ bool wxSizer::Remove( int pos ) return TRUE; } +void wxSizer::Clear( bool delete_windows ) +{ + // First clear the ContainingSizer pointers + wxNode *node = m_children.First(); + while (node) + { + wxSizerItem *item = (wxSizerItem*)node->Data(); + if (item->IsWindow()) + item->GetWindow()->SetContainingSizer(NULL); + node = node->Next(); + } + + // Destroy the windows if needed + if (delete_windows) + DeleteWindows(); + + // Now empty the list + m_children.Clear(); +} + +void wxSizer::DeleteWindows() +{ + wxNode *node = m_children.First(); + while (node) + { + wxSizerItem *item = (wxSizerItem*)node->Data(); + item->DeleteWindows(); + node = node->Next(); + } +} + void wxSizer::Fit( wxWindow *window ) { wxSize size; @@ -383,6 +428,9 @@ wxSize wxSizer::GetMaxWindowSize( wxWindow *WXUNUSED(window) ) wxRect rect = wxGetClientDisplayRect(); wxSize sizeMax (rect.width,rect.height); + // Sorry, but this bit is wrong -- it makes a window that should just be + // able to fit onto the screen, not fit on the screen. -- JACS +#if 0 // Make the max size a bit smaller than the visible portion of // the screen. A window which takes the entire screen doesn't // look very nice either @@ -391,6 +439,7 @@ wxSize wxSizer::GetMaxWindowSize( wxWindow *WXUNUSED(window) ) sizeMax.y *= 9; sizeMax.y /= 10; +#endif return sizeMax; }