From caa251e0739fb50063849598fee09372c9dbafd6 Mon Sep 17 00:00:00 2001
From: Robin Dunn <robin@alldunn.com>
Date: Wed, 7 Apr 2004 19:21:06 +0000
Subject: [PATCH] Added wxFIXED_SIZE. Propogated wxSizer::SetItemMinSize to
 SetSizeHints for window items. Updated docs for flag parameter to be more
 readable and understandable.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26644 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/sizer.tex | 63 ++++++++++++++++++++++++++++-------------
 include/wx/defs.h       |  2 +-
 src/common/sizer.cpp    |  5 +++-
 3 files changed, 48 insertions(+), 22 deletions(-)

diff --git a/docs/latex/wx/sizer.tex b/docs/latex/wx/sizer.tex
index 7b12d31523..ed306b1efc 100644
--- a/docs/latex/wx/sizer.tex
+++ b/docs/latex/wx/sizer.tex
@@ -89,26 +89,49 @@ 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 proportion} 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{border}{Determines the border width, if the {\it flag} parameter is set to any border.}
+\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 which side(s) of the item that the
+border will be added.  The other flags determine how the sizer item
+behaves when the space allotted to the sizer changes, and is somewhat
+dependent on the specific kind of sizer used.
+
+\twocolwidtha{5cm}%
+\begin{twocollist}\itemsep=0pt
+\twocolitem{\windowstyle{wxTOP}\\
+\windowstyle{wxBOTTOM}\\
+\windowstyle{wxLEFT}\\
+\windowstyle{wxRIGHT}\\
+\windowstyle{wxALL}}{These flags are used to specify which side(s) of
+  the sizer item the {\it border} width will apply to. }
+
+\twocolitem{\windowstyle{wxEXAPAND}}{The item will be expanded to fill
+the space allotted to the item.}
+\twocolitem{\windowstyle{wxSHAPED}}{The item will be expanded as much
+as possible while also maintaining its aspect ratio}
+\twocolitem{\windowstyle{wxFIXED\_SIZE}}{Normally wxSizers will use
+  \helpref{GetAdjustedBestSize}{wxwindowgetadjustedbestsize} to
+  determin what the minimal size of window items should be, and will
+  use that size to calculate the layout.  This allows layouts to
+  adjust when an item changes and it's {\it best size} becomes
+  different.  If you would rather have a window item stay the size it
+  started with then use wxFIXED\_SIZE.}
+\twocolitem{\windowstyle{wxALIGN\_CENTER}\\
+\windowstyle{wxALIGN\_LEFT}\\
+\windowstyle{wxALIGN\_RIGHT}\\
+\windowstyle{wxALIGN\_TOP}\\
+\windowstyle{wxALIGN\_BOTTOM}\\
+\windowstyle{wxALIGN\_CENTER\_VERTICAL}\\
+\windowstyle{wxALIGN\_CENTER\_HORIZONTAL}}{The wxALIGN flags allow you to
+  specify the alignment of the item within the space allotted to it by
+  the sizer, ajusted for the border if any.}
+\end{twocollist}
+}
+
+\docparam{border}{Determines the border width, if the {\it flag}
+  parameter is set to include any border flag.}
 
 \docparam{userData}{Allows an extra object to be attached to the sizer
 item, for use in derived classes when sizing information is more
diff --git a/include/wx/defs.h b/include/wx/defs.h
index da04c2e305..a10b3763a5 100644
--- a/include/wx/defs.h
+++ b/include/wx/defs.h
@@ -1031,7 +1031,7 @@ enum wxStretch
     wxGROW                    = 0x2000,
     wxEXPAND                  = wxGROW,
     wxSHAPED                  = 0x4000,
-    // free value: 0x8000 (old wxADJUST_MINSIZE)
+    wxFIXED_SIZE              = 0x8000,
     wxTILE                    = 0xc000,
 
     // for compatibility only, default now, don't use explicitly any more
diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp
index b6e4498e28..06c64979b4 100644
--- a/src/common/sizer.cpp
+++ b/src/common/sizer.cpp
@@ -193,7 +193,7 @@ wxSize wxSizerItem::CalcMin()
     }
     else
     {
-        if ( IsWindow() )
+        if ( IsWindow() && !(m_flag & wxFIXED_SIZE) )
         {
             // the size of the window may change during run-time, we should
             // use the current minimal size
@@ -736,6 +736,7 @@ bool wxSizer::DoSetItemMinSize( wxWindow *window, int width, int height )
         if (item->GetWindow() == window)
         {
             item->SetInitSize( width, height );
+            item->GetWindow()->SetSizeHints(width, height);
             return true;
         }
         node = node->GetNext();
@@ -815,6 +816,8 @@ bool wxSizer::DoSetItemMinSize( size_t index, int width, int height )
     {
         // ... but the minimal size of spacers and windows in stored in them
         item->SetInitSize( width, height );
+        if (item->GetWindow())
+            item->GetWindow()->SetSizeHints(width, height);
     }
 
     return true;
-- 
2.50.0

