From fe161a2685012cf90bb5bfe95f2260aee71d8ad7 Mon Sep 17 00:00:00 2001
From: Robin Dunn <robin@alldunn.com>
Date: Sat, 19 Jun 2004 01:35:10 +0000
Subject: [PATCH] Controls will readjust their size and minsize when SetLabel
 or SetFont are called.  Fixed up wxStaticText to blend the wxST_NO_AUTOSIZE
 with this new functionality.  Made SetBestSize public under the
 SetBestFittingSize name.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27890 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/control.tex         | 16 ++++++++++++++++
 docs/latex/wx/window.tex          | 14 ++++++++++++++
 include/wx/control.h              | 15 ++++++++++++++-
 include/wx/gtk/control.h          |  4 +++-
 include/wx/gtk/stattext.h         |  3 ++-
 include/wx/gtk1/control.h         |  4 +++-
 include/wx/gtk1/stattext.h        |  3 ++-
 include/wx/mac/carbon/stattext.h  |  1 -
 include/wx/mac/classic/stattext.h |  1 -
 include/wx/msw/checkbox.h         |  2 --
 include/wx/msw/stattext.h         |  4 ----
 include/wx/msw/tglbtn.h           |  1 -
 include/wx/stattext.h             |  2 ++
 include/wx/window.h               | 16 +++++++---------
 src/common/ctrlcmn.cpp            | 25 +++++++++++++++++++++++++
 src/common/wincmn.cpp             |  2 +-
 src/gtk/bmpbuttn.cpp              |  1 +
 src/gtk/button.cpp                |  2 ++
 src/gtk/checkbox.cpp              |  2 ++
 src/gtk/control.cpp               | 11 +++++++++++
 src/gtk/radiobox.cpp              |  2 ++
 src/gtk/radiobut.cpp              |  2 ++
 src/gtk/statbox.cpp               |  1 +
 src/gtk/stattext.cpp              | 21 ++-------------------
 src/gtk/tglbtn.cpp                |  2 ++
 src/gtk/window.cpp                |  4 ++--
 src/gtk1/bmpbuttn.cpp             |  1 +
 src/gtk1/button.cpp               |  2 ++
 src/gtk1/checkbox.cpp             |  2 ++
 src/gtk1/control.cpp              | 11 +++++++++++
 src/gtk1/radiobox.cpp             |  2 ++
 src/gtk1/radiobut.cpp             |  2 ++
 src/gtk1/statbox.cpp              |  1 +
 src/gtk1/stattext.cpp             | 21 ++-------------------
 src/gtk1/tglbtn.cpp               |  2 ++
 src/gtk1/window.cpp               |  4 ++--
 src/mac/carbon/stattext.cpp       | 22 ++--------------------
 src/mac/classic/stattext.cpp      | 28 ++++------------------------
 src/msw/checkbox.cpp              |  4 ----
 src/msw/stattext.cpp              | 28 ----------------------------
 src/msw/tglbtn.cpp                |  5 -----
 wxPython/src/_control.i           | 14 ++++++++++++++
 wxPython/src/_window.i            | 20 +++++++++++++-------
 43 files changed, 176 insertions(+), 154 deletions(-)

diff --git a/docs/latex/wx/control.tex b/docs/latex/wx/control.tex
index 75c4e5f975..52ecc060f2 100644
--- a/docs/latex/wx/control.tex
+++ b/docs/latex/wx/control.tex
@@ -29,6 +29,14 @@ displays one or more item of data.
 Simulates the effect of the user issuing a command to the item. See \helpref{wxCommandEvent}{wxcommandevent}.
 
 
+\membersection{wxControl::GetAdjustMinSizeFlag}\label{wxcontrolgetadjustminsizeflag}
+
+\func{bool}{GetAdjustMinSizeFlag}{}
+
+Returns whether the minsize should be adjusted for this control when
+SetLabel or SetFont are called.
+
+
 \membersection{wxControl::GetLabel}\label{wxcontrolgetlabel}
 
 \func{wxString\&}{GetLabel}{\void}
