From: David Elliott Date: Mon, 18 Aug 2003 18:27:48 +0000 (+0000) Subject: * Implement GetValue() and SetValue(). X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/d0a5e34a0838a4bff109a58644539bf72243e65b?ds=sidebyside * Implement GetValue() and SetValue(). * Send event when clicked. * Implement radio button grouping. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22996 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/cocoa/radiobut.h b/include/wx/cocoa/radiobut.h index 0dbf288c90..4a0be4f61e 100644 --- a/include/wx/cocoa/radiobut.h +++ b/include/wx/cocoa/radiobut.h @@ -14,6 +14,10 @@ #include "wx/cocoa/NSButton.h" +class WXDLLEXPORT wxRadioButton; + +WX_DECLARE_LIST(wxRadioButton, wxRadioButtonList); + // ======================================================================== // wxRadioButton // ======================================================================== @@ -26,7 +30,7 @@ class WXDLLEXPORT wxRadioButton: public wxControl, protected wxCocoaNSButton // initialization // ------------------------------------------------------------------------ public: - wxRadioButton() { } + wxRadioButton() { m_radioMaster = NULL; } wxRadioButton(wxWindow *parent, wxWindowID winid, const wxString& label, const wxPoint& pos = wxDefaultPosition, @@ -58,6 +62,9 @@ protected: public: virtual void SetValue(bool); virtual bool GetValue() const; +protected: + wxRadioButtonList m_radioSlaves; + wxRadioButton *m_radioMaster; }; #endif // __WX_COCOA_RADIOBUT_H__ diff --git a/src/cocoa/radiobut.mm b/src/cocoa/radiobut.mm index 2ee422760d..a4d9d46d5e 100644 --- a/src/cocoa/radiobut.mm +++ b/src/cocoa/radiobut.mm @@ -17,6 +17,10 @@ #include "wx/cocoa/string.h" #include "wx/cocoa/autorelease.h" +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST(wxRadioButtonList); + IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl) // wxRadioButtonBase == wxControl BEGIN_EVENT_TABLE(wxRadioButton, wxControl) @@ -32,8 +36,36 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID winid, const wxString& name) { wxAutoNSAutoreleasePool pool; + m_radioMaster = NULL; if(!CreateControl(parent,winid,pos,size,style,validator,name)) return false; + if(style&wxRB_GROUP) + { + m_radioMaster = this; + m_radioSlaves.Append(this); + } + else if(style&wxRB_SINGLE) + m_radioMaster = NULL; + else + { + for(wxWindowList::compatibility_iterator siblingNode= GetParent()->GetChildren().GetLast(); + siblingNode; + siblingNode = siblingNode->GetPrevious()) + { + wxRadioButton *radioButton = wxDynamicCast(siblingNode->GetData(),wxRadioButton); + if(radioButton && radioButton!=this) + { + m_radioMaster = radioButton->m_radioMaster; + wxASSERT_MSG(m_radioMaster, + "Previous radio button should be part of a group"); + // Don't crash, assume user meant wxRB_SINGLE + if(m_radioMaster) + m_radioMaster->m_radioSlaves.Append(this); + break; + } + } + } + m_cocoaNSView = NULL; SetNSButton([[NSButton alloc] initWithFrame: MakeDefaultNSRect(size)]); [m_cocoaNSView release]; @@ -50,20 +82,73 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID winid, wxRadioButton::~wxRadioButton() { + if(m_radioMaster==this) + { + // First get rid of ourselves (we should ALWAYS be at the head) + wxRadioButtonList::compatibility_iterator slaveNode = + m_radioSlaves.GetFirst(); + wxASSERT(slaveNode); + wxASSERT(slaveNode->GetData() == this); + m_radioSlaves.DeleteNode(slaveNode); + + // Now find the new master + wxRadioButton *newMaster = NULL; + slaveNode = m_radioSlaves.GetFirst(); + if(slaveNode) + newMaster = slaveNode->GetData(); + + // For each node (including the new master) set the master, remove + // it from this list, and add it to the new master's list + for(; slaveNode; slaveNode = m_radioSlaves.GetFirst()) + { + wxRadioButton *radioButton = slaveNode->GetData(); + wxASSERT(radioButton->m_radioMaster == this); + radioButton->m_radioMaster = newMaster; + newMaster->m_radioSlaves.Append(radioButton); + m_radioSlaves.DeleteNode(slaveNode); + } + } + else if(m_radioMaster) + { + m_radioMaster->m_radioSlaves.DeleteObject(this); + m_radioMaster = NULL; + } + // normal stuff DisassociateNSButton(m_cocoaNSView); } -void wxRadioButton::SetValue(bool) +void wxRadioButton::SetValue(bool value) { + if(value) + [GetNSButton() setState: NSOnState]; + else + [GetNSButton() setState: NSOffState]; } bool wxRadioButton::GetValue() const { - return false; + int state = [GetNSButton() state]; + wxASSERT(state!=NSMixedState); + return state==NSOnState; } void wxRadioButton::Cocoa_wxNSButtonAction(void) { wxLogDebug("wxRadioButton"); + if(m_radioMaster && ([GetNSButton() state] == NSOnState)) + { + for(wxRadioButtonList::compatibility_iterator slaveNode = + m_radioMaster->m_radioSlaves.GetFirst(); + slaveNode; slaveNode = slaveNode->GetNext()) + { + wxRadioButton *radioButton = slaveNode->GetData(); + if(radioButton!=this) + radioButton->SetValue(false); + } + } + wxCommandEvent event(wxEVT_COMMAND_RADIOBUTTON_SELECTED, GetId()); + InitCommandEvent(event); // event.SetEventObject(this); + event.SetInt(GetValue()); + Command(event); }