From 3bfa7be9771e14a164116fa2081171bcab17814f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 29 Nov 2005 19:26:38 +0000 Subject: [PATCH] added wxRadioBox::IsItemEnabled/Shown() (for MSW only for now, other platforms to come); corrected Enable/Show() return values git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36288 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + docs/latex/wx/radiobox.tex | 39 ++++++++++++++++++++++ include/wx/msw/radiobox.h | 2 ++ include/wx/radiobox.h | 8 ++++- samples/widgets/radiobox.cpp | 64 +++++++++++++++++++++++++++++------- src/msw/radiobox.cpp | 29 ++++++++++++++-- 6 files changed, 127 insertions(+), 16 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 03bee532e7..f4016689ec 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -37,6 +37,7 @@ All (GUI): - Access to titles through Get/SetTitle is available now only for top level windows (wxDialog, wxFrame). - Fixed memory leak of pending events in wxEvtHandler +- Added wxRadioBox::IsItemEnabled/Shown() wxMSW: diff --git a/docs/latex/wx/radiobox.tex b/docs/latex/wx/radiobox.tex index 97b58b93da..9ac9d109b4 100644 --- a/docs/latex/wx/radiobox.tex +++ b/docs/latex/wx/radiobox.tex @@ -55,6 +55,7 @@ when a radiobutton is clicked.} \latexignore{\rtfignore{\wxheading{Members}}} + \membersection{wxRadioBox::wxRadioBox}\label{wxradioboxctor} \func{}{wxRadioBox}{\void} @@ -113,12 +114,14 @@ a list of strings.} \perlnote{In wxPerl there is just an array reference in place of {\tt n} and {\tt choices}.} + \membersection{wxRadioBox::\destruct{wxRadioBox}}\label{wxradioboxdtor} \func{}{\destruct{wxRadioBox}}{\void} Destructor, destroying the radiobox item. + \membersection{wxRadioBox::Create}\label{wxradioboxcreate} \func{bool}{Create}{\param{wxWindow* }{parent}, \param{wxWindowID }{id}, \param{const wxString\& }{label},\rtfsp @@ -138,6 +141,7 @@ Destructor, destroying the radiobox item. Creates the radiobox for two-step construction. See \helpref{wxRadioBox::wxRadioBox}{wxradioboxctor}\rtfsp for further details. + \membersection{wxRadioBox::Enable}\label{wxradioboxenable} \func{virtual bool}{Enable}{\param{bool}{ enable = {\tt true}}} @@ -168,6 +172,7 @@ individual button in the radiobox.} \helpref{wxWindow::Enable}{wxwindowenable} + \membersection{wxRadioBox::FindString}\label{wxradioboxfindstring} \constfunc{int}{FindString}{\param{const wxString\& }{string}} @@ -179,12 +184,14 @@ Finds a button matching the given string, returning the position if found, or \docparam{string}{The string to find.} + \membersection{wxRadioBox::GetCount}\label{wxradioboxgetcount} \constfunc{int}{GetCount}{\void} Returns the number of items in the radiobox. + \membersection{wxRadioBox::GetLabel}\label{wxradioboxgetlabel} \constfunc{wxString}{GetLabel}{\void} @@ -214,12 +221,14 @@ implements the following methods:\par Returns the zero-based position of the selected button. + \membersection{wxRadioBox::GetStringSelection}\label{wxradioboxgetstringselection} \constfunc{wxString}{GetStringSelection}{\void} Returns the selected string. + \membersection{wxRadioBox::GetString}\label{wxradioboxgetstring} \constfunc{wxString}{GetString}{\param{int}{ n}} @@ -230,6 +239,32 @@ Returns the label for the button at the given position. \docparam{n}{The zero-based button position.} + +\membersection{wxRadioBox::IsItemEnabled}\label{wxradioboxisitemenabled} + +\constfunc{bool}{IsItemEnabled}{\void} + +Returns \true if the item is enabled or \false if it was disabled using +\helpref{Enable(n, false)}{wxradioboxenable}. + +{\bf Platform note:} Currently only implemented in wxMSW and always returns +\true in the other ports. + + +\membersection{wxRadioBox::IsItemShown}\label{wxradioboxisitemshown} + +\constfunc{bool}{IsItemShown}{\void} + +Returns \true if the item is currently shown or \false if it was hidden using +\helpref{Show(n, false)}{wxradioboxshow}. + +Note that this function returns \true for an item which hadn't been hidden even +if the entire radiobox is not currently shown. + +{\bf Platform note:} Currently only implemented in wxMSW and always returns +\true in the other ports. + + \membersection{wxRadioBox::Number}\label{wxradioboxnumber} \constfunc{int}{Number}{\void} @@ -242,6 +277,7 @@ future versions. Returns the number of buttons in the radiobox. + \membersection{wxRadioBox::SetLabel}\label{wxradioboxsetlabel} \func{void}{SetLabel}{\param{const wxString\&}{ label}} @@ -263,6 +299,7 @@ implements the following methods:\par \end{twocollist}} } + \membersection{wxRadioBox::SetSelection}\label{wxradioboxsetselection} \func{void}{SetSelection}{\param{int}{ n}} @@ -274,6 +311,7 @@ a wxEVT\_COMMAND\_RADIOBOX\_SELECTED event to get emitted. \docparam{n}{The zero-based button position.} + \membersection{wxRadioBox::SetStringSelection}\label{wxradioboxsetstringselection} \func{void}{SetStringSelection}{\param{const wxString\& }{string}} @@ -285,6 +323,7 @@ a wxEVT\_COMMAND\_RADIOBOX\_SELECTED event to get emitted. \docparam{string}{The label of the button to select.} + \membersection{wxRadioBox::Show}\label{wxradioboxshow} \func{virtual bool}{Show}{\param{const bool}{ show = {\tt true}}} diff --git a/include/wx/msw/radiobox.h b/include/wx/msw/radiobox.h index b8ecc5d72b..e75b32dc31 100644 --- a/include/wx/msw/radiobox.h +++ b/include/wx/msw/radiobox.h @@ -90,6 +90,8 @@ public: virtual void SetString(int n, const wxString& label); virtual bool Enable(int n, bool enable = true); virtual bool Show(int n, bool show = true); + virtual bool IsItemEnabled(int n) const; + virtual bool IsItemShown(int n) const; virtual int GetColumnCount() const { return GetNumHor(); } virtual int GetRowCount() const { return GetNumVer(); } diff --git a/include/wx/radiobox.h b/include/wx/radiobox.h index 9014e239a4..61a4aacc93 100644 --- a/include/wx/radiobox.h +++ b/include/wx/radiobox.h @@ -27,10 +27,15 @@ extern WXDLLEXPORT_DATA(const wxChar*) wxRadioBoxNameStr; class WXDLLEXPORT wxRadioBoxBase : public wxItemContainerImmutable { public: - // change the individual radio button state + // change/query the individual radio button state virtual bool Enable(int n, bool enable = true) = 0; virtual bool Show(int n, bool show = true) = 0; + // NB: these functions are stubbed here for now but should become pure + // virtual once all ports implement them + virtual bool IsItemEnabled(int WXUNUSED(n)) const { return true; } + virtual bool IsItemShown(int WXUNUSED(n)) const { return true; } + // layout parameters virtual int GetColumnCount() const = 0; virtual int GetRowCount() const = 0; @@ -38,6 +43,7 @@ public: // return the item above/below/to the left/right of the given one int GetNextItem(int item, wxDirection dir, long style) const; + // deprecated functions // -------------------- diff --git a/samples/widgets/radiobox.cpp b/samples/widgets/radiobox.cpp index e72f49f06c..ddb8456084 100644 --- a/samples/widgets/radiobox.cpp +++ b/samples/widgets/radiobox.cpp @@ -56,8 +56,8 @@ enum RadioPage_Selection, RadioPage_Label, RadioPage_LabelBtn, - RadioPage_Enable2nd, - RadioPage_Show2nd, + RadioPage_EnableItem, + RadioPage_ShowItem, RadioPage_Radio }; @@ -73,6 +73,9 @@ enum static const unsigned int DEFAULT_NUM_ENTRIES = 12; static const unsigned int DEFAULT_MAJOR_DIM = 3; +// this item is enabled/disabled shown/hidden by the test checkboxes +static const int TEST_BUTTON = 1; + // ---------------------------------------------------------------------------- // RadioWidgetsPage // ---------------------------------------------------------------------------- @@ -96,9 +99,14 @@ protected: void OnButtonSelection(wxCommandEvent& event); void OnButtonSetLabel(wxCommandEvent& event); + void OnEnableItem(wxCommandEvent& event); + void OnShowItem(wxCommandEvent& event); + void OnUpdateUIReset(wxUpdateUIEvent& event); void OnUpdateUIUpdate(wxUpdateUIEvent& event); void OnUpdateUISelection(wxUpdateUIEvent& event); + void OnUpdateUIEnableItem(wxUpdateUIEvent& event); + void OnUpdateUIShowItem(wxUpdateUIEvent& event); // reset the wxRadioBox parameters void Reset(); @@ -111,8 +119,8 @@ protected: // the check/radio boxes for styles wxCheckBox *m_chkVert; - wxCheckBox *m_2ndEnabled; - wxCheckBox *m_2ndShown; + wxCheckBox *m_chkEnableItem; + wxCheckBox *m_chkShowItem; wxRadioBox *m_radioDir; // the gauge itself and the sizer it is in @@ -150,6 +158,12 @@ BEGIN_EVENT_TABLE(RadioWidgetsPage, WidgetsPage) EVT_RADIOBOX(RadioPage_Radio, RadioWidgetsPage::OnRadioBox) + EVT_CHECKBOX(RadioPage_EnableItem, RadioWidgetsPage::OnEnableItem) + EVT_CHECKBOX(RadioPage_ShowItem, RadioWidgetsPage::OnShowItem) + + EVT_UPDATE_UI(RadioPage_EnableItem, RadioWidgetsPage::OnUpdateUIEnableItem) + EVT_UPDATE_UI(RadioPage_ShowItem, RadioWidgetsPage::OnUpdateUIShowItem) + EVT_CHECKBOX(wxID_ANY, RadioWidgetsPage::OnCheckOrRadioBox) EVT_RADIOBOX(wxID_ANY, RadioWidgetsPage::OnCheckOrRadioBox) END_EVENT_TABLE() @@ -168,8 +182,8 @@ RadioWidgetsPage::RadioWidgetsPage(wxBookCtrlBase *book, // init everything m_chkVert = (wxCheckBox *)NULL; - m_2ndEnabled = (wxCheckBox *)NULL; - m_2ndShown = (wxCheckBox *)NULL; + m_chkEnableItem = (wxCheckBox *)NULL; + m_chkShowItem = (wxCheckBox *)NULL; m_textNumBtns = m_textLabelBtns = @@ -253,8 +267,12 @@ RadioWidgetsPage::RadioWidgetsPage(wxBookCtrlBase *book, &m_textLabelBtns); sizerMiddle->Add(sizerRow, 0, wxGROW | wxALL, 5); - m_2ndEnabled = CreateCheckBoxAndAddToSizer(sizerMiddle, _T("2nd item enabled")); - m_2ndShown = CreateCheckBoxAndAddToSizer(sizerMiddle, _T("2nd item shown")); + m_chkEnableItem = CreateCheckBoxAndAddToSizer(sizerMiddle, + _T("Disable &2nd item"), + RadioPage_EnableItem); + m_chkShowItem = CreateCheckBoxAndAddToSizer(sizerMiddle, + _T("Hide 2nd &item"), + RadioPage_ShowItem); // right pane wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL); @@ -287,8 +305,8 @@ void RadioWidgetsPage::Reset() m_textLabelBtns->SetValue(_T("item")); m_chkVert->SetValue(false); - m_2ndEnabled->SetValue(true); - m_2ndShown->SetValue(true); + m_chkEnableItem->SetValue(true); + m_chkShowItem->SetValue(true); m_radioDir->SetSelection(RadioDir_Default); } @@ -375,8 +393,8 @@ void RadioWidgetsPage::CreateRadio() m_sizerRadio->Add(m_radio, 1, wxGROW); m_sizerRadio->Layout(); - m_radio->Enable( 1 , m_2ndEnabled->GetValue() ); - m_radio->Show( 1 , m_2ndShown->GetValue() ); + m_chkEnableItem->SetValue(true); + m_chkEnableItem->SetValue(true); } // ---------------------------------------------------------------------------- @@ -433,6 +451,16 @@ void RadioWidgetsPage::OnButtonSelection(wxCommandEvent& WXUNUSED(event)) } } +void RadioWidgetsPage::OnEnableItem(wxCommandEvent& event) +{ + m_radio->Enable(TEST_BUTTON, event.IsChecked()); +} + +void RadioWidgetsPage::OnShowItem(wxCommandEvent& event) +{ + m_radio->Show(TEST_BUTTON, event.IsChecked()); +} + void RadioWidgetsPage::OnUpdateUIUpdate(wxUpdateUIEvent& event) { unsigned long n; @@ -471,4 +499,16 @@ void RadioWidgetsPage::OnUpdateUIReset(wxUpdateUIEvent& event) event.Enable(enable); } +void RadioWidgetsPage::OnUpdateUIEnableItem(wxUpdateUIEvent& event) +{ + event.SetText(m_radio->IsItemEnabled(TEST_BUTTON) ? _T("Disable &2nd item") + : _T("Enable &2nd item")); +} + +void RadioWidgetsPage::OnUpdateUIShowItem(wxUpdateUIEvent& event) +{ + event.SetText(m_radio->IsItemShown(TEST_BUTTON) ? _T("Hide 2nd &item") + : _T("Show 2nd &item")); +} + #endif // wxUSE_RADIOBOX diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index baeb42a491..5ee58e4365 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -410,7 +410,15 @@ bool wxRadioBox::Enable(int item, bool enable) BOOL ret = ::EnableWindow((*m_radioButtons)[item], enable); - return (ret == 0) == enable; + return (ret == 0) != enable; +} + +bool wxRadioBox::IsItemEnabled(int item) const +{ + wxCHECK_MSG( IsValid(item), false, + wxT("invalid item in wxRadioBox::Enable()") ); + + return ::IsWindowEnabled((*m_radioButtons)[item]) != 0; } // Show a specific button @@ -421,12 +429,27 @@ bool wxRadioBox::Show(int item, bool show) BOOL ret = ::ShowWindow((*m_radioButtons)[item], show ? SW_SHOW : SW_HIDE); - bool changed = (ret != 0) == show; - if( changed ) + bool changed = (ret != 0) != show; + if ( changed ) + { InvalidateBestSize(); + } + return changed; } +bool wxRadioBox::IsItemShown(int item) const +{ + wxCHECK_MSG( IsValid(item), false, + wxT("invalid item in wxRadioBox::Enable()") ); + + // don't use IsWindowVisible() here because it would return false if the + // radiobox itself is hidden while we want to only return false if this + // button specifically is hidden + return (::GetWindowLong((*m_radioButtons)[item], + GWL_STYLE) & WS_VISIBLE) != 0; +} + WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(wxRadioBox, wxStaticBox, m_radioButtons) // ---------------------------------------------------------------------------- -- 2.45.2