@@ -36,6 +44,14 @@ Simulates the effect of the user issuing a command to the item. See \helpref{wxC
 Returns the control's text.
 
 
+\membersection{wxControl::SetAdjustMinSizeFlag}\label{wxcontrolsetadjustminsizeflag}
+
+\func{void}{SetAdjustMinSizeFlag}{\param{bool }{adjust}}
+
+By default controls will readjust their size and minsize when
+SetLabel or SetFont are called.  This flag will allow you to
+control this behavior.
+
 \membersection{wxControl::SetLabel}\label{wxcontrolsetlabel}
 
 \func{void}{SetLabel}{\param{const wxString\& }{label}}
diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex
index d3e214b8cc..4386be9e9b 100644
--- a/docs/latex/wx/window.tex
+++ b/docs/latex/wx/window.tex
@@ -2390,6 +2390,20 @@ applications on the system.
 \helpref{wxWindow::Refresh}{wxwindowrefresh},\rtfsp
 \helpref{wxEraseEvent}{wxeraseevent}
 
+\membersection{wxWindow::SetBestFittingSize}\label{wxwindowsetbestfittingsize}
+
+\func{void}{SetBestFittingSize}{\param{const wxSize& }{size = wxDefaultSize}}
+
+A {\it smart} SetSize that will fill in default size components with the
+window's {\it best} size values.  Also set's the minsize for use with
+sizers.
+
+\wxheading{See also}
+
+\helpref{wxWindow::SetSize}{wxwindowsetsize}
+\helpref{wxWindow::GetBestSize}{wxwindowgetbestsize}
+\helpref{wxWindow::SetSizeHints}{wxwindowsetsizehints}
+
 
 \membersection{wxWindow::SetCaret}\label{wxwindowsetcaret}
 
diff --git a/include/wx/control.h b/include/wx/control.h
index 6552443ecd..5fd882ce0c 100644
--- a/include/wx/control.h
+++ b/include/wx/control.h
@@ -32,10 +32,11 @@ WXDLLEXPORT_DATA(extern const wxChar*) wxControlNameStr;
 // wxControl is the base class for all controls
 // ----------------------------------------------------------------------------
 
+
 class WXDLLEXPORT wxControlBase : public wxWindow
 {
 public:
-    wxControlBase() { }
+    wxControlBase() { Init(); }
 
     virtual ~wxControlBase();
 
@@ -63,7 +64,16 @@ public:
     // if the button was clicked)
     virtual void Command(wxCommandEvent &event);
 
+        
+    virtual void SetLabel(const wxString& label);
+    virtual bool SetFont(const wxFont& font);
+    virtual bool GetAdjustMinSizeFlag() const { return m_adjustMinSize; }
+    void SetAdjustMinSizeFlag(bool adjust) { m_adjustMinSize = adjust; }
+    
+    
 protected:
+    void Init();
+    
     // creates the control (calls wxWindowBase::CreateBase inside) and adds it
     // to the list of parents children
     bool CreateControl(wxWindowBase *parent,
@@ -88,6 +98,9 @@ protected:
         SetBestSize(size);
     }
 
+    // should minsize and size be adjusted when font or label change?
+    bool        m_adjustMinSize;  
+    
     DECLARE_NO_COPY_CLASS(wxControlBase)
 };
 
diff --git a/include/wx/gtk/control.h b/include/wx/gtk/control.h
index 553f94f7c1..c7954c415e 100644
--- a/include/wx/gtk/control.h
+++ b/include/wx/gtk/control.h
@@ -52,7 +52,7 @@ public:
     // char (the one immediately after '&') into m_chAccel (TODO not yet)
     virtual void SetLabel( const wxString &label );
     virtual wxString GetLabel() const;
-
+    
     virtual wxVisualAttributes GetDefaultAttributes() const;
 
 protected:
@@ -63,6 +63,7 @@ protected:
 
     virtual wxSize DoGetBestSize() const;
     void PostCreation(const wxSize& size);
+    void PostSetLabel();
 
 #ifdef __WXGTK20__
     wxString PrepareLabelMnemonics( const wxString &label ) const;
@@ -93,6 +94,7 @@ protected:
 
     wxString   m_label;
     char       m_chAccel;  // enabled to avoid breaking binary compatibility later on
+    bool       m_createComplete;
 
 private:
     DECLARE_DYNAMIC_CLASS(wxControl)
diff --git a/include/wx/gtk/stattext.h b/include/wx/gtk/stattext.h
index 6686c96982..dd4d499883 100644
--- a/include/wx/gtk/stattext.h
+++ b/include/wx/gtk/stattext.h
@@ -57,7 +57,8 @@ public:
     wxString GetLabel() const;
     void SetLabel( const wxString &label );
 
-    bool SetFont( const wxFont &font );
+    bool GetAdjustMinSizeFlag() const { return !HasFlag(wxST_NO_AUTORESIZE); }
+    
     bool SetForegroundColour( const wxColour& colour );
 
     static wxVisualAttributes
diff --git a/include/wx/gtk1/control.h b/include/wx/gtk1/control.h
index 553f94f7c1..c7954c415e 100644
--- a/include/wx/gtk1/control.h
+++ b/include/wx/gtk1/control.h
@@ -52,7 +52,7 @@ public:
     // char (the one immediately after '&') into m_chAccel (TODO not yet)
     virtual void SetLabel( const wxString &label );
     virtual wxString GetLabel() const;
-
+    
     virtual wxVisualAttributes GetDefaultAttributes() const;
 
 protected:
@@ -63,6 +63,7 @@ protected:
 
     virtual wxSize DoGetBestSize() const;
     void PostCreation(const wxSize& size);
+    void PostSetLabel();
 
 #ifdef __WXGTK20__
     wxString PrepareLabelMnemonics( const wxString &label ) const;
@@ -93,6 +94,7 @@ protected:
 
     wxString   m_label;
     char       m_chAccel;  // enabled to avoid breaking binary compatibility later on
+    bool       m_createComplete;
 
 private:
     DECLARE_DYNAMIC_CLASS(wxControl)
diff --git a/include/wx/gtk1/stattext.h b/include/wx/gtk1/stattext.h
index 6686c96982..dd4d499883 100644
--- a/include/wx/gtk1/stattext.h
+++ b/include/wx/gtk1/stattext.h
@@ -57,7 +57,8 @@ public:
     wxString GetLabel() const;
     void SetLabel( const wxString &label );
 
-    bool SetFont( const wxFont &font );
+    bool GetAdjustMinSizeFlag() const { return !HasFlag(wxST_NO_AUTORESIZE); }
+    
     bool SetForegroundColour( const wxColour& colour );
 
     static wxVisualAttributes
diff --git a/include/wx/mac/carbon/stattext.h b/include/wx/mac/carbon/stattext.h
index c5f41c02c4..95c32a82b9 100644
--- a/include/wx/mac/carbon/stattext.h
+++ b/include/wx/mac/carbon/stattext.h
@@ -40,7 +40,6 @@ public:
 
   // accessors
   void SetLabel( const wxString &str ) ;
-  bool SetFont( const wxFont &font );
 
 protected :
 
diff --git a/include/wx/mac/classic/stattext.h b/include/wx/mac/classic/stattext.h
index 17ecf98ad0..15eae66671 100644
--- a/include/wx/mac/classic/stattext.h
+++ b/include/wx/mac/classic/stattext.h
@@ -41,7 +41,6 @@ class WXDLLEXPORT wxStaticText: public wxStaticTextBase
 
   // accessors
   void SetLabel( const wxString &str ) ;
-  bool SetFont( const wxFont &font );
 
   // operations
   virtual void Command(wxCommandEvent& WXUNUSED(event)) {};
diff --git a/include/wx/msw/checkbox.h b/include/wx/msw/checkbox.h
index 64dedbf487..da3df7f80a 100644
--- a/include/wx/msw/checkbox.h
+++ b/include/wx/msw/checkbox.h
@@ -45,8 +45,6 @@ public:
     virtual void SetValue(bool value);
     virtual bool GetValue() const;
 
-    virtual void SetLabel(const wxString& label);
-
     virtual bool MSWCommand(WXUINT param, WXWORD id);
     virtual void Command(wxCommandEvent& event);
 
diff --git a/include/wx/msw/stattext.h b/include/wx/msw/stattext.h
index 0ceef4c977..c42f65552c 100644
--- a/include/wx/msw/stattext.h
+++ b/include/wx/msw/stattext.h
@@ -40,10 +40,6 @@ public:
                 long style = 0,
                 const wxString& name = wxStaticTextNameStr);
 
