]>
Commit | Line | Data |
---|---|---|
e53b3d16 | 1 | ///////////////////////////////////////////////////////////////////////////// |
80fdcdb9 | 2 | // Name: src/osx/radiobut.cpp |
e53b3d16 SC |
3 | // Purpose: wxRadioButton |
4 | // Author: AUTHOR | |
5 | // Modified by: JS Lair (99/11/15) adding the cyclic group notion for radiobox | |
6 | // Created: ??/??/98 | |
e53b3d16 SC |
7 | // Copyright: (c) AUTHOR |
8 | // Licence: wxWindows licence | |
9 | ///////////////////////////////////////////////////////////////////////////// | |
10 | ||
11 | #include "wx/wxprec.h" | |
12 | ||
13 | #if wxUSE_RADIOBTN | |
14 | ||
15 | #include "wx/radiobut.h" | |
16 | #include "wx/osx/private.h" | |
17 | ||
e53b3d16 SC |
18 | bool wxRadioButton::Create( wxWindow *parent, |
19 | wxWindowID id, | |
20 | const wxString& label, | |
21 | const wxPoint& pos, | |
22 | const wxSize& size, | |
23 | long style, | |
24 | const wxValidator& validator, | |
25 | const wxString& name ) | |
d15694e8 SC |
26 | { |
27 | DontCreatePeer(); | |
28 | ||
e53b3d16 SC |
29 | if ( !wxControl::Create( parent, id, pos, size, style, validator, name ) ) |
30 | return false; | |
31 | ||
32 | m_labelOrig = m_label = label; | |
33 | ||
22756322 | 34 | SetPeer(wxWidgetImpl::CreateRadioButton( this, parent, id, label, pos, size, style, GetExtraStyle() )); |
e53b3d16 SC |
35 | |
36 | MacPostControlCreate( pos, size ); | |
37 | ||
38 | m_cycle = this; | |
39 | ||
40 | if (HasFlag( wxRB_GROUP )) | |
41 | { | |
42 | AddInCycle( NULL ); | |
43 | } | |
44 | else | |
45 | { | |
46 | // search backward for last group start | |
47 | wxRadioButton *chief = NULL; | |
48 | wxWindowList::compatibility_iterator node = parent->GetChildren().GetLast(); | |
49 | while (node) | |
50 | { | |
51 | wxWindow *child = node->GetData(); | |
52 | if (child->IsKindOf( CLASSINFO( wxRadioButton ) )) | |
53 | { | |
54 | chief = (wxRadioButton*)child; | |
55 | if (child->HasFlag( wxRB_GROUP )) | |
56 | break; | |
57 | } | |
58 | ||
59 | node = node->GetPrevious(); | |
60 | } | |
61 | ||
62 | AddInCycle( chief ); | |
63 | } | |
64 | ||
65 | return true; | |
66 | } | |
67 | ||
68 | wxRadioButton::~wxRadioButton() | |
69 | { | |
70 | RemoveFromCycle(); | |
71 | } | |
72 | ||
73 | void wxRadioButton::SetValue(bool val) | |
74 | { | |
75 | wxRadioButton *cycle; | |
22756322 | 76 | if (GetPeer()->GetValue() == val) |
e53b3d16 SC |
77 | return; |
78 | ||
22756322 | 79 | GetPeer()->SetValue( val ); |
e53b3d16 SC |
80 | if (val) |
81 | { | |
82 | cycle = this->NextInCycle(); | |
83 | if (cycle != NULL) | |
84 | { | |
85 | while (cycle != this) | |
86 | { | |
87 | cycle->SetValue( false ); | |
88 | cycle = cycle->NextInCycle(); | |
89 | } | |
90 | } | |
91 | } | |
92 | } | |
93 | ||
94 | bool wxRadioButton::GetValue() const | |
95 | { | |
22756322 | 96 | return GetPeer()->GetValue() != 0; |
e53b3d16 SC |
97 | } |
98 | ||
99 | void wxRadioButton::Command(wxCommandEvent& event) | |
100 | { | |
101 | SetValue( (event.GetInt() != 0) ); | |
102 | ProcessCommand( event ); | |
103 | } | |
104 | ||
0faf03bf | 105 | bool wxRadioButton::OSXHandleClicked( double WXUNUSED(timestampsec) ) |
e53b3d16 | 106 | { |
22756322 | 107 | if ( !GetPeer()->ButtonClickDidStateChange() ) |
524c47aa SC |
108 | { |
109 | // if already set -> no action | |
110 | if (GetValue()) | |
111 | return true; | |
112 | } | |
e53b3d16 SC |
113 | |
114 | wxRadioButton *cycle; | |
115 | cycle = this->NextInCycle(); | |
116 | if (cycle != NULL) | |
117 | { | |
118 | while (cycle != this) | |
119 | { | |
120 | if (cycle->GetValue()) | |
121 | cycle->SetValue( false ); | |
122 | ||
123 | cycle = cycle->NextInCycle(); | |
124 | } | |
125 | } | |
126 | ||
127 | SetValue( true ); | |
128 | ||
ce7fe42e | 129 | wxCommandEvent event2( wxEVT_RADIOBUTTON, m_windowId ); |
e53b3d16 SC |
130 | event2.SetEventObject( this ); |
131 | event2.SetInt( true ); | |
132 | ProcessCommand( event2 ); | |
133 | ||
134 | return true; | |
135 | } | |
136 | ||
137 | wxRadioButton *wxRadioButton::AddInCycle(wxRadioButton *cycle) | |
138 | { | |
139 | wxRadioButton *current; | |
140 | ||
141 | if (cycle == NULL) | |
142 | { | |
143 | m_cycle = this; | |
144 | } | |
145 | else | |
146 | { | |
147 | current = cycle; | |
148 | while (current->m_cycle != cycle) | |
149 | current = current->m_cycle; | |
150 | ||
151 | m_cycle = cycle; | |
152 | current->m_cycle = this; | |
153 | } | |
154 | ||
155 | return m_cycle; | |
156 | } | |
157 | ||
158 | void wxRadioButton::RemoveFromCycle() | |
03647350 | 159 | { |
e53b3d16 SC |
160 | if ((m_cycle == NULL) || (m_cycle == this)) |
161 | return; | |
162 | ||
163 | // Find the previous one and make it point to the next one | |
164 | wxRadioButton* prev = this; | |
165 | while (prev->m_cycle != this) | |
166 | prev = prev->m_cycle; | |
167 | ||
168 | prev->m_cycle = m_cycle; | |
169 | } | |
170 | ||
171 | #endif |