]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wincmn.cpp
best size handling fix
[wxWidgets.git] / src / common / wincmn.cpp
index b62896002ce2ec7ee779de97615613db93d68bc2..7c4c0ce62c6c2917c6ef8718c6819f27efe16a7d 100644 (file)
@@ -125,6 +125,9 @@ wxWindowBase::wxWindowBase()
     m_minHeight =
     m_maxHeight = wxDefaultSize.y;
 
+    // invalidiated cache value
+    m_bestSizeCache = wxDefaultSize;
+
     // window are created enabled and visible by default
     m_isShown =
     m_isEnabled = true;
@@ -482,7 +485,7 @@ void wxWindowBase::Fit()
 {
     if ( GetChildren().GetCount() > 0 )
     {
-        SetClientSize(DoGetBestSize());
+        SetClientSize(GetBestSize());
     }
     //else: do nothing if we have no children
 }
@@ -620,32 +623,36 @@ wxSize wxWindowBase::DoGetBestSize() const
     }
 }
 
-void wxWindowBase::SetBestFittingSize(const wxSize& size)
+
+wxSize wxWindowBase::GetBestFittingSize() const
 {
-    // If the given size is incomplete then merge with the best size.
-    wxSize sizeBest;
-    if ( size.x == wxDefaultSize.x || size.y == wxDefaultSize.y )
+    // merge the best size with the min size, giving priority to the min size
+    wxSize min = GetMinSize();
+    if (min.x == wxDefaultCoord || min.y == wxDefaultCoord)
     {
-        sizeBest = DoGetBestSize();
-        if ( size.x != wxDefaultSize.x )
-            sizeBest.x = size.x;
-        if ( size.y != wxDefaultSize.y )
-            sizeBest.y = size.y;
-    }
-    else // have complete explicit size
-    {
-        sizeBest = size;
+        wxSize best = GetBestSize();
+        if (min.x == wxDefaultCoord) min.x =  best.x;
+        if (min.y == wxDefaultCoord) min.y =  best.y;
     }
+    return min;
+}
 
-    // Change the size if needed
-    if (GetSize() != sizeBest)
-        SetSize(sizeBest);
 
-    // don't shrink the control below its best size
-    m_minWidth = sizeBest.x;
-    m_minHeight = sizeBest.y;
+void wxWindowBase::SetBestFittingSize(const wxSize& size)
+{
+    // Set the min size to the size passed in.  This will usually either be
+    // wxDefaultSize or the size passed to this window's ctor/Create function.
+    SetMinSize(size);
+
+    // Merge the size with the best size if needed
+    wxSize best = GetBestFittingSize();
+    
+    // If the current size doesn't match then change it
+    if (GetSize() != best)
+        SetSize(best);
 }
 
+
 // by default the origin is not shifted
 wxPoint wxWindowBase::GetClientAreaOrigin() const
 {