-    // override some methods to resize the window properly
-    virtual void SetLabel(const wxString& label);
-    virtual bool SetFont( const wxFont &font );
-
 protected:
     // implement/override some base class virtuals
     virtual wxBorder GetDefaultBorder() const;
diff --git a/include/wx/msw/tglbtn.h b/include/wx/msw/tglbtn.h
index 1136702397..b6ab08a2b8 100644
--- a/include/wx/msw/tglbtn.h
+++ b/include/wx/msw/tglbtn.h
@@ -45,7 +45,6 @@ public:
     virtual bool GetValue() const ;
 
     virtual bool MSWCommand(WXUINT param, WXWORD id);
-    virtual void SetLabel(const wxString& label);
     virtual void Command(wxCommandEvent& event);
 
 protected:
diff --git a/include/wx/stattext.h b/include/wx/stattext.h
index 8590052f74..c210383e5c 100644
--- a/include/wx/stattext.h
+++ b/include/wx/stattext.h
@@ -17,6 +17,8 @@ public:
     virtual void ApplyParentThemeBackground(const wxColour& bg)
         { SetBackgroundColour(bg); }
 
+    bool GetAdjustMinSizeFlag() const { return !HasFlag(wxST_NO_AUTORESIZE); }
+    
 private:
     DECLARE_NO_COPY_CLASS(wxStaticTextBase)
 };
diff --git a/include/wx/window.h b/include/wx/window.h
index 87dc4cc691..40ad7b237c 100644
--- a/include/wx/window.h
+++ b/include/wx/window.h
@@ -230,6 +230,9 @@ public:
     void Move(const wxPoint& pt, int flags = wxSIZE_USE_EXISTING)
         { Move(pt.x, pt.y, flags); }
 
+    // A 'Smart' SetSize that will fill in default size values with 'best' size
+    void SetBestFittingSize(const wxSize& size=wxDefaultSize);
+
         // Z-order
     virtual void Raise() = 0;
     virtual void Lower() = 0;
