]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sizer.cpp
* Set the window's title
[wxWidgets.git] / src / common / sizer.cpp
index 2950163aee77e5454abe200f479b687fdf39c147..37bc9aaae85a736866c33b5257681673f7931952 100644 (file)
@@ -563,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 );
 
@@ -1087,13 +1084,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] ];
@@ -1104,9 +1101,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
                 {
@@ -1136,13 +1133,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]!!
@@ -1154,9 +1151,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
                 {
@@ -1215,9 +1212,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;
@@ -1274,7 +1271,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;
@@ -1320,19 +1317,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 );
@@ -1344,10 +1334,6 @@ void wxBoxSizer::RecalcSizes()
 
         if (item->IsShown())
         {
-            int weight = 1;
-            if (item->GetProportion())
-                weight = item->GetProportion();
-
             wxSize size( item->CalcMin() );
 
             if (m_orient == wxVERTICAL)
@@ -1355,8 +1341,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 );
@@ -1380,8 +1367,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 );
@@ -1417,26 +1405,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();
     }
@@ -1445,33 +1448,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)
                 {
@@ -1484,6 +1473,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();
     }
@@ -1613,5 +1613,14 @@ wxSize wxBookCtrlSizer::CalcMin()
     return wxSize( maxX, maxY ) + sizeBorder;
 }
 
+
+#if wxUSE_NOTEBOOK
+
+wxNotebookSizer::wxNotebookSizer(wxNotebook *nb)
+    : wxBookCtrlSizer(nb)
+{
+}
+
+#endif // wxUSE_NOTEBOOOK
 #endif // wxUSE_BOOKCTRL