From d13d8d4e5f03c0f54af4589bc285fd3e4af48b3b Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Wed, 14 Feb 2001 14:13:38 +0000
Subject: [PATCH] added wxADJUST_MINSIZE sizer flag

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9369 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt        |  1 +
 docs/latex/wx/sizer.tex | 36 ++++++++++++++++++++++--------------
 src/common/sizer.cpp    | 29 ++++++++++++++++++-----------
 3 files changed, 41 insertions(+), 25 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index 665ee2b71f..5a882d41f9 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -18,6 +18,7 @@ All (GUI):
 
 - new wxToggleButton class (John Norris, Axel Schlueter)
 - wxCalendarCtrl now highlighting the date with time part bug fixed
+- wxADJUST_MINSIZE sizer flag added
 
 wxMSW:
 
diff --git a/docs/latex/wx/sizer.tex b/docs/latex/wx/sizer.tex
index 7c83d6edc9..07173e7725 100644
--- a/docs/latex/wx/sizer.tex
+++ b/docs/latex/wx/sizer.tex
@@ -80,20 +80,28 @@ children of the same wxBoxSizer. For example, you might have a horizontal wxBoxS
 of which are supposed to change their size with the sizer. Then the two stretchable windows would get a
 value of 1 each to make them grow and shrink equally with the sizer's horizontal dimension.}
 
-\docparam{flag}{This parameter can be used to set a number of flags which can be combined using
-the binary OR operator |. Two main behaviours are defined using these flags. One is the border
-around a window: the {\it border} parameter determines the border width whereas the flags given here
-determine where the border may be (wxTOP, wxBOTTOM, wxLEFT, wxRIGHT or wxALL). The other flags
-determine the child window's behaviour if the size of the sizer changes. However this is not - in contrast to
-the {\it option} flag - in the main orientation, but in the respectively other orientation. So
-if you created a wxBoxSizer with the wxVERTICAL option, these flags will be relevant if the
-sizer changes its horizontal size. A child may get resized to completely fill out the new size (using
-either wxGROW or wxEXPAND), it may get proportionally resized (wxSHAPED), it may get centered (wxALIGN\_CENTER
-or wxALIGN\_CENTRE) or it may get aligned to either side (wxALIGN\_LEFT and wxALIGN\_TOP are set to 0
-and thus represent the default, wxALIGN\_RIGHT and wxALIGN\_BOTTOM have their obvious meaning).
-With proportional resize, a child may also be centered in the main orientation using
-wxALIGN\_CENTER\_VERTICAL (same as wxALIGN\_CENTRE\_VERTICAL) and wxALIGN\_CENTER\_HORIZONTAL
-(same as wxALIGN\_CENTRE\_HORIZONTAL) flags.}
+\docparam{flag}{This parameter can be used to set a number of flags which can
+be combined using the binary OR operator |. Two main behaviours are defined
+using these flags. One is the border around a window: the {\it border}
+parameter determines the border width whereas the flags given here determine
+where the border may be (wxTOP, wxBOTTOM, wxLEFT, wxRIGHT or wxALL). The other
+flags determine the child window's behaviour if the size of the sizer changes.
+However this is not - in contrast to the {\it option} flag - in the main
+orientation, but in the respectively other orientation. So if you created a
+wxBoxSizer with the wxVERTICAL option, these flags will be relevant if the
+sizer changes its horizontal size. A child may get resized to completely fill
+out the new size (using either wxGROW or wxEXPAND), it may get proportionally
+resized (wxSHAPED), it may get centered (wxALIGN\_CENTER or wxALIGN\_CENTRE)
+or it may get aligned to either side (wxALIGN\_LEFT and wxALIGN\_TOP are set
+to 0 and thus represent the default, wxALIGN\_RIGHT and wxALIGN\_BOTTOM have
+their obvious meaning). With proportional resize, a child may also be centered
+in the main orientation using wxALIGN\_CENTER\_VERTICAL (same as
+wxALIGN\_CENTRE\_VERTICAL) and wxALIGN\_CENTER\_HORIZONTAL (same as
+wxALIGN\_CENTRE\_HORIZONTAL) flags. Finally, you can also specify
+wxAGJUST\_MIN flag to make the minimal size of the control dynamically adjust
+to the value returned by its \helpref{GetBestSize()}{wxwindowgetbestsize}
+method - this allows, for example, for correct relayouting of a static text
+control even if its text is changed during run-time.}
 
 \docparam{border}{Determines the border width, if the {\it flag} parameter is set to any border.}
 
diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp
index 0a92ab0569..c49530577e 100644
--- a/src/common/sizer.cpp
+++ b/src/common/sizer.cpp
@@ -133,21 +133,28 @@ wxSize wxSizerItem::CalcMin()
     if (IsSizer())
     {
         ret = m_sizer->GetMinSize();
+
         // if we have to preserve aspect ratio _AND_ this is
         // the first-time calculation, consider ret to be initial size
-        if ((m_flag & wxSHAPED) && !m_ratio) SetRatio(ret);
+        if ((m_flag & wxSHAPED) && !m_ratio)
+            SetRatio(ret);
     }
-
-/*
-    The minimum size of a window should be the
-    initial size, as saved in m_minSize, not the
-    current size.
-
     else
-    if (IsWindow())
-        ret = m_window->GetSize();
-*/
-    else ret = m_minSize;
+    {
+        if ( IsWindow() && (m_flag & wxADJUST_MINSIZE) )
+        {
+            // check if the best (minimal, in fact) window size hadn't changed
+            // by chance: this may happen for, e.g. static text if its label
+            // changed
+            wxSize size = m_window->GetBestSize();
+            if ( size.x > m_minSize.x )
+                m_minSize.x = size.x;
+            if ( size.y > m_minSize.y )
+                m_minSize.y = size.y;
+        }
+
+        ret = m_minSize;
+    }
 
     if (m_flag & wxWEST)
         ret.x += m_border;
-- 
2.50.0