@@ -1136,15 +1139,10 @@ protected:
     static int WidthDefault(int w) { return w == -1 ? 20 : w; }
     static int HeightDefault(int h) { return h == -1 ? 20 : h; }
 
-    // set the best size for the control if the default size was given:
-    // replaces the fields of size == -1 with the best values for them and
-    // calls SetSize() if needed
-    //
-    // This function is rather unfortunately named..  it's really just a
-    // smarter SetSize / convenience function for expanding wxDefaultSize.
-    // Note that it does not influence the value returned by GetBestSize
-    // at all.
-    void SetBestSize(const wxSize& size);
+    // keep the old name for compatibility, at least until all the internal
+    // usages of it are changed to SetBestFittingSize
+    void SetBestSize(const wxSize& size) { SetBestFittingSize(size); }
+        
 
     // set the initial window size if none is given (i.e. at least one of the
     // components of the size passed to ctor/Create() is -1)
diff --git a/src/common/ctrlcmn.cpp b/src/common/ctrlcmn.cpp
index 242efdca1f..eab0f889f1 100644
--- a/src/common/ctrlcmn.cpp
+++ b/src/common/ctrlcmn.cpp
@@ -68,6 +68,13 @@ bool wxControlBase::Create(wxWindow *parent,
     return ret;
 }
 
+
+void wxControlBase::Init()
+{
+    m_adjustMinSize = true;
+}
+
+
 bool wxControlBase::CreateControl(wxWindowBase *parent,
                                   wxWindowID id,
                                   const wxPoint& pos,
@@ -116,6 +123,24 @@ void wxControlBase::InitCommandEvent(wxCommandEvent& event) const
     }
 }
 
+void wxControlBase::SetLabel(const wxString& label)
+{
+    wxWindow::SetLabel(label);
+    if (GetAdjustMinSizeFlag())
+        SetBestSize(wxDefaultSize);
+}
+
+
+bool wxControlBase::SetFont(const wxFont& font)
+{
+    bool ret = wxWindow::SetFont(font);
+
+    if (GetAdjustMinSizeFlag())
+        SetBestSize(wxDefaultSize);
+
+    return ret;
+}
+
 // ----------------------------------------------------------------------------
 // wxStaticBitmap
 // ----------------------------------------------------------------------------
diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp
index e7d8c7768a..e6dd55946e 100644
--- a/src/common/wincmn.cpp
+++ b/src/common/wincmn.cpp
@@ -620,7 +620,7 @@ wxSize wxWindowBase::DoGetBestSize() const
     }
 }
 
-void wxWindowBase::SetBestSize(const wxSize& size)
+void wxWindowBase::SetBestFittingSize(const wxSize& size)
 {
     // If the given size is incomplete then merge with the best size.
     wxSize sizeBest;
diff --git a/src/gtk/bmpbuttn.cpp b/src/gtk/bmpbuttn.cpp
index db11765013..8be33e83f7 100644
--- a/src/gtk/bmpbuttn.cpp
+++ b/src/gtk/bmpbuttn.cpp
@@ -184,6 +184,7 @@ void wxBitmapButton::SetLabel( const wxString &label )
     wxCHECK_RET( m_widget != NULL, wxT("invalid button") );
 
     wxControl::SetLabel( label );
+    PostSetLabel();
 }
 
 wxString wxBitmapButton::GetLabel() const
diff --git a/src/gtk/button.cpp b/src/gtk/button.cpp
index d64273b780..330b5d0e12 100644
--- a/src/gtk/button.cpp
+++ b/src/gtk/button.cpp
@@ -175,6 +175,8 @@ void wxButton::SetLabel( const wxString &label )
 #else
     gtk_label_set( GTK_LABEL( BUTTON_CHILD(m_widget) ), wxGTK_CONV( GetLabel() ) );
 #endif
+
+    PostSetLabel();
 }
 
 bool wxButton::Enable( bool enable )
diff --git a/src/gtk/checkbox.cpp b/src/gtk/checkbox.cpp
index 1c64e26ba1..33f8a565b7 100644
--- a/src/gtk/checkbox.cpp
+++ b/src/gtk/checkbox.cpp
@@ -158,6 +158,8 @@ void wxCheckBox::SetLabel( const wxString& label )
 #else
     gtk_label_set( GTK_LABEL(m_widgetLabel), wxGTK_CONV( GetLabel() ) );
 #endif
+
+    PostSetLabel();
 }
 
 bool wxCheckBox::Enable( bool enable )
