]> git.saurik.com Git - wxWidgets.git/blob - samples/widgets/button.cpp
fix the MSVC check in the last comment and accompanying comment
[wxWidgets.git] / samples / widgets / button.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets 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
29 #include "wx/app.h"
30 #include "wx/log.h"
31
32 #include "wx/bmpbuttn.h"
33 #include "wx/button.h"
34 #include "wx/checkbox.h"
35 #include "wx/radiobox.h"
36 #include "wx/statbox.h"
37 #include "wx/textctrl.h"
38 #endif
39
40 #include "wx/artprov.h"
41 #include "wx/sizer.h"
42 #include "wx/dcmemory.h"
43
44 #include "widgets.h"
45
46 #include "icons/button.xpm"
47
48 // ----------------------------------------------------------------------------
49 // constants
50 // ----------------------------------------------------------------------------
51
52 // control ids
53 enum
54 {
55 ButtonPage_Reset = wxID_HIGHEST,
56 ButtonPage_ChangeLabel,
57 ButtonPage_Button
58 };
59
60 // radio boxes
61 enum
62 {
63 ButtonHAlign_Left,
64 ButtonHAlign_Centre,
65 ButtonHAlign_Right
66 };
67
68 enum
69 {
70 ButtonVAlign_Top,
71 ButtonVAlign_Centre,
72 ButtonVAlign_Bottom
73 };
74
75 // ----------------------------------------------------------------------------
76 // ButtonWidgetsPage
77 // ----------------------------------------------------------------------------
78
79 class ButtonWidgetsPage : public WidgetsPage
80 {
81 public:
82 ButtonWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
83 virtual ~ButtonWidgetsPage(){};
84
85 virtual wxControl *GetWidget() const { return m_button; }
86 virtual void RecreateWidget() { CreateButton(); }
87
88 // lazy creation of the content
89 virtual void CreateContent();
90
91 protected:
92 // event handlers
93 void OnCheckOrRadioBox(wxCommandEvent& event);
94
95 void OnButton(wxCommandEvent& event);
96 void OnButtonReset(wxCommandEvent& event);
97 void OnButtonChangeLabel(wxCommandEvent& event);
98
99 // reset the wxButton parameters
100 void Reset();
101
102 // (re)create the wxButton
103 void CreateButton();
104
105 // add m_button to m_sizerButton using current value of m_chkFit
106 void AddButtonToSizer();
107
108 // helper function: create a bitmap for wxBitmapButton
109 wxBitmap CreateBitmap(const wxString& label);
110
111
112 // the controls
113 // ------------
114
115 // the check/radio boxes for styles
116 wxCheckBox *m_chkBitmap,
117 *m_chkImage,
118 *m_chkFit,
119 *m_chkDefault;
120
121 // more checkboxes for wxBitmapButton only
122 wxCheckBox *m_chkUseSelected,
123 *m_chkUseFocused,
124 *m_chkUseHover,
125 *m_chkUseDisabled;
126
127 wxRadioBox *m_radioHAlign,
128 *m_radioVAlign;
129
130 // the button itself and the sizer it is in
131 wxButton *m_button;
132 wxSizer *m_sizerButton;
133
134 // the text entries for command parameters
135 wxTextCtrl *m_textLabel;
136
137 private:
138 DECLARE_EVENT_TABLE()
139 DECLARE_WIDGETS_PAGE(ButtonWidgetsPage)
140 };
141
142 // ----------------------------------------------------------------------------
143 // event tables
144 // ----------------------------------------------------------------------------
145
146 BEGIN_EVENT_TABLE(ButtonWidgetsPage, WidgetsPage)
147 EVT_BUTTON(ButtonPage_Button, ButtonWidgetsPage::OnButton)
148
149 EVT_BUTTON(ButtonPage_Reset, ButtonWidgetsPage::OnButtonReset)
150 EVT_BUTTON(ButtonPage_ChangeLabel, ButtonWidgetsPage::OnButtonChangeLabel)
151
152 EVT_CHECKBOX(wxID_ANY, ButtonWidgetsPage::OnCheckOrRadioBox)
153 EVT_RADIOBOX(wxID_ANY, ButtonWidgetsPage::OnCheckOrRadioBox)
154 END_EVENT_TABLE()
155
156 // ============================================================================
157 // implementation
158 // ============================================================================
159
160 #if defined(__WXUNIVERSAL__)
161 #define FAMILY_CTRLS UNIVERSAL_CTRLS
162 #else
163 #define FAMILY_CTRLS NATIVE_CTRLS
164 #endif
165
166 IMPLEMENT_WIDGETS_PAGE(ButtonWidgetsPage, _T("Button"), FAMILY_CTRLS );
167
168 ButtonWidgetsPage::ButtonWidgetsPage(WidgetsBookCtrl *book,
169 wxImageList *imaglist)
170 : WidgetsPage(book, imaglist, button_xpm)
171 {
172 // init everything
173 m_chkBitmap =
174 m_chkImage =
175 m_chkFit =
176 m_chkDefault =
177 m_chkUseSelected =
178 m_chkUseFocused =
179 m_chkUseHover =
180 m_chkUseDisabled = (wxCheckBox *)NULL;
181
182 m_radioHAlign =
183 m_radioVAlign = (wxRadioBox *)NULL;
184
185 m_textLabel = (wxTextCtrl *)NULL;
186
187 m_button = (wxButton *)NULL;
188 m_sizerButton = (wxSizer *)NULL;
189 }
190
191 void ButtonWidgetsPage::CreateContent()
192 {
193 wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
194
195 // left pane
196 wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style"));
197
198 wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
199
200 m_chkBitmap = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Bitmap button"));
201 m_chkImage = CreateCheckBoxAndAddToSizer(sizerLeft, _T("With &image"));
202 m_chkFit = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Fit exactly"));
203 m_chkDefault = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Default"));
204
205 #ifndef __WXUNIVERSAL__
206 // only wxUniv currently supports buttons with images
207 m_chkImage->Disable();
208 #endif // !wxUniv
209
210 sizerLeft->AddSpacer(5);
211
212 wxSizer *sizerUseLabels =
213 new wxStaticBoxSizer(wxVERTICAL, this, _T("&Use the following labels?"));
214 m_chkUseSelected = CreateCheckBoxAndAddToSizer(sizerUseLabels, _T("&Pushed"));
215 m_chkUseFocused = CreateCheckBoxAndAddToSizer(sizerUseLabels, _T("&Focused"));
216 m_chkUseHover = CreateCheckBoxAndAddToSizer(sizerUseLabels, _T("&Hover"));
217 m_chkUseDisabled = CreateCheckBoxAndAddToSizer(sizerUseLabels, _T("&Disabled"));
218 sizerLeft->Add(sizerUseLabels, wxSizerFlags().Expand().Border());
219
220 sizerLeft->AddSpacer(15);
221
222 // should be in sync with enums Button[HV]Align!
223 static const wxString halign[] =
224 {
225 _T("left"),
226 _T("centre"),
227 _T("right"),
228 };
229
230 static const wxString valign[] =
231 {
232 _T("top"),
233 _T("centre"),
234 _T("bottom"),
235 };
236
237 m_radioHAlign = new wxRadioBox(this, wxID_ANY, _T("&Horz alignment"),
238 wxDefaultPosition, wxDefaultSize,
239 WXSIZEOF(halign), halign);
240 m_radioVAlign = new wxRadioBox(this, wxID_ANY, _T("&Vert alignment"),
241 wxDefaultPosition, wxDefaultSize,
242 WXSIZEOF(valign), valign);
243
244 sizerLeft->Add(m_radioHAlign, 0, wxGROW | wxALL, 5);
245 sizerLeft->Add(m_radioVAlign, 0, wxGROW | wxALL, 5);
246
247 sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
248
249 wxButton *btn = new wxButton(this, ButtonPage_Reset, _T("&Reset"));
250 sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
251
252 // middle pane
253 wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, _T("&Operations"));
254 wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
255
256 wxSizer *sizerRow = CreateSizerWithTextAndButton(ButtonPage_ChangeLabel,
257 _T("Change label"),
258 wxID_ANY,
259 &m_textLabel);
260 m_textLabel->SetValue(_T("&Press me!"));
261
262 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
263
264 // right pane
265 m_sizerButton = new wxBoxSizer(wxHORIZONTAL);
266 m_sizerButton->SetMinSize(150, 0);
267
268 // the 3 panes panes compose the window
269 sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
270 sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
271 sizerTop->Add(m_sizerButton, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
272
273 // do create the main control
274 Reset();
275 CreateButton();
276
277 SetSizer(sizerTop);
278 }
279
280 // ----------------------------------------------------------------------------
281 // operations
282 // ----------------------------------------------------------------------------
283
284 void ButtonWidgetsPage::Reset()
285 {
286 m_chkBitmap->SetValue(false);
287 m_chkFit->SetValue(true);
288 m_chkImage->SetValue(false);
289 m_chkDefault->SetValue(false);
290
291 m_chkUseSelected->SetValue(true);
292 m_chkUseFocused->SetValue(true);
293 m_chkUseHover->SetValue(true);
294 m_chkUseDisabled->SetValue(true);
295
296 m_radioHAlign->SetSelection(ButtonHAlign_Centre);
297 m_radioVAlign->SetSelection(ButtonVAlign_Centre);
298 }
299
300 void ButtonWidgetsPage::CreateButton()
301 {
302 wxString label;
303 if ( m_button )
304 {
305 label = m_button->GetLabel();
306
307 size_t count = m_sizerButton->GetChildren().GetCount();
308 for ( size_t n = 0; n < count; n++ )
309 {
310 m_sizerButton->Remove( 0 );
311 }
312
313 delete m_button;
314 }
315
316 if ( label.empty() )
317 {
318 // creating for the first time or recreating a button after bitmap
319 // button
320 label = m_textLabel->GetValue();
321 }
322
323 int flags = ms_defaultFlags;
324 switch ( m_radioHAlign->GetSelection() )
325 {
326 case ButtonHAlign_Left:
327 flags |= wxBU_LEFT;
328 break;
329
330 default:
331 wxFAIL_MSG(_T("unexpected radiobox selection"));
332 // fall through
333
334 case ButtonHAlign_Centre:
335 break;
336
337 case ButtonHAlign_Right:
338 flags |= wxBU_RIGHT;
339 break;
340 }
341
342 switch ( m_radioVAlign->GetSelection() )
343 {
344 case ButtonVAlign_Top:
345 flags |= wxBU_TOP;
346 break;
347
348 default:
349 wxFAIL_MSG(_T("unexpected radiobox selection"));
350 // fall through
351
352 case ButtonVAlign_Centre:
353 // centre vertical alignment is the default (no style)
354 break;
355
356 case ButtonVAlign_Bottom:
357 flags |= wxBU_BOTTOM;
358 break;
359 }
360
361 const bool isBitmapButton = m_chkBitmap->GetValue();
362 if ( isBitmapButton )
363 {
364 wxBitmapButton *bbtn = new wxBitmapButton(this, ButtonPage_Button,
365 CreateBitmap(_T("normal")));
366 if ( m_chkUseSelected->GetValue() )
367 bbtn->SetBitmapSelected(CreateBitmap(_T("pushed")));
368 if ( m_chkUseFocused->GetValue() )
369 bbtn->SetBitmapFocus(CreateBitmap(_T("focused")));
370 if ( m_chkUseHover->GetValue() )
371 bbtn->SetBitmapHover(CreateBitmap(_T("hover")));
372 if ( m_chkUseDisabled->GetValue() )
373 bbtn->SetBitmapDisabled(CreateBitmap(_T("disabled")));
374 m_button = bbtn;
375 }
376 else // normal button
377 {
378 m_button = new wxButton(this, ButtonPage_Button, label,
379 wxDefaultPosition, wxDefaultSize,
380 flags);
381 }
382
383 m_chkUseSelected->Enable(isBitmapButton);
384 m_chkUseFocused->Enable(isBitmapButton);
385 m_chkUseHover->Enable(isBitmapButton);
386 m_chkUseDisabled->Enable(isBitmapButton);
387
388 #ifdef __WXUNIVERSAL__
389 if ( m_chkImage->GetValue() )
390 {
391 m_button->SetImageLabel(wxArtProvider::GetIcon(wxART_INFORMATION));
392 }
393 #endif // wxUniv
394
395 if ( m_chkDefault->GetValue() )
396 {
397 m_button->SetDefault();
398 }
399
400 AddButtonToSizer();
401
402 m_sizerButton->Layout();
403 }
404
405 void ButtonWidgetsPage::AddButtonToSizer()
406 {
407 if ( m_chkFit->GetValue() )
408 {
409 m_sizerButton->AddStretchSpacer(1);
410 m_sizerButton->Add(m_button, wxSizerFlags(0).Centre().Border());
411 m_sizerButton->AddStretchSpacer(1);
412 }
413 else // take up the entire space
414 {
415 m_sizerButton->Add(m_button, wxSizerFlags(1).Expand().Border());
416 }
417 }
418
419 // ----------------------------------------------------------------------------
420 // event handlers
421 // ----------------------------------------------------------------------------
422
423 void ButtonWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
424 {
425 Reset();
426
427 CreateButton();
428 }
429
430 void ButtonWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
431 {
432 CreateButton();
433 }
434
435 void ButtonWidgetsPage::OnButtonChangeLabel(wxCommandEvent& WXUNUSED(event))
436 {
437 m_button->SetLabel(m_textLabel->GetValue());
438 }
439
440 void ButtonWidgetsPage::OnButton(wxCommandEvent& WXUNUSED(event))
441 {
442 wxLogMessage(_T("Test button clicked."));
443 }
444
445 // ----------------------------------------------------------------------------
446 // bitmap button stuff
447 // ----------------------------------------------------------------------------
448
449 wxBitmap ButtonWidgetsPage::CreateBitmap(const wxString& label)
450 {
451 wxBitmap bmp(180, 70); // shouldn't hardcode but it's simpler like this
452 wxMemoryDC dc;
453 dc.SelectObject(bmp);
454 dc.SetBackground(wxBrush(*wxWHITE));
455 dc.Clear();
456 dc.SetTextForeground(*wxBLUE);
457 dc.DrawLabel(wxStripMenuCodes(m_textLabel->GetValue()) + _T("\n")
458 _T("(") + label + _T(" state)"),
459 wxArtProvider::GetBitmap(wxART_INFORMATION),
460 wxRect(10, 10, bmp.GetWidth() - 20, bmp.GetHeight() - 20),
461 wxALIGN_CENTRE);
462
463 return bmp;
464 }
465