]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sizer.cpp
Fixed update rectangle passed to WinInvalidateRect in wxWindowOS2::Refresh().
[wxWidgets.git] / src / common / sizer.cpp
index e121731de814863e0a75c781f9a4f726776b268f..3ba28288ecc151ca0095556171a81f5e535b1c28 100644 (file)
@@ -563,11 +563,8 @@ void wxSizer::DeleteWindows()
 
 wxSize wxSizer::Fit( wxWindow *window )
 {
 
 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 );
 
 
     window->SetSize( size );
 
@@ -917,6 +914,8 @@ wxGridSizer::wxGridSizer( int rows, int cols, int vgap, int hgap )
     , m_vgap( vgap )
     , m_hgap( 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 )
 }
 
 wxGridSizer::wxGridSizer( int cols, int vgap, int hgap )
@@ -925,6 +924,8 @@ wxGridSizer::wxGridSizer( int cols, int vgap, int hgap )
     , m_vgap( vgap )
     , m_hgap( 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
 }
 
 int wxGridSizer::CalcRowsCols(int& nrows, int& ncols) const
@@ -1291,8 +1292,9 @@ void wxFlexGridSizer::AddGrowableRow( size_t idx, int proportion )
     m_growableRowsProportions.Add( 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 )
 }
 
 void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
@@ -1301,8 +1303,9 @@ void wxFlexGridSizer::AddGrowableCol( size_t idx, int proportion )
     m_growableColsProportions.Add( proportion );
 }
 
     m_growableColsProportions.Add( proportion );
 }
 
-void wxFlexGridSizer::RemoveGrowableCol( size_t WXUNUSED(idx) )
+void wxFlexGridSizer::RemoveGrowableCol( size_t idx )
 {
 {
+    m_growableCols.Remove( idx );
 }
 
 //---------------------------------------------------------------------------
 }
 
 //---------------------------------------------------------------------------
@@ -1320,19 +1323,12 @@ void wxBoxSizer::RecalcSizes()
         return;
 
     int delta = 0;
         return;
 
     int delta = 0;
-    int extra = 0;
     if (m_stretchable)
     {
         if (m_orient == wxHORIZONTAL)
     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
         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 );
     }
 
     wxPoint pt( m_position );
@@ -1344,10 +1340,6 @@ void wxBoxSizer::RecalcSizes()
 
         if (item->IsShown())
         {
 
         if (item->IsShown())
         {
-            int weight = 1;
-            if (item->GetProportion())
-                weight = item->GetProportion();
-
             wxSize size( item->CalcMin() );
 
             if (m_orient == wxVERTICAL)
             wxSize size( item->CalcMin() );
 
             if (m_orient == wxVERTICAL)
@@ -1355,8 +1347,9 @@ void wxBoxSizer::RecalcSizes()
                 wxCoord height = size.y;
                 if (item->GetProportion())
                 {
                 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 );
                 }
 
                 wxPoint child_pos( pt );
@@ -1380,8 +1373,9 @@ void wxBoxSizer::RecalcSizes()
                 wxCoord width = size.x;
                 if (item->GetProportion())
                 {
                 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 );
                 }
 
                 wxPoint child_pos( pt );
@@ -1417,26 +1411,41 @@ wxSize wxBoxSizer::CalcMin()
     m_fixedWidth = 0;
     m_fixedHeight = 0;
 
     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();
     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)
     {
     while (node)
     {
-        wxSizerItem     *item = node->GetData();
+        wxSizerItem *item = node->GetData();
 
         if (item->IsShown() && item->GetProportion() != 0)
         {
             int stretch = item->GetProportion();
             wxSize size( item->CalcMin() );
 
         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
             // 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)
             if (m_orient == wxHORIZONTAL)
-                sizePerStretch = ( size.x + stretch - 1 ) / stretch;
+                minSize = ( size.x*m_stretchable + stretch - 1)/stretch;
             else
             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();
     }
         }
         node = node->GetNext();
     }
@@ -1445,33 +1454,19 @@ wxSize wxBoxSizer::CalcMin()
     node = m_children.GetFirst();
     while (node)
     {
     node = m_children.GetFirst();
     while (node)
     {
-        wxSizerItem     *item = node->GetData();
+        wxSizerItem *item = node->GetData();
 
         if (item->IsShown())
         {
 
         if (item->IsShown())
         {
-            m_stretchable += item->GetProportion();
-
             wxSize size( item->CalcMin() );
             if (item->GetProportion() != 0)
             {
                 if (m_orient == wxHORIZONTAL)
             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
                 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
             }
             else
-            {
-                m_minHeight += size.y;
-                m_minWidth = wxMax( m_minWidth, size.x );
-            }
-
-            if (item->GetProportion() == 0)
             {
                 if (m_orient == wxVERTICAL)
                 {
             {
                 if (m_orient == wxVERTICAL)
                 {
@@ -1484,6 +1479,17 @@ wxSize wxBoxSizer::CalcMin()
                     m_fixedHeight = wxMax( m_fixedHeight, size.y );
                 }
             }
                     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();
     }
         }
         node = node->GetNext();
     }