diff --git a/src/gtk/control.cpp b/src/gtk/control.cpp
index 053f18f1ea..ed8b2147e8 100644
--- a/src/gtk/control.cpp
+++ b/src/gtk/control.cpp
@@ -33,6 +33,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxControl, wxWindow)
 wxControl::wxControl()
 {
     m_needParent = TRUE;
+    m_createComplete = false;
 }
 
 bool wxControl::Create( wxWindow *parent,
@@ -43,6 +44,7 @@ bool wxControl::Create( wxWindow *parent,
                       const wxValidator& validator,
                       const wxString &name )
 {
+    m_createComplete = false;
     bool ret = wxWindow::Create(parent, id, pos, size, style, name);
     
 #if wxUSE_VALIDATORS
@@ -68,6 +70,14 @@ void wxControl::SetLabel( const wxString &label )
     }
 }
 
+void wxControl::PostSetLabel()
+{
+    // make sure the widget has been created, and that PostCreate has already
+    // been called
+    if (m_widget && m_createComplete && GetAdjustMinSizeFlag())
+        SetBestSize(wxDefaultSize);
+}
+
 wxString wxControl::GetLabel() const
 {
     return m_label;
@@ -103,6 +113,7 @@ void wxControl::PostCreation(const wxSize& size)
     InheritAttributes();
     ApplyWidgetStyle();
     SetInitialBestSize(size);
+    m_createComplete = true;
 }
 
 
diff --git a/src/gtk/radiobox.cpp b/src/gtk/radiobox.cpp
index ea1eee5230..f0af2b64a5 100644
--- a/src/gtk/radiobox.cpp
+++ b/src/gtk/radiobox.cpp
@@ -540,6 +540,8 @@ void wxRadioBox::SetLabel( const wxString& label )
     wxControl::SetLabel( label );
 
     gtk_frame_set_label( GTK_FRAME(m_widget), wxGTK_CONV( wxControl::GetLabel() ) );
+
+    PostSetLabel();
 }
 
 void wxRadioBox::SetString( int item, const wxString& label )
diff --git a/src/gtk/radiobut.cpp b/src/gtk/radiobut.cpp
index 2c3e1c0d10..837cd33058 100644
--- a/src/gtk/radiobut.cpp
+++ b/src/gtk/radiobut.cpp
@@ -145,6 +145,8 @@ void wxRadioButton::SetLabel( const wxString& label )
 #else
     gtk_label_set( g_label, wxGTK_CONV( GetLabel() ) );
 #endif
+
+    PostSetLabel();
 }
 
 void wxRadioButton::SetValue( bool val )
diff --git a/src/gtk/statbox.cpp b/src/gtk/statbox.cpp
index 7c3eb9678e..9d489265d8 100644
--- a/src/gtk/statbox.cpp
+++ b/src/gtk/statbox.cpp
@@ -89,6 +89,7 @@ void wxStaticBox::SetLabel( const wxString &label )
 
     gtk_frame_set_label( GTK_FRAME( m_widget ),
                          m_label.empty() ? (char *)NULL : (const char*) wxGTK_CONV( m_label ) );
+    PostSetLabel();
 }
 
 // static
diff --git a/src/gtk/stattext.cpp b/src/gtk/stattext.cpp
index d659e8cc16..f3c40c1226 100644
--- a/src/gtk/stattext.cpp
+++ b/src/gtk/stattext.cpp
@@ -146,27 +146,10 @@ void wxStaticText::SetLabel( const wxString &label )
 #else
     gtk_label_set( GTK_LABEL(m_widget), wxGTK_CONV( m_label ) );
 #endif
-
-    // adjust the label size to the new label unless disabled
-    if (!HasFlag(wxST_NO_AUTORESIZE))
-    {
-        SetSize( GetBestSize() );
-        SetSizeHints(GetSize());
-    }
+    
+    PostSetLabel();
 }
 
-bool wxStaticText::SetFont( const wxFont &font )
-{
-    bool ret = wxControl::SetFont(font);
-
-    // adjust the label size to the new label unless disabled
-    if (!HasFlag(wxST_NO_AUTORESIZE))
-    {
-        SetSize( GetBestSize() );
-        SetSizeHints(GetSize());
-    }
-    return ret;
-}
 
 wxSize wxStaticText::DoGetBestSize() const
 {
diff --git a/src/gtk/tglbtn.cpp b/src/gtk/tglbtn.cpp
index 8ac7ec5a3c..7bccf53080 100644
--- a/src/gtk/tglbtn.cpp
+++ b/src/gtk/tglbtn.cpp
@@ -287,6 +287,8 @@ void wxToggleButton::SetLabel(const wxString& label)
     wxControl::SetLabel(label);
 
     gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), wxGTK_CONV( GetLabel() ) );
+
+    PostSetLabel();
 }
 
 bool wxToggleButton::Enable(bool enable /*=TRUE*/)
diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp
index 045dbfc9fa..8e5f4bdd3b 100644
--- a/src/gtk/window.cpp
+++ b/src/gtk/window.cpp
@@ -4043,7 +4043,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
 #endif
     }
 
-    if ( m_hasFgCol )
+    if ( m_foregroundColour.Ok() )
     {
         GdkColor *fg = m_foregroundColour.GetColor();
         
@@ -4057,7 +4057,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
         style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG;
     }
 
