]> git.saurik.com Git - wxWidgets.git/blame - src/univ/radiobut.cpp
Applied #15375 to stop event-sending in generic wxSpinCtrl ctor (eco)
[wxWidgets.git] / src / univ / radiobut.cpp
CommitLineData
1e6feb95 1/////////////////////////////////////////////////////////////////////////////
b0b5881a 2// Name: src/univ/radiobut.cpp
1e6feb95
VZ
3// Purpose: wxRadioButton implementation
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 10.09.00
442b35b5 7// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
65571936 8// Licence: wxWindows licence
1e6feb95
VZ
9/////////////////////////////////////////////////////////////////////////////
10
11// ============================================================================
12// declarations
13// ============================================================================
14
15// ----------------------------------------------------------------------------
16// headers
17// ----------------------------------------------------------------------------
18
1e6feb95
VZ
19#include "wx/wxprec.h"
20
21#ifdef __BORLANDC__
22 #pragma hdrstop
23#endif
24
25#if wxUSE_RADIOBTN
26
b0b5881a
WS
27#include "wx/radiobut.h"
28
1e6feb95
VZ
29#ifndef WX_PRECOMP
30 #include "wx/dcclient.h"
1e6feb95
VZ
31 #include "wx/validate.h"
32#endif
33
34#include "wx/univ/theme.h"
35#include "wx/univ/renderer.h"
36#include "wx/univ/inphand.h"
37#include "wx/univ/colschem.h"
38
39// ============================================================================
40// implementation
41// ============================================================================
42
1e6feb95
VZ
43// ----------------------------------------------------------------------------
44// wxRadioButton
45// ----------------------------------------------------------------------------
46
47bool wxRadioButton::Create(wxWindow *parent,
48 wxWindowID id,
49 const wxString &label,
50 const wxPoint &pos,
51 const wxSize &size,
52 long style,
53 const wxValidator& validator,
54 const wxString &name)
55{
56 if ( !wxCheckBox::Create(parent, id, label, pos, size, style,
61fef19b 57 validator, name) )
1e6feb95 58 {
a290fa5a 59 return false;
1e6feb95
VZ
60 }
61
a290fa5a 62 return true;
1e6feb95
VZ
63}
64
65// ----------------------------------------------------------------------------
66// radio button methods
67// ----------------------------------------------------------------------------
68
69void wxRadioButton::OnCheck()
70{
71 // clear all others radio buttons in our group: for this we need to
72 // find the radio button which is the first in the group, i.e. the one
73 // with wxRB_GROUP style
74 const wxWindowList& siblings = GetParent()->GetChildren();
ac32ba44 75 wxWindowList::compatibility_iterator nodeStart = siblings.Find(this);
1e6feb95
VZ
76 while ( nodeStart )
77 {
78 // stop if we found a radio button with wxRB_GROUP style or it we
79 // are at the first control
80 if ( !nodeStart->GetPrevious() ||
81 (nodeStart->GetData()->GetWindowStyle() & wxRB_GROUP) )
82 break;
83
84 nodeStart = nodeStart->GetPrevious();
85 }
86
87 // now clear all radio buttons from the starting one until the next
88 // one with wxRB_GROUP style
89 while ( nodeStart )
90 {
91 wxWindow *win = nodeStart->GetData();
92 if ( win != this )
93 {
94 wxRadioButton *btn = wxDynamicCast(win, wxRadioButton);
95 if ( btn )
96 {
97 btn->ClearValue();
98 }
99 }
100
101 nodeStart = nodeStart->GetNext();
102 if ( !nodeStart ||
103 (nodeStart->GetData()->GetWindowStyle() & wxRB_GROUP) )
104 {
105 // we reached the next group
106 break;
107 }
108 }
109}
110
111void wxRadioButton::ChangeValue(bool value)
112{
113 if ( value == IsChecked() )
114 return;
115
116 if ( !IsChecked() )
117 {
118 wxCheckBox::ChangeValue(value);
119 }
120 else // attempt to clear a radio button - this can't be done
121 {
122 // but still refresh as our PRESSED flag changed
123 Refresh();
124 }
125}
126
127void wxRadioButton::ClearValue()
128{
129 if ( IsChecked() )
130 {
a290fa5a 131 SetValue(false);
1e6feb95
VZ
132 }
133}
134
135void wxRadioButton::SendEvent()
136{
ce7fe42e 137 wxCommandEvent event(wxEVT_RADIOBUTTON, GetId());
1e6feb95
VZ
138 InitCommandEvent(event);
139 event.SetInt(IsChecked());
140 Command(event);
141}
142
143// ----------------------------------------------------------------------------
144// overridden wxCheckBox methods
145// ----------------------------------------------------------------------------
146
147wxSize wxRadioButton::GetBitmapSize() const
148{
149 wxBitmap bmp = GetBitmap(State_Normal, Status_Checked);
a1b806b9 150 return bmp.IsOk() ? wxSize(bmp.GetWidth(), bmp.GetHeight())
1e6feb95
VZ
151 : GetRenderer()->GetRadioBitmapSize();
152}
153
154void wxRadioButton::DoDraw(wxControlRenderer *renderer)
155{
156 wxDC& dc = renderer->GetDC();
157 dc.SetFont(GetFont());
158 dc.SetTextForeground(GetForegroundColour());
159
160 int flags = GetStateFlags();
161 Status status = GetStatus();
162 if ( status == Status_Checked )
163 flags |= wxCONTROL_CHECKED;
164
165 renderer->GetRenderer()->
166 DrawRadioButton(dc,
167 GetLabel(),
168 GetBitmap(GetState(flags), status),
169 renderer->GetRect(),
170 flags,
171 GetWindowStyle() & wxALIGN_RIGHT ? wxALIGN_RIGHT
172 : wxALIGN_LEFT,
173 GetAccelIndex());
174}
175
176#endif // wxUSE_RADIOBTN