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