-    if ( m_hasBgCol )
+    if ( m_backgroundColour.Ok() )
     {
         GdkColor *bg = m_backgroundColour.GetColor();
 
diff --git a/src/gtk1/bmpbuttn.cpp b/src/gtk1/bmpbuttn.cpp
index db11765013..8be33e83f7 100644
--- a/src/gtk1/bmpbuttn.cpp
+++ b/src/gtk1/bmpbuttn.cpp
@@ -184,6 +184,7 @@ void wxBitmapButton::SetLabel( const wxString &label )
     wxCHECK_RET( m_widget != NULL, wxT("invalid button") );
 
     wxControl::SetLabel( label );
+    PostSetLabel();
 }
 
 wxString wxBitmapButton::GetLabel() const
diff --git a/src/gtk1/button.cpp b/src/gtk1/button.cpp
index d64273b780..330b5d0e12 100644
--- a/src/gtk1/button.cpp
+++ b/src/gtk1/button.cpp
@@ -175,6 +175,8 @@ void wxButton::SetLabel( const wxString &label )
 #else
     gtk_label_set( GTK_LABEL( BUTTON_CHILD(m_widget) ), wxGTK_CONV( GetLabel() ) );
 #endif
+
+    PostSetLabel();
 }
 
 bool wxButton::Enable( bool enable )
diff --git a/src/gtk1/checkbox.cpp b/src/gtk1/checkbox.cpp
index 1c64e26ba1..33f8a565b7 100644
--- a/src/gtk1/checkbox.cpp
+++ b/src/gtk1/checkbox.cpp
@@ -158,6 +158,8 @@ void wxCheckBox::SetLabel( const wxString& label )
 #else
     gtk_label_set( GTK_LABEL(m_widgetLabel), wxGTK_CONV( GetLabel() ) );
 #endif
+
+    PostSetLabel();
 }
 
 bool wxCheckBox::Enable( bool enable )
diff --git a/src/gtk1/control.cpp b/src/gtk1/control.cpp
index 053f18f1ea..ed8b2147e8 100644
--- a/src/gtk1/control.cpp
+++ b/src/gtk1/control.cpp
@@ -33,6 +33,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxControl, wxWindow)
 wxControl::wxControl()
 {
     m_needParent = TRUE;
+    m_createComplete = false;
 }
 
 bool wxControl::Create( wxWindow *parent,
@@ -43,6 +44,7 @@ bool wxControl::Create( wxWindow *parent,
                       const wxValidator& validator,
                       const wxString &name )
 {
+    m_createComplete = false;
     bool ret = wxWindow::Create(parent, id, pos, size, style, name);
     
 #if wxUSE_VALIDATORS
@@ -68,6 +70,14 @@ void wxControl::SetLabel( const wxString &label )
     }
 }
 
+void wxControl::PostSetLabel()
+{
+    // make sure the widget has been created, and that PostCreate has already
+    // been called
+    if (m_widget && m_createComplete && GetAdjustMinSizeFlag())
+        SetBestSize(wxDefaultSize);
+}
+
 wxString wxControl::GetLabel() const
 {
     return m_label;
@@ -103,6 +113,7 @@ void wxControl::PostCreation(const wxSize& size)
     InheritAttributes();
     ApplyWidgetStyle();
     SetInitialBestSize(size);
+    m_createComplete = true;
 }
 
 
diff --git a/src/gtk1/radiobox.cpp b/src/gtk1/radiobox.cpp
index ea1eee5230..f0af2b64a5 100644
--- a/src/gtk1/radiobox.cpp
+++ b/src/gtk1/radiobox.cpp
@@ -540,6 +540,8 @@ void wxRadioBox::SetLabel( const wxString& label )
     wxControl::SetLabel( label );
 
     gtk_frame_set_label( GTK_FRAME(m_widget), wxGTK_CONV( wxControl::GetLabel() ) );
+
+    PostSetLabel();
 }
 
 void wxRadioBox::SetString( int item, const wxString& label )
diff --git a/src/gtk1/radiobut.cpp b/src/gtk1/radiobut.cpp
index 2c3e1c0d10..837cd33058 100644
--- a/src/gtk1/radiobut.cpp
+++ b/src/gtk1/radiobut.cpp
@@ -145,6 +145,8 @@ void wxRadioButton::SetLabel( const wxString& label )
 #else
     gtk_label_set( g_label, wxGTK_CONV( GetLabel() ) );
 #endif
+
+    PostSetLabel();
 }
 
 void wxRadioButton::SetValue( bool val )
diff --git a/src/gtk1/statbox.cpp b/src/gtk1/statbox.cpp
index 7c3eb9678e..9d489265d8 100644
--- a/src/gtk1/statbox.cpp
+++ b/src/gtk1/statbox.cpp
@@ -89,6 +89,7 @@ void wxStaticBox::SetLabel( const wxString &label )
 
     gtk_frame_set_label( GTK_FRAME( m_widget ),
                          m_label.empty() ? (char *)NULL : (const char*) wxGTK_CONV( m_label ) );
