1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxRadioButton
5 // Modified by: JS Lair (99/11/15) adding the cyclic group notion for radiobox
8 // Copyright: (c) AUTHOR
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
16 #include "wx/radiobut.h"
17 #include "wx/mac/uma.h"
19 IMPLEMENT_DYNAMIC_CLASS(wxRadioButton
, wxControl
)
22 bool wxRadioButton::Create( wxWindow
*parent
,
24 const wxString
& label
,
28 const wxValidator
& validator
,
29 const wxString
& name
)
31 m_macIsUserPane
= false;
33 if ( !wxControl::Create( parent
, id
, pos
, size
, style
, validator
, name
) )
38 Rect bounds
= wxMacGetBoundsForControl( this, pos
, size
);
40 m_peer
= new wxMacControl( this );
41 OSStatus err
= CreateRadioButtonControl(
42 MAC_WXHWND(parent
->MacGetTopLevelWindowRef()), &bounds
, CFSTR(""),
43 0, false /* no autotoggle */, m_peer
->GetControlRefAddr() );
46 MacPostControlCreate( pos
, size
);
50 if (HasFlag( wxRB_GROUP
))
56 // search backward for last group start
57 wxRadioButton
*chief
= NULL
;
58 wxWindowList::compatibility_iterator node
= parent
->GetChildren().GetLast();
61 wxWindow
*child
= node
->GetData();
62 if (child
->IsKindOf( CLASSINFO( wxRadioButton
) ))
64 chief
= (wxRadioButton
*)child
;
65 if (child
->HasFlag( wxRB_GROUP
))
69 node
= node
->GetPrevious();
78 wxRadioButton::~wxRadioButton()
83 void wxRadioButton::SetValue(bool val
)
86 if (m_peer
->GetValue() == val
)
89 m_peer
->SetValue( val
);
92 cycle
= this->NextInCycle();
97 cycle
->SetValue( false );
98 cycle
= cycle
->NextInCycle();
104 bool wxRadioButton::GetValue() const
106 return m_peer
->GetValue();
109 void wxRadioButton::Command(wxCommandEvent
& event
)
111 SetValue( (event
.GetInt() != 0) );
112 ProcessCommand( event
);
115 wxInt32
wxRadioButton::MacControlHit( WXEVENTHANDLERREF
WXUNUSED(handler
), WXEVENTREF
WXUNUSED(event
) )
117 // if already set -> no action
121 wxRadioButton
*cycle
;
122 cycle
= this->NextInCycle();
125 while (cycle
!= this)
127 if (cycle
->GetValue())
128 cycle
->SetValue( false );
130 cycle
= cycle
->NextInCycle();
136 wxCommandEvent
event2( wxEVT_COMMAND_RADIOBUTTON_SELECTED
, m_windowId
);
137 event2
.SetEventObject( this );
138 event2
.SetInt( true );
139 ProcessCommand( event2
);
144 wxRadioButton
*wxRadioButton::AddInCycle(wxRadioButton
*cycle
)
146 wxRadioButton
*next
, *current
;
155 while ((next
= current
->m_cycle
) != cycle
)
156 current
= current
->m_cycle
;
159 current
->m_cycle
= this;
165 void wxRadioButton::RemoveFromCycle()
167 if ((m_cycle
== NULL
) || (m_cycle
== this))
170 // Find the previous one and make it point to the next one
171 wxRadioButton
* prev
= this;
172 while (prev
->m_cycle
!= this)
173 prev
= prev
->m_cycle
;
175 prev
->m_cycle
= m_cycle
;