it is not possible to show/hide the window from the UpdateUI event handler; refactored the code by moving control-specific parts into the derived classes (patch 1338350)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37536 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-02-12 16:32:50 +00:00
parent 27237c3708
commit a3a4105df6
10 changed files with 84 additions and 40 deletions

View File

@@ -27,7 +27,7 @@ functions that take a wxUpdateUIEvent argument.
\wxheading{Remarks} \wxheading{Remarks}
Without update UI events, an application has to work hard to check/uncheck, enable/disable, Without update UI events, an application has to work hard to check/uncheck, enable/disable,
and set the text for elements such as menu items and toolbar buttons. show/hide, and set the text for elements such as menu items and toolbar buttons.
The code for doing this has to be mixed up with the code that is invoked when The code for doing this has to be mixed up with the code that is invoked when
an action is invoked for a menu item or button. an action is invoked for a menu item or button.
@@ -116,6 +116,12 @@ Check or uncheck the UI element.
Enable or disable the UI element. Enable or disable the UI element.
\membersection{wxUpdateUIEvent::Show}\label{wxupdateuieventshow}
\func{void}{Show}{\param{bool}{ show}}
Show or hide the UI element.
\membersection{wxUpdateUIEvent::GetChecked}\label{wxupdateuieventgetchecked} \membersection{wxUpdateUIEvent::GetChecked}\label{wxupdateuieventgetchecked}
\constfunc{bool}{GetChecked}{\void} \constfunc{bool}{GetChecked}{\void}
@@ -128,6 +134,12 @@ Returns true if the UI element should be checked.
Returns true if the UI element should be enabled. Returns true if the UI element should be enabled.
\membersection{wxUpdateUIEvent::GetShown}\label{wxupdateuieventgetshown}
\constfunc{bool}{GetShown}{\void}
Returns true if the UI element should be shown.
\membersection{wxUpdateUIEvent::GetSetChecked}\label{wxupdateuieventgetsetchecked} \membersection{wxUpdateUIEvent::GetSetChecked}\label{wxupdateuieventgetsetchecked}
\constfunc{bool}{GetSetChecked}{\void} \constfunc{bool}{GetSetChecked}{\void}
@@ -140,6 +152,12 @@ Returns true if the application has called \helpref{wxUpdateUIEvent::Check}{wxup
Returns true if the application has called \helpref{wxUpdateUIEvent::Enable}{wxupdateuieventenable}. For wxWidgets internal use only. Returns true if the application has called \helpref{wxUpdateUIEvent::Enable}{wxupdateuieventenable}. For wxWidgets internal use only.
\membersection{wxUpdateUIEvent::GetSetShown}\label{wxupdateuieventgetsetshown}
\constfunc{bool}{GetSetShown}{\void}
Returns true if the application has called \helpref{wxUpdateUIEvent::Show}{wxupdateuieventshow}. For wxWidgets internal use only.
\membersection{wxUpdateUIEvent::GetSetText}\label{wxupdateuieventgetsettext} \membersection{wxUpdateUIEvent::GetSetText}\label{wxupdateuieventgetsettext}
\constfunc{bool}{GetSetText}{\void} \constfunc{bool}{GetSetText}{\void}

View File

@@ -108,6 +108,13 @@ public:
virtual bool HasTransparentBackground() { return true; } virtual bool HasTransparentBackground() { return true; }
// wxCheckBox-specific processing after processing the update event
virtual void DoUpdateWindowUI(wxUpdateUIEvent& event)
{
if ( event.GetSetChecked() )
SetValue(event.GetChecked());
}
protected: protected:
virtual void DoSet3StateValue(wxCheckBoxState WXUNUSED(state)) { wxFAIL; } virtual void DoSet3StateValue(wxCheckBoxState WXUNUSED(state)) { wxFAIL; }

View File

@@ -62,6 +62,9 @@ public:
virtual void SetLabel( const wxString &label ); virtual void SetLabel( const wxString &label );
virtual bool SetFont(const wxFont& font); virtual bool SetFont(const wxFont& font);
// wxControl-specific processing after processing the update event
virtual void DoUpdateWindowUI(wxUpdateUIEvent& event);
// Reserved for future use // Reserved for future use
virtual void ReservedControlFunc1() {} virtual void ReservedControlFunc1() {}
virtual void ReservedControlFunc2() {} virtual void ReservedControlFunc2() {}

View File

@@ -1667,7 +1667,9 @@ public:
{ {
m_checked = m_checked =
m_enabled = m_enabled =
m_shown =
m_setEnabled = m_setEnabled =
m_setShown =
m_setText = m_setText =
m_setChecked = false; m_setChecked = false;
} }
@@ -1675,7 +1677,9 @@ public:
: wxCommandEvent(event), : wxCommandEvent(event),
m_checked(event.m_checked), m_checked(event.m_checked),
m_enabled(event.m_enabled), m_enabled(event.m_enabled),
m_shown(event.m_shown),
m_setEnabled(event.m_setEnabled), m_setEnabled(event.m_setEnabled),
m_setShown(event.m_setShown),
m_setText(event.m_setText), m_setText(event.m_setText),
m_setChecked(event.m_setChecked), m_setChecked(event.m_setChecked),
m_text(event.m_text) m_text(event.m_text)
@@ -1683,13 +1687,16 @@ public:
bool GetChecked() const { return m_checked; } bool GetChecked() const { return m_checked; }
bool GetEnabled() const { return m_enabled; } bool GetEnabled() const { return m_enabled; }
bool GetShown() const { return m_shown; }
wxString GetText() const { return m_text; } wxString GetText() const { return m_text; }
bool GetSetText() const { return m_setText; } bool GetSetText() const { return m_setText; }
bool GetSetChecked() const { return m_setChecked; } bool GetSetChecked() const { return m_setChecked; }
bool GetSetEnabled() const { return m_setEnabled; } bool GetSetEnabled() const { return m_setEnabled; }
bool GetSetShown() const { return m_setShown; }
void Check(bool check) { m_checked = check; m_setChecked = true; } void Check(bool check) { m_checked = check; m_setChecked = true; }
void Enable(bool enable) { m_enabled = enable; m_setEnabled = true; } void Enable(bool enable) { m_enabled = enable; m_setEnabled = true; }
void Show(bool show) { m_shown = show; m_setShown = true; }
void SetText(const wxString& text) { m_text = text; m_setText = true; } void SetText(const wxString& text) { m_text = text; m_setText = true; }
// Sets the interval between updates in milliseconds. // Sets the interval between updates in milliseconds.
@@ -1719,7 +1726,9 @@ public:
protected: protected:
bool m_checked; bool m_checked;
bool m_enabled; bool m_enabled;
bool m_shown;
bool m_setEnabled; bool m_setEnabled;
bool m_setShown;
bool m_setText; bool m_setText;
bool m_setChecked; bool m_setChecked;
wxString m_text; wxString m_text;

View File

@@ -607,7 +607,10 @@ public:
void InitCommandEvent(wxCommandEvent& event) const; void InitCommandEvent(wxCommandEvent& event) const;
/// do the window-specific processing after processing the update event /// do the window-specific processing after processing the update event
// (duplicated code from wxTextCtrlBase)
#if !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); virtual void DoUpdateWindowUI(wxUpdateUIEvent& event);
#endif
/// Should we inherit colours? /// Should we inherit colours?
virtual bool ShouldInheritColours() const { return false; } virtual bool ShouldInheritColours() const { return false; }

View File

@@ -124,6 +124,32 @@ bool wxControlBase::SetFont(const wxFont& font)
return wxWindow::SetFont(font); return wxWindow::SetFont(font);
} }
// wxControl-specific processing after processing the update event
void wxControlBase::DoUpdateWindowUI(wxUpdateUIEvent& event)
{
// call inherited
wxWindowBase::DoUpdateWindowUI(event);
// update label
if ( event.GetSetText() )
{
if ( event.GetText() != GetLabel() )
SetLabel(event.GetText());
}
// Unfortunately we don't yet have common base class for
// wxRadioButton, so we handle updates of radiobuttons here.
// TODO: If once wxRadioButtonBase will exist, move this code there.
#if wxUSE_RADIOBTN
if ( event.GetSetChecked() )
{
wxRadioButton *radiobtn = wxDynamicCastThis(wxRadioButton);
if ( radiobtn )
radiobtn->SetValue(event.GetChecked());
}
#endif // wxUSE_RADIOBTN
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxStaticBitmap // wxStaticBitmap
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -471,9 +471,12 @@ wxString wxTextCtrlBase::GetRange(long from, long to) const
// do the window-specific processing after processing the update event // do the window-specific processing after processing the update event
void wxTextCtrlBase::DoUpdateWindowUI(wxUpdateUIEvent& event) void wxTextCtrlBase::DoUpdateWindowUI(wxUpdateUIEvent& event)
{ {
if ( event.GetSetEnabled() ) // call inherited, but skip the wxControl's version, and call directly the
Enable(event.GetEnabled()); // wxWindow's one instead, because the only reason why we are overriding this
// function is that we want to use SetValue() instead of wxControl::SetLabel()
wxWindowBase::DoUpdateWindowUI(event);
// update text
if ( event.GetSetText() ) if ( event.GetSetText() )
{ {
if ( event.GetText() != GetValue() ) if ( event.GetText() != GetValue() )

View File

@@ -288,9 +288,12 @@ bool wxTopLevelWindowBase::SendIconizeEvent(bool iconized)
// do the window-specific processing after processing the update event // do the window-specific processing after processing the update event
void wxTopLevelWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event) void wxTopLevelWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event)
{ {
if ( event.GetSetEnabled() ) // call inherited, but skip the wxControl's version, and call directly the
Enable(event.GetEnabled()); // wxWindow's one instead, because the only reason why we are overriding this
// function is that we want to use SetTitle() instead of wxControl::SetLabel()
wxWindowBase::DoUpdateWindowUI(event);
// update title
if ( event.GetSetText() ) if ( event.GetSetText() )
{ {
if ( event.GetText() != GetTitle() ) if ( event.GetText() != GetTitle() )

View File

@@ -1992,44 +1992,13 @@ void wxWindowBase::UpdateWindowUI(long flags)
} }
// do the window-specific processing after processing the update event // do the window-specific processing after processing the update event
// TODO: take specific knowledge out of this function and
// put in each control's base class. Unfortunately we don't
// yet have base implementation files for wxCheckBox and wxRadioButton.
void wxWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event) void wxWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event)
{ {
if ( event.GetSetEnabled() ) if ( event.GetSetEnabled() )
Enable(event.GetEnabled()); Enable(event.GetEnabled());
#if wxUSE_CONTROLS if ( event.GetSetShown() )
if ( event.GetSetText() ) Show(event.GetShown());
{
wxControl *control = wxDynamicCastThis(wxControl);
if ( control )
{
if ( event.GetText() != control->GetLabel() )
control->SetLabel(event.GetText());
}
}
#endif // wxUSE_CONTROLS
if ( event.GetSetChecked() )
{
#if wxUSE_CHECKBOX
wxCheckBox *checkbox = wxDynamicCastThis(wxCheckBox);
if ( checkbox )
{
checkbox->SetValue(event.GetChecked());
}
#endif // wxUSE_CHECKBOX
#if wxUSE_RADIOBTN
wxRadioButton *radiobtn = wxDynamicCastThis(wxRadioButton);
if ( radiobtn )
{
radiobtn->SetValue(event.GetChecked());
}
#endif // wxUSE_RADIOBTN
}
} }
#if 0 #if 0

View File

@@ -1581,17 +1581,20 @@ wxString wxRichTextCtrl::GetStringSelection() const
} }
// do the window-specific processing after processing the update event // do the window-specific processing after processing the update event
#if !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
void wxRichTextCtrl::DoUpdateWindowUI(wxUpdateUIEvent& event) void wxRichTextCtrl::DoUpdateWindowUI(wxUpdateUIEvent& event)
{ {
if ( event.GetSetEnabled() ) // call inherited
Enable(event.GetEnabled()); wxWindowBase::DoUpdateWindowUI(event);
// update text
if ( event.GetSetText() ) if ( event.GetSetText() )
{ {
if ( event.GetText() != GetValue() ) if ( event.GetText() != GetValue() )
SetValue(event.GetText()); SetValue(event.GetText());
} }
} }
#endif // !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// hit testing // hit testing