+    PostSetLabel();
 }
 
 // static
diff --git a/src/gtk1/stattext.cpp b/src/gtk1/stattext.cpp
index d659e8cc16..f3c40c1226 100644
--- a/src/gtk1/stattext.cpp
+++ b/src/gtk1/stattext.cpp
@@ -146,27 +146,10 @@ void wxStaticText::SetLabel( const wxString &label )
 #else
     gtk_label_set( GTK_LABEL(m_widget), wxGTK_CONV( m_label ) );
 #endif
-
-    // adjust the label size to the new label unless disabled
-    if (!HasFlag(wxST_NO_AUTORESIZE))
-    {
-        SetSize( GetBestSize() );
-        SetSizeHints(GetSize());
-    }
+    
+    PostSetLabel();
 }
 
-bool wxStaticText::SetFont( const wxFont &font )
-{
-    bool ret = wxControl::SetFont(font);
-
-    // adjust the label size to the new label unless disabled
-    if (!HasFlag(wxST_NO_AUTORESIZE))
-    {
-        SetSize( GetBestSize() );
-        SetSizeHints(GetSize());
-    }
-    return ret;
-}
 
 wxSize wxStaticText::DoGetBestSize() const
 {
diff --git a/src/gtk1/tglbtn.cpp b/src/gtk1/tglbtn.cpp
index 8ac7ec5a3c..7bccf53080 100644
--- a/src/gtk1/tglbtn.cpp
+++ b/src/gtk1/tglbtn.cpp
@@ -287,6 +287,8 @@ void wxToggleButton::SetLabel(const wxString& label)
     wxControl::SetLabel(label);
 
     gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), wxGTK_CONV( GetLabel() ) );
+
+    PostSetLabel();
 }
 
 bool wxToggleButton::Enable(bool enable /*=TRUE*/)
diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp
index 045dbfc9fa..8e5f4bdd3b 100644
--- a/src/gtk1/window.cpp
+++ b/src/gtk1/window.cpp
@@ -4043,7 +4043,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
 #endif
     }
 
-    if ( m_hasFgCol )
+    if ( m_foregroundColour.Ok() )
     {
         GdkColor *fg = m_foregroundColour.GetColor();
         
@@ -4057,7 +4057,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
         style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG;
     }
 
-    if ( m_hasBgCol )
+    if ( m_backgroundColour.Ok() )
     {
         GdkColor *bg = m_backgroundColour.GetColor();
 
diff --git a/src/mac/carbon/stattext.cpp b/src/mac/carbon/stattext.cpp
index f4757d19d7..761b0598b5 100644
--- a/src/mac/carbon/stattext.cpp
+++ b/src/mac/carbon/stattext.cpp
@@ -92,27 +92,9 @@ void wxStaticText::SetLabel(const wxString& st )
     SetControlData( *m_peer, kControlEntireControl , kControlStaticTextCFStringTag, sizeof( CFStringRef ),
 		&ref );
 
-    if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
-    {
-        SetSize( GetBestSize() ) ;
-        SetSizeHints(GetSize());
-    }
+    if (GetAdjustMinSizeFlag())
+        SetBestSize(wxDefaultSize);
 
     Update() ;
 }
 
-bool wxStaticText::SetFont(const wxFont& font)
-{
-    bool ret = wxControl::SetFont(font);
-
-	if ( ret )
-	{
-	    if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
-            {
-	        SetSize( GetBestSize() );
-                SetSizeHints(GetSize());
-            }
-	}
-
-    return ret;
-}
diff --git a/src/mac/classic/stattext.cpp b/src/mac/classic/stattext.cpp
index 1c0facdbf7..8bc3ee9272 100644
--- a/src/mac/classic/stattext.cpp
+++ b/src/mac/classic/stattext.cpp
@@ -232,31 +232,11 @@ void wxStaticText::SetLabel(const wxString& st )
 {
     SetTitle( st ) ;
     m_label = st ;
-    if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
-    {
-        // temporary fix until layout measurement and drawing are in synch again
-        Refresh() ;
-        SetSize( GetBestSize() ) ;
-    }
+
+    if (GetAdjustMinSizeFlag())
+        SetBestSize(wxDefaultSize);
+
     Refresh() ;
     Update() ;
 }
 
-bool wxStaticText::SetFont(const wxFont& font)
-{
-    bool ret = wxControl::SetFont(font);
-
-	if ( ret )
-	{
-	    // adjust the size of the window to fit to the label unless autoresizing is
-	    // disabled
-	    if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
-	    {
-	        // temporary fix until layout measurement and drawing are in synch again
-            Refresh() ;
-	        SetSize( GetBestSize() );
-	    }
-	}
-
-    return ret;
-}
diff --git a/src/msw/checkbox.cpp b/src/msw/checkbox.cpp
index f596c6a408..fe6b025067 100644
--- a/src/msw/checkbox.cpp
+++ b/src/msw/checkbox.cpp
@@ -165,10 +165,6 @@ bool wxCheckBox::Create(wxWindow *parent,
     return MSWCreateControl(wxT("BUTTON"), msStyle, pos, size, label, 0);
 }
 
