]> git.saurik.com Git - wxWidgets.git/blame - samples/widgets/button.cpp
don't crash when invalid colour is set as fg/bg colour
[wxWidgets.git] / samples / widgets / button.cpp
CommitLineData
32b8ec41
VZ
1/////////////////////////////////////////////////////////////////////////////
2// Program: wxWindows Widgets Sample
3// Name: button.cpp
4// Purpose: Part of the widgets sample showing wxButton
5// Author: Vadim Zeitlin
6// Created: 10.04.01
7// Id: $Id$
8// Copyright: (c) 2001 Vadim Zeitlin
9// License: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// for compilers that support precompilation, includes "wx/wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27// for all others, include the necessary headers
28#ifndef WX_PRECOMP
3379ed37 29 #include "wx/app.h"
32b8ec41
VZ
30 #include "wx/log.h"
31
32 #include "wx/button.h"
33 #include "wx/checkbox.h"
34 #include "wx/radiobox.h"
35 #include "wx/statbox.h"
36 #include "wx/textctrl.h"
37#endif
38
39#include "wx/sizer.h"
40
41#include "widgets.h"
42
43#include "icons/button.xpm"
44
45// ----------------------------------------------------------------------------
46// constants
47// ----------------------------------------------------------------------------
48
49// control ids
50enum
51{
52 ButtonPage_Reset = 100,
53 ButtonPage_ChangeLabel,
54 ButtonPage_Button
55};
56
57// radio boxes
58enum
59{
60 ButtonHAlign_Left,
61 ButtonHAlign_Centre,
62 ButtonHAlign_Right
63};
64
65enum
66{
67 ButtonVAlign_Top,
68 ButtonVAlign_Centre,
69 ButtonVAlign_Bottom
70};
71
72// ----------------------------------------------------------------------------
73// ButtonWidgetsPage
74// ----------------------------------------------------------------------------
75
76class ButtonWidgetsPage : public WidgetsPage
77{
78public:
79 ButtonWidgetsPage(wxNotebook *notebook, wxImageList *imaglist);
80 virtual ~ButtonWidgetsPage();
81
82protected:
83 // event handlers
84 void OnCheckOrRadioBox(wxCommandEvent& event);
85
86 void OnButton(wxCommandEvent& event);
87 void OnButtonReset(wxCommandEvent& event);
88 void OnButtonChangeLabel(wxCommandEvent& event);
89
90 // reset the wxButton parameters
91 void Reset();
92
93 // (re)create the wxButton
94 void CreateButton();
95
96 // the controls
97 // ------------
98
99 // the check/radio boxes for styles
100 wxCheckBox *m_chkImage,
101 *m_chkFit,
102 *m_chkDefault;
103
104 wxRadioBox *m_radioHAlign,
105 *m_radioVAlign;
106
107 // the gauge itself and the sizer it is in
108 wxButton *m_button;
109 wxSizer *m_sizerButton;
110
111 // the text entries for command parameters
112 wxTextCtrl *m_textLabel;
113
114private:
115 DECLARE_EVENT_TABLE();
116 DECLARE_WIDGETS_PAGE(ButtonWidgetsPage);
117};
118
119// ----------------------------------------------------------------------------
120// event tables
121// ----------------------------------------------------------------------------
122
123BEGIN_EVENT_TABLE(ButtonWidgetsPage, WidgetsPage)
124 EVT_BUTTON(ButtonPage_Button, ButtonWidgetsPage::OnButton)
125
126 EVT_BUTTON(ButtonPage_Reset, ButtonWidgetsPage::OnButtonReset)
127 EVT_BUTTON(ButtonPage_ChangeLabel, ButtonWidgetsPage::OnButtonChangeLabel)
128
129 EVT_CHECKBOX(-1, ButtonWidgetsPage::OnCheckOrRadioBox)
130 EVT_RADIOBOX(-1, ButtonWidgetsPage::OnCheckOrRadioBox)
131END_EVENT_TABLE()
132
133// ============================================================================
134// implementation
135// ============================================================================
136
137IMPLEMENT_WIDGETS_PAGE(ButtonWidgetsPage, _T("Button"));
138
139ButtonWidgetsPage::ButtonWidgetsPage(wxNotebook *notebook,
140 wxImageList *imaglist)
141 : WidgetsPage(notebook)
142{
143 imaglist->Add(wxBitmap(button_xpm));
144
145 // init everything
146 m_chkImage =
147 m_chkFit =
148 m_chkDefault = (wxCheckBox *)NULL;
149
150 m_radioHAlign =
151 m_radioVAlign = (wxRadioBox *)NULL;
152
153 m_textLabel = (wxTextCtrl *)NULL;
154
155 m_button = (wxButton *)NULL;
156 m_sizerButton = (wxSizer *)NULL;
157
158 wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
159
160 // left pane
161 wxStaticBox *box = new wxStaticBox(this, -1, _T("&Set style"));
162
163 wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
164
165 m_chkImage = CreateCheckBoxAndAddToSizer(sizerLeft, _T("With &image"));
166 m_chkFit = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Fit exactly"));
167 m_chkDefault = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Default"));
168
169#ifndef __WXUNIVERSAL__
170 // only wxUniv currently supoprts buttons with images
171 m_chkImage->Disable();
172#endif // !wxUniv
173
174 sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
175
176 // should be in sync with enums Button[HV]Align!
177 static const wxString halign[] =
178 {
179 _T("left"),
180 _T("centre"),
181 _T("right"),
182 };
183
184 static const wxString valign[] =
185 {
186 _T("top"),
187 _T("centre"),
188 _T("bottom"),
189 };
190
191 m_radioHAlign = new wxRadioBox(this, -1, _T("&Horz alignment"),
192 wxDefaultPosition, wxDefaultSize,
193 WXSIZEOF(halign), halign);
194 m_radioVAlign = new wxRadioBox(this, -1, _T("&Vert alignment"),
195 wxDefaultPosition, wxDefaultSize,
196 WXSIZEOF(valign), valign);
197
198 sizerLeft->Add(m_radioHAlign, 0, wxGROW | wxALL, 5);
199 sizerLeft->Add(m_radioVAlign, 0, wxGROW | wxALL, 5);
200
201 sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
202
203 wxButton *btn = new wxButton(this, ButtonPage_Reset, _T("&Reset"));
204 sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
205
206 // middle pane
207 wxStaticBox *box2 = new wxStaticBox(this, -1, _T("&Operations"));
208 wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
209
210 wxSizer *sizerRow = CreateSizerWithTextAndButton(ButtonPage_ChangeLabel,
211 _T("Change label"),
212 -1,
213 &m_textLabel);
214
215 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
216
217 // right pane
218 wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL);
219 m_button = new wxButton(this, ButtonPage_Button, _T("&Press me!"));
220 sizerRight->Add(0, 0, 1, wxCENTRE);
221 sizerRight->Add(m_button, 1, wxCENTRE);
222 sizerRight->Add(0, 0, 1, wxCENTRE);
223 sizerRight->SetMinSize(250, 0);
224 m_sizerButton = sizerRight; // save it to modify it later
225
226 // the 3 panes panes compose the window
227 sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
228 sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
229 sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
230
231 // final initializations
232 Reset();
233
234 SetAutoLayout(TRUE);
235 SetSizer(sizerTop);
236
237 sizerTop->Fit(this);
238}
239
240ButtonWidgetsPage::~ButtonWidgetsPage()
241{
242}
243
244// ----------------------------------------------------------------------------
245// operations
246// ----------------------------------------------------------------------------
247
248void ButtonWidgetsPage::Reset()
249{
250 m_chkFit->SetValue(TRUE);
251 m_chkImage->SetValue(FALSE);
252 m_chkDefault->SetValue(FALSE);
253
254 m_radioHAlign->SetSelection(ButtonHAlign_Centre);
255 m_radioVAlign->SetSelection(ButtonVAlign_Centre);
256}
257
258void ButtonWidgetsPage::CreateButton()
259{
260 wxString label;
261 if ( m_button )
262 {
263 label = m_button->GetLabel();
264
265 size_t count = m_sizerButton->GetChildren().GetCount();
266 for ( size_t n = 0; n < count; n++ )
267 {
268 m_sizerButton->Remove(0);
269 }
270
271 delete m_button;
272 }
273 else
274 {
275 label = _T("&Press me!");
276 }
277
278 int flags = 0;
279 switch ( m_radioHAlign->GetSelection() )
280 {
281 case ButtonHAlign_Left:
282 flags |= wxALIGN_LEFT;
283 break;
284
285 default:
286 wxFAIL_MSG(_T("unexpected radiobox selection"));
287 // fall through
288
289 case ButtonHAlign_Centre:
290 flags |= wxALIGN_CENTRE_HORIZONTAL;
291 break;
292
293 case ButtonHAlign_Right:
294 flags |= wxALIGN_RIGHT;
295 break;
296 }
297
298 switch ( m_radioVAlign->GetSelection() )
299 {
300 case ButtonVAlign_Top:
301 flags |= wxALIGN_TOP;
302 break;
303
304 default:
305 wxFAIL_MSG(_T("unexpected radiobox selection"));
306 // fall through
307
308 case ButtonVAlign_Centre:
309 flags |= wxALIGN_CENTRE_VERTICAL;
310 break;
311
312 case ButtonVAlign_Bottom:
313 flags |= wxALIGN_BOTTOM;
314 break;
315 }
316
317 m_button = new wxButton(this, ButtonPage_Button, label,
318 wxDefaultPosition, wxDefaultSize,
319 flags);
320
321#ifdef __WXUNIVERSAL__
322 if ( m_chkImage->GetValue() )
323 {
324 m_button->SetImageLabel(wxTheApp->GetStdIcon(wxICON_INFORMATION));
325 }
326#endif // wxUniv
327
328 if ( m_chkDefault->GetValue() )
329 {
330 m_button->SetDefault();
331 }
332
333 if ( m_chkFit->GetValue() )
334 {
335 m_sizerButton->Add(0, 0, 1, wxCENTRE);
336 m_sizerButton->Add(m_button, 1, wxCENTRE);
337 m_sizerButton->Add(0, 0, 1, wxCENTRE);
338 }
339 else
340 {
341 m_sizerButton->Add(m_button, 1, wxGROW | wxALL, 5);
342 }
343
344 m_sizerButton->Layout();
345}
346
347// ----------------------------------------------------------------------------
348// event handlers
349// ----------------------------------------------------------------------------
350
351void ButtonWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
352{
353 Reset();
354
355 CreateButton();
356}
357
358void ButtonWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event)
359{
360 CreateButton();
361}
362
363void ButtonWidgetsPage::OnButtonChangeLabel(wxCommandEvent& WXUNUSED(event))
364{
365 m_button->SetLabel(m_textLabel->GetValue());
366}
367
368void ButtonWidgetsPage::OnButton(wxCommandEvent& event)
369{
370 wxLogMessage(_T("Test button clicked."));
371}
372