From a3a4105df6f49ff2e2d351bd76e2a42b7b4da34b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 12 Feb 2006 16:32:50 +0000 Subject: [PATCH] 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 --- docs/latex/wx/upduievt.tex | 20 ++++++++++++++++- include/wx/checkbox.h | 7 ++++++ include/wx/control.h | 3 +++ include/wx/event.h | 9 ++++++++ include/wx/richtext/richtextctrl.h | 3 +++ src/common/ctrlcmn.cpp | 26 ++++++++++++++++++++++ src/common/textcmn.cpp | 7 ++++-- src/common/toplvcmn.cpp | 7 ++++-- src/common/wincmn.cpp | 35 ++---------------------------- src/richtext/richtextctrl.cpp | 7 ++++-- 10 files changed, 84 insertions(+), 40 deletions(-) diff --git a/docs/latex/wx/upduievt.tex b/docs/latex/wx/upduievt.tex index d4673f24f5..aea947ee53 100644 --- a/docs/latex/wx/upduievt.tex +++ b/docs/latex/wx/upduievt.tex @@ -27,7 +27,7 @@ functions that take a wxUpdateUIEvent argument. \wxheading{Remarks} 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 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. +\membersection{wxUpdateUIEvent::Show}\label{wxupdateuieventshow} + +\func{void}{Show}{\param{bool}{ show}} + +Show or hide the UI element. + \membersection{wxUpdateUIEvent::GetChecked}\label{wxupdateuieventgetchecked} \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. +\membersection{wxUpdateUIEvent::GetShown}\label{wxupdateuieventgetshown} + +\constfunc{bool}{GetShown}{\void} + +Returns true if the UI element should be shown. + \membersection{wxUpdateUIEvent::GetSetChecked}\label{wxupdateuieventgetsetchecked} \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. +\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} \constfunc{bool}{GetSetText}{\void} diff --git a/include/wx/checkbox.h b/include/wx/checkbox.h index 8eea49bcab..930d3d8e71 100644 --- a/include/wx/checkbox.h +++ b/include/wx/checkbox.h @@ -108,6 +108,13 @@ public: 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: virtual void DoSet3StateValue(wxCheckBoxState WXUNUSED(state)) { wxFAIL; } diff --git a/include/wx/control.h b/include/wx/control.h index 8d83d13564..c5b425e7e8 100644 --- a/include/wx/control.h +++ b/include/wx/control.h @@ -62,6 +62,9 @@ public: virtual void SetLabel( const wxString &label ); virtual bool SetFont(const wxFont& font); + // wxControl-specific processing after processing the update event + virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); + // Reserved for future use virtual void ReservedControlFunc1() {} virtual void ReservedControlFunc2() {} diff --git a/include/wx/event.h b/include/wx/event.h index 7a25b6a4e0..be29607ecb 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -1667,7 +1667,9 @@ public: { m_checked = m_enabled = + m_shown = m_setEnabled = + m_setShown = m_setText = m_setChecked = false; } @@ -1675,7 +1677,9 @@ public: : wxCommandEvent(event), m_checked(event.m_checked), m_enabled(event.m_enabled), + m_shown(event.m_shown), m_setEnabled(event.m_setEnabled), + m_setShown(event.m_setShown), m_setText(event.m_setText), m_setChecked(event.m_setChecked), m_text(event.m_text) @@ -1683,13 +1687,16 @@ public: bool GetChecked() const { return m_checked; } bool GetEnabled() const { return m_enabled; } + bool GetShown() const { return m_shown; } wxString GetText() const { return m_text; } bool GetSetText() const { return m_setText; } bool GetSetChecked() const { return m_setChecked; } bool GetSetEnabled() const { return m_setEnabled; } + bool GetSetShown() const { return m_setShown; } void Check(bool check) { m_checked = check; m_setChecked = 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; } // Sets the interval between updates in milliseconds. @@ -1719,7 +1726,9 @@ public: protected: bool m_checked; bool m_enabled; + bool m_shown; bool m_setEnabled; + bool m_setShown; bool m_setText; bool m_setChecked; wxString m_text; diff --git a/include/wx/richtext/richtextctrl.h b/include/wx/richtext/richtextctrl.h index e9425ea376..43f1ad5149 100644 --- a/include/wx/richtext/richtextctrl.h +++ b/include/wx/richtext/richtextctrl.h @@ -607,7 +607,10 @@ public: void InitCommandEvent(wxCommandEvent& event) const; /// do the window-specific processing after processing the update event + // (duplicated code from wxTextCtrlBase) +#if !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); +#endif /// Should we inherit colours? virtual bool ShouldInheritColours() const { return false; } diff --git a/src/common/ctrlcmn.cpp b/src/common/ctrlcmn.cpp index ece152edaa..380ff6ab5b 100644 --- a/src/common/ctrlcmn.cpp +++ b/src/common/ctrlcmn.cpp @@ -124,6 +124,32 @@ bool wxControlBase::SetFont(const wxFont& 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 // ---------------------------------------------------------------------------- diff --git a/src/common/textcmn.cpp b/src/common/textcmn.cpp index 7d3c268389..a88d7f210b 100644 --- a/src/common/textcmn.cpp +++ b/src/common/textcmn.cpp @@ -471,9 +471,12 @@ wxString wxTextCtrlBase::GetRange(long from, long to) const // do the window-specific processing after processing the update event void wxTextCtrlBase::DoUpdateWindowUI(wxUpdateUIEvent& event) { - if ( event.GetSetEnabled() ) - Enable(event.GetEnabled()); + // call inherited, but skip the wxControl's version, and call directly the + // 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.GetText() != GetValue() ) diff --git a/src/common/toplvcmn.cpp b/src/common/toplvcmn.cpp index f69ac1e021..c519fbc7c9 100644 --- a/src/common/toplvcmn.cpp +++ b/src/common/toplvcmn.cpp @@ -288,9 +288,12 @@ bool wxTopLevelWindowBase::SendIconizeEvent(bool iconized) // do the window-specific processing after processing the update event void wxTopLevelWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event) { - if ( event.GetSetEnabled() ) - Enable(event.GetEnabled()); + // call inherited, but skip the wxControl's version, and call directly the + // 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.GetText() != GetTitle() ) diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 19ee280fe2..7b458dca63 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -1992,44 +1992,13 @@ void wxWindowBase::UpdateWindowUI(long flags) } // 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) { if ( event.GetSetEnabled() ) Enable(event.GetEnabled()); -#if wxUSE_CONTROLS - if ( event.GetSetText() ) - { - 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 ( event.GetSetShown() ) + Show(event.GetShown()); } #if 0 diff --git a/src/richtext/richtextctrl.cpp b/src/richtext/richtextctrl.cpp index 80d59be6ff..04712e5991 100644 --- a/src/richtext/richtextctrl.cpp +++ b/src/richtext/richtextctrl.cpp @@ -1581,17 +1581,20 @@ wxString wxRichTextCtrl::GetStringSelection() const } // do the window-specific processing after processing the update event +#if !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE void wxRichTextCtrl::DoUpdateWindowUI(wxUpdateUIEvent& event) { - if ( event.GetSetEnabled() ) - Enable(event.GetEnabled()); + // call inherited + wxWindowBase::DoUpdateWindowUI(event); + // update text if ( event.GetSetText() ) { if ( event.GetText() != GetValue() ) SetValue(event.GetText()); } } +#endif // !wxRICHTEXT_DERIVES_FROM_TEXTCTRLBASE // ---------------------------------------------------------------------------- // hit testing -- 2.45.2