-void wxCheckBox::SetLabel(const wxString& label)
-{
-    SetWindowText(GetHwnd(), label);
-}
 
 wxSize wxCheckBox::DoGetBestSize() const
 {
diff --git a/src/msw/stattext.cpp b/src/msw/stattext.cpp
index 12b7403018..02d4e44b50 100644
--- a/src/msw/stattext.cpp
+++ b/src/msw/stattext.cpp
@@ -207,33 +207,5 @@ void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags)
     Refresh();
 }
 
-void wxStaticText::SetLabel(const wxString& label)
-{
-    wxStaticTextBase::SetLabel(label);
-
-    // adjust the size of the window to fit to the label unless autoresizing is
-    // disabled
-    if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
-    {
-        DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
-        SetSizeHints(GetSize());
-    }
-}
-
-
-bool wxStaticText::SetFont(const wxFont& font)
-{
-    bool ret = wxControl::SetFont(font);
-
-    // adjust the size of the window to fit to the label unless autoresizing is
-    // disabled
-    if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
-    {
-        DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
-        SetSizeHints(GetSize());
-    }
-
-    return ret;
-}
 
 #endif // wxUSE_STATTEXT
diff --git a/src/msw/tglbtn.cpp b/src/msw/tglbtn.cpp
index 9b6d07128d..02f1fc0f42 100644
--- a/src/msw/tglbtn.cpp
+++ b/src/msw/tglbtn.cpp
@@ -110,11 +110,6 @@ WXDWORD wxToggleButton::MSWGetStyle(long style, WXDWORD *exstyle) const
     return msStyle;
 }
 
-void wxToggleButton::SetLabel(const wxString& label)
-{
-    SetWindowText(GetHwnd(), label);
-}
-
 wxSize wxToggleButton::DoGetBestSize() const
 {
    wxString label = wxGetWindowText(GetHWND());
diff --git a/wxPython/src/_control.i b/wxPython/src/_control.i
index 966b3950a6..8860f56552 100644
--- a/wxPython/src/_control.i
+++ b/wxPython/src/_control.i
@@ -77,6 +77,20 @@ __init__ as a plain old wx.Control is not very useful.", "");
         void , SetLabel(const wxString& label),
         "Sets the item's text.", "");
 
+
+    DocDeclStr(
+        bool , GetAdjustMinSizeFlag(),
+        "Returns whether the minsize should be adjusted for this control when
+`SetLabel` or `SetFont` are called.", "");
+    
+    DocDeclStr(
+        void , SetAdjustMinSizeFlag(bool adjust),
+        "By default controls will readjust their size and minsize when
+`SetLabel` or `SetFont` are called.  This flag will allow you to
+control this behavior.", "
+
+:see: `GetAdjustMinSizeFlag`
+");
     
     static wxVisualAttributes
     GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
diff --git a/wxPython/src/_window.i b/wxPython/src/_window.i
index 3c89585101..cb217eea1a 100644
--- a/wxPython/src/_window.i
+++ b/wxPython/src/_window.i
@@ -415,8 +415,13 @@ default values.", "",
         "Moves the window to the given position.", "",
         MoveXY);
     
+    DocDeclStr(
+        void , SetBestFittingSize(const wxSize& size=wxDefaultSize),
+        "A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.", "");
+    
 
-
+    
     DocDeclStr(
         virtual void , Raise(),
         "Raises the window to the top of the window hierarchy if it is a
@@ -1267,16 +1272,17 @@ this.", "");
         "Sets the background colour of the window.  Returns True if the colour
 was changed.  The background colour is usually painted by the default
 EVT_ERASE_BACKGROUND event handler function under Windows and
-automatically under GTK.
+automatically under GTK.  Using `wx.NullColour` will reset the window
+to the default background colour.
 
 Note that setting the background colour may not cause an immediate
-refresh, so you may wish to call ClearBackground or Refresh after
+refresh, so you may wish to call `ClearBackground` or `Refresh` after
 calling this function.
 
-Use this function with care under GTK+ as the new appearance of the
-window might not look equally well when used with themes, i.e GTK+'s
-ability to change its look as the user wishes with run-time loadable
-modules.", "");
+Using this function will disable attempts to use themes for this
+window, if the system supports them.  Use with care since usually the
+themes represent the appearance chosen by the user to be used for all
+applications on the system.", "");
 
     DocDeclStr(
         void , SetDefaultBackgroundColour(const wxColour& colour),
-- 
2.50.0

