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
This commit is contained in:
Robin Dunn
2004-06-19 01:35:10 +00:00
parent 8de5b24e54
commit fe161a2685
43 changed files with 176 additions and 154 deletions

View File

@@ -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}}

View File

@@ -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}

View File

@@ -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)
};

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -40,7 +40,6 @@ public:
// accessors
void SetLabel( const wxString &str ) ;
bool SetFont( const wxFont &font );
protected :

View File

@@ -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)) {};

View File

@@ -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);

View File

@@ -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;

View File

@@ -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:

View File

@@ -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)
};

View File

@@ -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)

View File

@@ -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
// ----------------------------------------------------------------------------

View File

@@ -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;

View File

@@ -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

View File

@@ -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 )

View File

@@ -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 )

View File

@@ -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;
}

View File

@@ -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 )

View File

@@ -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 )

View File

@@ -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

View File

@@ -147,26 +147,9 @@ void wxStaticText::SetLabel( const wxString &label )
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
{

View File

@@ -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*/)

View File

@@ -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();

View File

@@ -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

View File

@@ -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 )

View File

@@ -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 )

View File

@@ -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;
}

View File

@@ -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 )

View File

@@ -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 )

View File

@@ -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

View File

@@ -147,26 +147,9 @@ void wxStaticText::SetLabel( const wxString &label )
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
{

View File

@@ -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*/)

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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
{

View File

@@ -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

View File

@@ -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());

View File

@@ -78,6 +78,20 @@ __init__ as a plain old wx.Control is not very useful.", "");
"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);
};

View File

@@ -415,6 +415,11 @@ 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(
@@ -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),