]> git.saurik.com Git - wxWidgets.git/commitdiff
Keep track of the initial size that the window was created with, and
authorRobin Dunn <robin@alldunn.com>
Wed, 14 Apr 2004 22:40:14 +0000 (22:40 +0000)
committerRobin Dunn <robin@alldunn.com>
Wed, 14 Apr 2004 22:40:14 +0000 (22:40 +0000)
when the window is added to a sizer use that size with SetSizeHints.
This is to fix problems resulting from the previous change where
SetSizeHints was called with the initial size from CreateBase.

Also, Patch [ 934677 ] wxWindowBase::DoGetBestSize() should exclude hidden windows

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26777 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/window.h
src/common/wincmn.cpp

index b754c4ac8eebcd929ed236e73ed540d12e32c269..bdf6b7cab6aebb556254712ca0c9e731c8f120bf 100644 (file)
@@ -931,17 +931,7 @@ public:
     wxSizer *GetSizer() const { return m_windowSizer; }
 
     // Track if this window is a member of a sizer
-    void SetContainingSizer(wxSizer* sizer)
-    {
-        // adding a window to a sizer twice is going to result in fatal and
-        // hard to debug problems later because when deleting the second
-        // associated wxSizerItem we're going to dereference a dangling
-        // pointer; so try to detect this as early as possible
-        wxASSERT_MSG( !sizer || m_containingSizer != sizer,
-                        _T("Adding a window to the same sizer twice?") );
-
-        m_containingSizer = sizer;
-    }
+    void SetContainingSizer(wxSizer* sizer);
     wxSizer *GetContainingSizer() const { return m_containingSizer; }
 
     // accessibility
@@ -1121,6 +1111,9 @@ protected:
     wxAccessible*       m_accessible;
 #endif
 
+    // Initial window size, used as minimal size in Sizers
+    wxSize              m_initialSize;
+    
     // Virtual size (scrolling)
     wxSize                m_virtualSize;
 
index d15660c398092ea3d70b1bc225507212689771e6..0c419c047695c51db57f18ee1f348dea6ee4439f 100644 (file)
@@ -115,6 +115,8 @@ wxWindowBase::wxWindowBase()
     m_parent = (wxWindow *)NULL;
     m_windowId = wxID_ANY;
 
+    m_initialSize = wxDefaultSize;
+    
     // no constraints on the minimal window size
     m_minWidth =
     m_minHeight =
@@ -222,13 +224,9 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent,
     SetWindowStyleFlag(style);
     SetParent(parent);
 
-    // Set the minsize to be the size passed to the ctor (if any) for
-    // non-TLWs.  This is so items used in a sizer will use this explicitly
-    // set size for layout, instead of falling back the (probably smaller)
-    // bestsize.
-    if (! IsTopLevel())
-        SetSizeHints(size);
-
+    // Save the size passed to the ctor (if any.)  This will be used later as
+    // the minimal size if the window is added to a sizer.
+    m_initialSize = size;
     
 #if wxUSE_VALIDATORS
     SetValidator(validator);
@@ -546,7 +544,7 @@ wxSize wxWindowBase::DoGetBestSize() const
 #endif // wxUSE_CONSTRAINTS
     else if ( !GetChildren().empty() )
     {
-        // our minimal acceptable size is such that all our windows fit inside
+        // our minimal acceptable size is such that all our visible child windows fit inside
         int maxX = 0,
             maxY = 0;
 
@@ -555,7 +553,7 @@ wxSize wxWindowBase::DoGetBestSize() const
               node = node->GetNext() )
         {
             wxWindow *win = node->GetData();
-            if ( win->IsTopLevel()
+            if ( win->IsTopLevel()  || ( ! win->IsShown() )
 #if wxUSE_STATUSBAR
                     || wxDynamicCast(win, wxStatusBar)
 #endif // wxUSE_STATUSBAR
@@ -1627,6 +1625,26 @@ void wxWindowBase::SetSizerAndFit(wxSizer *sizer, bool deleteOld)
     sizer->SetSizeHints( (wxWindow*) this );
 }
 
+   
+void wxWindowBase::SetContainingSizer(wxSizer* sizer)
+{
+    // adding a window to a sizer twice is going to result in fatal and
+    // hard to debug problems later because when deleting the second
+    // associated wxSizerItem we're going to dereference a dangling
+    // pointer; so try to detect this as early as possible
+    wxASSERT_MSG( !sizer || m_containingSizer != sizer,
+                  _T("Adding a window to the same sizer twice?") );
+    
+    m_containingSizer = sizer;
+
+    // If there was an initial size for this window, and if a minsize has not
+    // been set, then set the initial size as the minsize.  This helps with
+    // sizer layout when a larger than GetBestSize size is needed for
+    // controls.
+    if (m_initialSize != wxDefaultSize && GetMinSize() == wxDefaultSize)
+        SetSizeHints(m_initialSize);
+}
+   
 #if wxUSE_CONSTRAINTS
 
 void wxWindowBase::SatisfyConstraints()