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