diff --git a/include/wx/mac/radiobut.h b/include/wx/mac/radiobut.h index 9de7a224c5..6a2c5b1c6a 100644 --- a/include/wx/mac/radiobut.h +++ b/include/wx/mac/radiobut.h @@ -22,38 +22,43 @@ WXDLLEXPORT_DATA(extern const char*) wxRadioButtonNameStr; class WXDLLEXPORT wxRadioButton: public wxControl { - DECLARE_DYNAMIC_CLASS(wxRadioButton) - protected: - public: - inline wxRadioButton() {} - inline wxRadioButton(wxWindow *parent, wxWindowID id, +public: + inline wxRadioButton() {} + inline wxRadioButton(wxWindow *parent, wxWindowID id, const wxString& label, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxRadioButtonNameStr) - { - Create(parent, id, label, pos, size, style, validator, name); - } + { + Create(parent, id, label, pos, size, style, validator, name); + } - bool Create(wxWindow *parent, wxWindowID id, + bool Create(wxWindow *parent, wxWindowID id, const wxString& label, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxRadioButtonNameStr); - virtual void SetValue(bool val); - virtual bool GetValue() const ; + virtual void SetValue(bool val); + virtual bool GetValue() const ; + // implementation + virtual void MacHandleControlClick( ControlHandle control , SInt16 controlpart ); - void Command(wxCommandEvent& event); - wxRadioButton *AddInCycle(wxRadioButton *cycle); - inline wxRadioButton *NextInCycle() {return m_cycle;} + void Command(wxCommandEvent& event); + wxRadioButton *AddInCycle(wxRadioButton *cycle); + inline wxRadioButton *NextInCycle() {return m_cycle;} + + void OnIdle( wxIdleEvent &event ); - protected: - - wxRadioButton *m_cycle; +protected: + wxRadioButton *m_cycle; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxRadioButton) }; // Not implemented diff --git a/src/mac/carbon/radiobut.cpp b/src/mac/carbon/radiobut.cpp index 9a93378c0c..1f5bb9c67a 100644 --- a/src/mac/carbon/radiobut.cpp +++ b/src/mac/carbon/radiobut.cpp @@ -15,9 +15,12 @@ #include "wx/radiobut.h" -#if !USE_SHARED_LIBRARY + IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl) -#endif + +BEGIN_EVENT_TABLE(wxRadioButton, wxControl) + EVT_IDLE( wxRadioButton::OnIdle ) +END_EVENT_TABLE() #include @@ -40,7 +43,53 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID id, MacPostControlCreate() ; - return TRUE; + return TRUE; +} + +void wxRadioButton::OnIdle( wxIdleEvent &event ) +{ + if (!m_cycle && HasFlag(wxRB_GROUP)) + { + // we are a stand-alone radiobutton and have + // the group flag indicating we have to collect + // the other radiobuttons belonging to this one + + bool reached_this = FALSE; + wxRadioButton *m_radioButtonCycle = NULL; + m_radioButtonCycle = AddInCycle( m_radioButtonCycle ); + + wxWindow *parent = GetParent(); + wxNode *node = parent->GetChildren().First(); + while (node) + { + wxWindow *child = (wxWindow*) node->Data(); + + node = node->Next(); + + // start searching behind current radiobutton + if (!reached_this) + { + reached_this = (this == child); + continue; + } + + if (child->IsKindOf( CLASSINFO ( wxRadioButton ) )) + { + wxRadioButton *rb = (wxRadioButton*) child; + + // already reached next group + if (rb->HasFlag(wxRB_GROUP)) break; + + // part of a radiobox + if (rb->NextInCycle()) break; + + m_radioButtonCycle = rb->AddInCycle( m_radioButtonCycle ); + } + } + + } + + event.Skip( TRUE ); } void wxRadioButton::SetValue(bool val) diff --git a/src/mac/radiobut.cpp b/src/mac/radiobut.cpp index 9a93378c0c..1f5bb9c67a 100644 --- a/src/mac/radiobut.cpp +++ b/src/mac/radiobut.cpp @@ -15,9 +15,12 @@ #include "wx/radiobut.h" -#if !USE_SHARED_LIBRARY + IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl) -#endif + +BEGIN_EVENT_TABLE(wxRadioButton, wxControl) + EVT_IDLE( wxRadioButton::OnIdle ) +END_EVENT_TABLE() #include @@ -40,7 +43,53 @@ bool wxRadioButton::Create(wxWindow *parent, wxWindowID id, MacPostControlCreate() ; - return TRUE; + return TRUE; +} + +void wxRadioButton::OnIdle( wxIdleEvent &event ) +{ + if (!m_cycle && HasFlag(wxRB_GROUP)) + { + // we are a stand-alone radiobutton and have + // the group flag indicating we have to collect + // the other radiobuttons belonging to this one + + bool reached_this = FALSE; + wxRadioButton *m_radioButtonCycle = NULL; + m_radioButtonCycle = AddInCycle( m_radioButtonCycle ); + + wxWindow *parent = GetParent(); + wxNode *node = parent->GetChildren().First(); + while (node) + { + wxWindow *child = (wxWindow*) node->Data(); + + node = node->Next(); + + // start searching behind current radiobutton + if (!reached_this) + { + reached_this = (this == child); + continue; + } + + if (child->IsKindOf( CLASSINFO ( wxRadioButton ) )) + { + wxRadioButton *rb = (wxRadioButton*) child; + + // already reached next group + if (rb->HasFlag(wxRB_GROUP)) break; + + // part of a radiobox + if (rb->NextInCycle()) break; + + m_radioButtonCycle = rb->AddInCycle( m_radioButtonCycle ); + } + } + + } + + event.Skip( TRUE ); } void wxRadioButton::SetValue(bool val)