X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f303d69f934a76c56e14713a0748fdd10635e462..25f70bc4a15f46059d2586b8627815978977e711:/src/common/sizer.cpp diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index b250c0c048..02ca47f8f8 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: sizer.cpp +// Name: src/common/sizer.cpp // Purpose: provide new wxSizer class for layout // Author: Robert Roebling and Robin Dunn, contributions by // Dirk Holtwick, Ron Lee @@ -17,18 +17,19 @@ #pragma hdrstop #endif +#include "wx/sizer.h" + #ifndef WX_PRECOMP #include "wx/string.h" #include "wx/intl.h" #include "wx/math.h" + #include "wx/utils.h" + #include "wx/settings.h" + #include "wx/statbox.h" #endif // WX_PRECOMP -#include "wx/sizer.h" -#include "wx/utils.h" -#include "wx/statbox.h" -#include "wx/settings.h" #include "wx/listimpl.cpp" -#include "wx/intl.h" + #if WXWIN_COMPATIBILITY_2_4 #include "wx/notebook.h" #endif @@ -473,6 +474,7 @@ bool wxSizerItem::IsShown() const return false; } +#if WXWIN_COMPATIBILITY_2_6 void wxSizerItem::SetOption( int option ) { SetProportion( option ); @@ -482,6 +484,7 @@ int wxSizerItem::GetOption() const { return GetProportion(); } +#endif // WXWIN_COMPATIBILITY_2_6 //--------------------------------------------------------------------------- @@ -503,10 +506,12 @@ wxSizerItem* wxSizer::Insert( size_t index, wxSizerItem *item ) return item; } +#if WXWIN_COMPATIBILITY_2_6 bool wxSizer::Remove( wxWindow *window ) { return Detach( window ); } +#endif // WXWIN_COMPATIBILITY_2_6 bool wxSizer::Remove( wxSizer *sizer ) { @@ -728,6 +733,15 @@ wxSize wxSizer::GetMinWindowSize( wxWindow *window ) // Return a window size that will fit within the screens dimensions wxSize wxSizer::FitSize( wxWindow *window ) { + if ( window->IsTopLevel() ) + { + wxTopLevelWindow *tlw = wxDynamicCast(window, wxTopLevelWindow); + if ( tlw && tlw->IsAlwaysMaximized() ) + { + return tlw->GetClientSize(); + } + } + wxSize size = GetMinWindowSize( window ); wxSize sizeMax = GetMaxWindowSize( window ); @@ -1139,7 +1153,7 @@ wxSize wxGridSizer::CalcMin() { int nrows, ncols; if ( CalcRowsCols(nrows, ncols) == 0 ) - return wxSize(10, 10); + return wxSize(); // Find the max width and height for any component int w = 0; @@ -1264,7 +1278,7 @@ wxSize wxFlexGridSizer::CalcMin() // Number of rows/columns can change as items are added or removed. if ( !CalcRowsCols(nrows, ncols) ) - return wxSize(10, 10); + return wxSize(); m_rowHeights.SetCount(nrows); m_colWidths.SetCount(ncols); @@ -1467,20 +1481,38 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) m_growableRowsProportions.Add( proportion ); } -void wxFlexGridSizer::RemoveGrowableRow( size_t idx ) -{ - m_growableRows.Remove( idx ); -} - void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) { m_growableCols.Add( idx ); m_growableColsProportions.Add( proportion ); } +// helper function for RemoveGrowableCol/Row() +static void +DoRemoveFromArrays(size_t idx, wxArrayInt& items, wxArrayInt& proportions) +{ + const size_t count = items.size(); + for ( size_t n = 0; n < count; n++ ) + { + if ( (size_t)items[n] == idx ) + { + items.RemoveAt(n); + proportions.RemoveAt(n); + return; + } + } + + wxFAIL_MSG( _T("column/row is already not growable") ); +} + void wxFlexGridSizer::RemoveGrowableCol( size_t idx ) { - m_growableCols.Remove( idx ); + DoRemoveFromArrays(idx, m_growableCols, m_growableColsProportions); +} + +void wxFlexGridSizer::RemoveGrowableRow( size_t idx ) +{ + DoRemoveFromArrays(idx, m_growableRows, m_growableRowsProportions); } //--------------------------------------------------------------------------- @@ -1578,7 +1610,7 @@ void wxBoxSizer::RecalcSizes() wxSize wxBoxSizer::CalcMin() { if (m_children.GetCount() == 0) - return wxSize(10,10); + return wxSize(); m_stretchable = 0; m_minWidth = 0; @@ -1684,16 +1716,27 @@ wxSize wxBoxSizer::CalcMin() #if wxUSE_STATBOX wxStaticBoxSizer::wxStaticBoxSizer( wxStaticBox *box, int orient ) - : wxBoxSizer( orient ) - , m_staticBox( box ) + : wxBoxSizer( orient ), + m_staticBox( box ) { wxASSERT_MSG( box, wxT("wxStaticBoxSizer needs a static box") ); + + // do this so that our Detach() is called if the static box is destroyed + // before we are + m_staticBox->SetContainingSizer(this); } wxStaticBoxSizer::wxStaticBoxSizer(int orient, wxWindow *win, const wxString& s) : wxBoxSizer(orient), m_staticBox(new wxStaticBox(win, wxID_ANY, s)) { + // same as above + m_staticBox->SetContainingSizer(this); +} + +wxStaticBoxSizer::~wxStaticBoxSizer() +{ + delete m_staticBox; } static void GetStaticBoxBorders( wxStaticBox *box, @@ -1743,6 +1786,20 @@ void wxStaticBoxSizer::ShowItems( bool show ) wxBoxSizer::ShowItems( show ); } +bool wxStaticBoxSizer::Detach( wxWindow *window ) +{ + // avoid deleting m_staticBox in our dtor if it's being detached from the + // sizer (which can happen because it's being already destroyed for + // example) + if ( window == m_staticBox ) + { + m_staticBox = NULL; + return true; + } + + return wxSizer::Detach( window ); +} + #endif // wxUSE_STATBOX #if wxUSE_BUTTON @@ -1943,12 +2000,16 @@ IMPLEMENT_CLASS(wxNotebookSizer, wxBookCtrlSizer) #if wxUSE_BOOKCTRL +#if WXWIN_COMPATIBILITY_2_6 + wxBookCtrlSizer::wxBookCtrlSizer(wxBookCtrlBase *bookctrl) : m_bookctrl(bookctrl) { wxASSERT_MSG( bookctrl, wxT("wxBookCtrlSizer needs a control") ); } +#endif // WXWIN_COMPATIBILITY_2_6 + void wxBookCtrlSizer::RecalcSizes() { m_bookctrl->SetSize( m_position.x, m_position.y, m_size.x, m_size.y ); @@ -1994,12 +2055,16 @@ wxSize wxBookCtrlSizer::CalcMin() #if wxUSE_NOTEBOOK +#if WXWIN_COMPATIBILITY_2_6 + wxNotebookSizer::wxNotebookSizer(wxNotebook *nb) { wxASSERT_MSG( nb, wxT("wxNotebookSizer needs a control") ); m_bookctrl = nb; } +#endif // WXWIN_COMPATIBILITY_2_6 + #endif // wxUSE_NOTEBOOOK #endif // wxUSE_BOOKCTRL