X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ef397583dfdf7ba59ecb0a72659c455f04523c97..0fccf28fe6cfd00c63eac76d5aa27b8ce1330467:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 3915938467..f3a5d5a04f 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -27,14 +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(wxStaticBoxSizer, wxBoxSizer); +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) +#endif #if wxUSE_NOTEBOOK -IMPLEMENT_ABSTRACT_CLASS(wxNotebookSizer, wxSizer); +IMPLEMENT_ABSTRACT_CLASS(wxNotebookSizer, wxSizer) #endif //--------------------------------------------------------------------------- @@ -230,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); @@ -258,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 ) @@ -278,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 ) @@ -293,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 ) @@ -315,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; } @@ -353,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; @@ -381,14 +428,18 @@ wxSize wxSizer::GetMaxWindowSize( wxWindow *WXUNUSED(window) ) wxRect rect = wxGetClientDisplayRect(); wxSize sizeMax (rect.width,rect.height); - // Make the max size a bit smaller than the visible portion of - // the screen. A window which takes the entire screen doesn't + // 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 sizeMax.x *= 9; sizeMax.x /= 10; sizeMax.y *= 9; sizeMax.y /= 10; +#endif return sizeMax; } @@ -944,14 +995,43 @@ wxSize wxBoxSizer::CalcMin() m_fixedWidth = 0; m_fixedHeight = 0; + // Find how long each stretch unit needs to be + int stretchSize = 1; wxNode *node = m_children.GetFirst(); while (node) + { + wxSizerItem *item = (wxSizerItem*) node->Data(); + if (item->GetOption() != 0) + { + int stretch = item->GetOption(); + wxSize size( item->CalcMin() ); + int sizePerStretch; + // Integer division rounded up is (a + b - 1) / b + if (m_orient == wxHORIZONTAL) + sizePerStretch = ( size.x + stretch - 1 ) / stretch; + else + sizePerStretch = ( size.y + stretch - 1 ) / stretch; + if (sizePerStretch > stretchSize) + stretchSize = sizePerStretch; + } + node = node->Next(); + } + // Calculate overall minimum size + node = m_children.GetFirst(); + while (node) { wxSizerItem *item = (wxSizerItem*) node->Data(); m_stretchable += item->GetOption(); wxSize size( item->CalcMin() ); + if (item->GetOption() != 0) + { + if (m_orient == wxHORIZONTAL) + size.x = stretchSize * item->GetOption(); + else + size.y = stretchSize * item->GetOption(); + } if (m_orient == wxHORIZONTAL) { @@ -988,6 +1068,8 @@ wxSize wxBoxSizer::CalcMin() // wxStaticBoxSizer //--------------------------------------------------------------------------- +#if wxUSE_STATBOX + wxStaticBoxSizer::wxStaticBoxSizer( wxStaticBox *box, int orient ) : wxBoxSizer( orient ) { @@ -1043,6 +1125,8 @@ wxSize wxStaticBoxSizer::CalcMin() return ret; } +#endif // wxUSE_STATBOX + //--------------------------------------------------------------------------- // wxNotebookSizer //--------------------------------------------------------------------------- @@ -1063,24 +1147,15 @@ void wxNotebookSizer::RecalcSizes() wxSize wxNotebookSizer::CalcMin() { - // This will have to be done platform by platform - // as there is no way to guess the thickness of - // the wxNotebook tabs and border. + wxSize sizeBorder = m_notebook->CalcSizeFromPage(wxSize(0, 0)); - int borderX = 5; - int borderY = 5; - if ((m_notebook->HasFlag(wxNB_RIGHT)) || - (m_notebook->HasFlag(wxNB_LEFT))) - { - borderX += 90; // improvements later.. - } - else - { - borderY += 40; // improvements later.. - } + sizeBorder.x += 5; + sizeBorder.y += 5; if (m_notebook->GetChildren().GetCount() == 0) - return wxSize(borderX + 10, borderY + 10); + { + return wxSize(sizeBorder.x + 10, sizeBorder.y + 10); + } int maxX = 0; int maxY = 0; @@ -1095,14 +1170,16 @@ wxSize wxNotebookSizer::CalcMin() { wxSize subsize( itemsizer->CalcMin() ); - if (subsize.x > maxX) maxX = subsize.x; - if (subsize.y > maxY) maxY = subsize.y; + if (subsize.x > maxX) + maxX = subsize.x; + if (subsize.y > maxY) + maxY = subsize.y; } node = node->GetNext(); } - return wxSize( borderX + maxX, borderY + maxY ); + return wxSize( maxX, maxY ) + sizeBorder; } #endif // wxUSE_NOTEBOOK