X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/066f1b7a9580fc6c487efa753d61e3683de61407..88e3652fd0c13feb4fcd843bd0d1167ab84041c1:/src/common/sizer.cpp?ds=sidebyside diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index 87b68bee76..3ba28288ec 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -10,7 +10,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "sizer.h" #endif @@ -37,9 +37,12 @@ IMPLEMENT_CLASS(wxBoxSizer, wxSizer) #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 ); @@ -560,11 +563,8 @@ void wxSizer::DeleteWindows() 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 ); @@ -914,6 +914,8 @@ wxGridSizer::wxGridSizer( int rows, int cols, int vgap, int hgap ) , m_vgap( vgap ) , m_hgap( hgap ) { + if (m_rows == 0 && m_cols == 0) + m_rows = 1; } wxGridSizer::wxGridSizer( int cols, int vgap, int hgap ) @@ -922,6 +924,8 @@ wxGridSizer::wxGridSizer( int cols, int vgap, int hgap ) , m_vgap( vgap ) , m_hgap( hgap ) { + if (m_rows == 0 && m_cols == 0) + m_rows = 1; } int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const @@ -985,8 +989,8 @@ void wxGridSizer::RecalcSizes() 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 @@ -1084,13 +1088,13 @@ void wxFlexGridSizer::RecalcSizes() 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] ]; @@ -1101,9 +1105,9 @@ void wxFlexGridSizer::RecalcSizes() { 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 { @@ -1133,13 +1137,13 @@ void wxFlexGridSizer::RecalcSizes() 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]!! @@ -1151,9 +1155,9 @@ void wxFlexGridSizer::RecalcSizes() { 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 { @@ -1212,9 +1216,9 @@ wxSize wxFlexGridSizer::CalcMin() 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; @@ -1271,7 +1275,7 @@ wxSize wxFlexGridSizer::CalcMin() // -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; @@ -1288,8 +1292,9 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion ) m_growableRowsProportions.Add( proportion ); } -void wxFlexGridSizer::RemoveGrowableRow( size_t WXUNUSED(idx) ) +void wxFlexGridSizer::RemoveGrowableRow( size_t idx ) { + m_growableRows.Remove( idx ); } void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) @@ -1298,8 +1303,9 @@ void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion ) m_growableColsProportions.Add( proportion ); } -void wxFlexGridSizer::RemoveGrowableCol( size_t WXUNUSED(idx) ) +void wxFlexGridSizer::RemoveGrowableCol( size_t idx ) { + m_growableCols.Remove( idx ); } //--------------------------------------------------------------------------- @@ -1317,19 +1323,12 @@ void wxBoxSizer::RecalcSizes() 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 ); @@ -1341,10 +1340,6 @@ void wxBoxSizer::RecalcSizes() if (item->IsShown()) { - int weight = 1; - if (item->GetProportion()) - weight = item->GetProportion(); - wxSize size( item->CalcMin() ); if (m_orient == wxVERTICAL) @@ -1352,8 +1347,9 @@ void wxBoxSizer::RecalcSizes() 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 ); @@ -1377,8 +1373,9 @@ void wxBoxSizer::RecalcSizes() 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 ); @@ -1414,26 +1411,41 @@ wxSize wxBoxSizer::CalcMin() m_fixedWidth = 0; m_fixedHeight = 0; - // Find how long each stretch unit needs to be - int stretchSize = 1; 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(); } @@ -1442,33 +1454,19 @@ wxSize wxBoxSizer::CalcMin() 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) { @@ -1481,6 +1479,17 @@ wxSize wxBoxSizer::CalcMin() 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(); } @@ -1555,31 +1564,31 @@ wxSize wxStaticBoxSizer::CalcMin() #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); } @@ -1587,7 +1596,8 @@ wxSize wxNotebookSizer::CalcMin() int maxX = 0; int maxY = 0; - wxWindowList::compatibility_iterator node = m_notebook->GetChildren().GetFirst(); + wxWindowList::compatibility_iterator + node = m_bookctrl->GetChildren().GetFirst(); while (node) { wxWindow *item = node->GetData(); @@ -1609,6 +1619,14 @@ wxSize wxNotebookSizer::CalcMin() 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 +