Compare file paths using wxFileName, not wxString, in the sample.
[wxWidgets.git] / samples / controls / controls.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: controls.cpp
3 // Purpose: Controls wxWidgets sample
4 // Author: Robert Roebling
5 // Modified by:
6 // RCS-ID: $Id$
7 // Copyright: (c) Robert Roebling, Julian Smart
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // For compilers that support precompilation, includes "wx/wx.h".
12 #include "wx/wxprec.h"
13
14 #ifdef __BORLANDC__
15 #pragma hdrstop
16 #endif
17
18 #ifndef WX_PRECOMP
19 #include "wx/wx.h"
20 #endif
21
22 #include "wx/spinbutt.h"
23 #include "wx/tglbtn.h"
24 #include "wx/bookctrl.h"
25 #include "wx/imaglist.h"
26 #include "wx/artprov.h"
27 #include "wx/cshelp.h"
28 #include "wx/gbsizer.h"
29
30 #if wxUSE_TOOLTIPS
31 #include "wx/tooltip.h"
32 #ifdef __WXMSW__
33 #include "wx/numdlg.h"
34 #endif // __WXMSW__
35 #endif // wxUSE_TOOLTIPS
36
37 #ifndef __WXMSW__
38 #include "icons/choice.xpm"
39 #include "icons/combo.xpm"
40 #include "icons/list.xpm"
41 #include "icons/radio.xpm"
42 #include "icons/text.xpm"
43 #include "icons/gauge.xpm"
44 #endif
45
46 #ifndef wxUSE_SPINBTN
47 #define wxUSE_SPINBTN 1
48 #endif
49
50 #include "wx/progdlg.h"
51
52 #if wxUSE_SPINCTRL
53 #include "wx/spinctrl.h"
54 #endif // wxUSE_SPINCTRL
55
56 #if !wxUSE_TOGGLEBTN
57 #define wxToggleButton wxCheckBox
58 #define EVT_TOGGLEBUTTON EVT_CHECKBOX
59 #endif
60
61 #ifndef wxHAS_IMAGES_IN_RESOURCES
62 #include "../sample.xpm"
63 #endif
64
65 //----------------------------------------------------------------------
66 // class definitions
67 //----------------------------------------------------------------------
68
69 class MyApp: public wxApp
70 {
71 public:
72 bool OnInit();
73 };
74
75 class MyPanel: public wxPanel
76 {
77 public:
78 MyPanel(wxFrame *frame, int x, int y, int w, int h);
79 virtual ~MyPanel();
80
81 #if wxUSE_TOOLTIPS
82 void SetAllToolTips();
83 #endif // wxUSE_TOOLTIPS
84
85 void OnIdle( wxIdleEvent &event );
86 void OnListBox( wxCommandEvent &event );
87 void OnListBoxDoubleClick( wxCommandEvent &event );
88 void OnListBoxButtons( wxCommandEvent &event );
89 #if wxUSE_CHOICE
90 void OnChoice( wxCommandEvent &event );
91 void OnChoiceButtons( wxCommandEvent &event );
92 #endif
93 void OnCombo( wxCommandEvent &event );
94 void OnComboTextChanged( wxCommandEvent &event );
95 void OnComboTextEnter( wxCommandEvent &event );
96 void OnComboButtons( wxCommandEvent &event );
97 void OnRadio( wxCommandEvent &event );
98 void OnRadioButtons( wxCommandEvent &event );
99 void OnRadioButton1( wxCommandEvent &event );
100 void OnRadioButton2( wxCommandEvent &event );
101 void OnSetFont( wxCommandEvent &event );
102 void OnPageChanged( wxBookCtrlEvent &event );
103 void OnPageChanging( wxBookCtrlEvent &event );
104 void OnSliderUpdate( wxCommandEvent &event );
105 void OnUpdateLabel( wxCommandEvent &event );
106 #if wxUSE_SPINBTN
107 void OnSpinUp( wxSpinEvent &event );
108 void OnSpinDown( wxSpinEvent &event );
109 void OnSpinUpdate( wxSpinEvent &event );
110 #if wxUSE_PROGRESSDLG
111 void OnUpdateShowProgress( wxUpdateUIEvent& event );
112 void OnShowProgress( wxCommandEvent &event );
113 #endif // wxUSE_PROGRESSDLG
114 #endif // wxUSE_SPINBTN
115 void OnNewText( wxCommandEvent &event );
116 #if wxUSE_SPINCTRL
117 void OnSpinCtrl(wxSpinEvent& event);
118 void OnSpinCtrlUp(wxSpinEvent& event);
119 void OnSpinCtrlDown(wxSpinEvent& event);
120 void OnSpinCtrlText(wxCommandEvent& event);
121 #endif // wxUSE_SPINCTRL
122
123 void OnEnableAll(wxCommandEvent& event);
124 void OnChangeColour(wxCommandEvent& event);
125 void OnTestButton(wxCommandEvent& event);
126 void OnBmpButton(wxCommandEvent& event);
127 void OnBmpButtonToggle(wxCommandEvent& event);
128
129 void OnSizerCheck (wxCommandEvent &event);
130
131 wxListBox *m_listbox,
132 *m_listboxSorted;
133 #if wxUSE_CHOICE
134 wxChoice *m_choice,
135 *m_choiceSorted;
136 #endif // wxUSE_CHOICE
137
138 wxComboBox *m_combo;
139 wxRadioBox *m_radio;
140 #if wxUSE_GAUGE
141 wxGauge *m_gauge,
142 *m_gaugeVert;
143 #endif // wxUSE_GAUGE
144 #if wxUSE_SLIDER
145 wxSlider *m_slider;
146 #endif // wxUSE_SLIDER
147 wxButton *m_fontButton;
148 wxButton *m_lbSelectNum;
149 wxButton *m_lbSelectThis;
150 #if wxUSE_SPINBTN
151 wxSpinButton *m_spinbutton;
152 #if wxUSE_PROGRESSDLG
153 wxButton *m_btnProgress;
154 #endif // wxUSE_PROGRESSDLG
155 #endif // wxUSE_SPINBTN
156 wxStaticText *m_wrappingText;
157 wxStaticText *m_nonWrappingText;
158
159 #if wxUSE_SPINCTRL
160 wxSpinCtrl *m_spinctrl;
161 #endif // wxUSE_SPINCTRL
162
163 wxTextCtrl *m_spintext;
164 wxCheckBox *m_checkbox;
165
166 wxTextCtrl *m_text;
167 wxBookCtrl *m_book;
168
169 wxStaticText *m_label;
170
171 wxBoxSizer *m_buttonSizer;
172 wxButton *m_sizerBtn1;
173 wxButton *m_sizerBtn2;
174 wxButton *m_sizerBtn3;
175 wxButton *m_sizerBtn4;
176 wxBoxSizer *m_hsizer;
177 wxButton *m_bigBtn;
178
179 private:
180 wxLog *m_logTargetOld;
181
182 DECLARE_EVENT_TABLE()
183 };
184
185 class MyFrame: public wxFrame
186 {
187 public:
188 MyFrame(const wxChar *title, int x, int y);
189
190 void OnQuit(wxCommandEvent& event);
191 void OnAbout(wxCommandEvent& event);
192 void OnClearLog(wxCommandEvent& event);
193
194 #if wxUSE_TOOLTIPS
195 void OnSetTooltipDelay(wxCommandEvent& event);
196 void OnToggleTooltips(wxCommandEvent& event);
197 #ifdef __WXMSW__
198 void OnSetMaxTooltipWidth(wxCommandEvent& event);
199 #endif // __WXMSW__
200 #endif // wxUSE_TOOLTIPS
201
202 void OnEnableAll(wxCommandEvent& event);
203 void OnHideAll(wxCommandEvent& event);
204 void OnHideList(wxCommandEvent& event);
205 void OnContextHelp(wxCommandEvent& event);
206
207 void OnIdle( wxIdleEvent& event );
208 void OnIconized( wxIconizeEvent& event );
209 void OnMaximized( wxMaximizeEvent& event );
210 void OnSize( wxSizeEvent& event );
211 void OnMove( wxMoveEvent& event );
212
213 MyPanel *GetPanel() const { return m_panel; }
214
215 private:
216 #if wxUSE_STATUSBAR
217 void UpdateStatusBar(const wxPoint& pos, const wxSize& size)
218 {
219 if ( m_frameStatusBar )
220 {
221 wxString msg;
222 wxSize sizeAll = GetSize(),
223 sizeCl = GetClientSize();
224 msg.Printf(_("pos=(%d, %d), size=%dx%d or %dx%d (client=%dx%d)"),
225 pos.x, pos.y,
226 size.x, size.y,
227 sizeAll.x, sizeAll.y,
228 sizeCl.x, sizeCl.y);
229 SetStatusText(msg, 1);
230 }
231 }
232 #endif // wxUSE_STATUSBAR
233
234 MyPanel *m_panel;
235
236 DECLARE_EVENT_TABLE()
237 };
238
239 // a button which intercepts double clicks (for testing...)
240 class MyButton : public wxButton
241 {
242 public:
243 MyButton(wxWindow *parent,
244 wxWindowID id,
245 const wxString& label = wxEmptyString,
246 const wxPoint& pos = wxDefaultPosition,
247 const wxSize& size = wxDefaultSize)
248 : wxButton(parent, id, label, pos, size)
249 {
250 }
251
252 void OnDClick(wxMouseEvent& event)
253 {
254 wxLogMessage(wxT("MyButton::OnDClick"));
255
256 event.Skip();
257 }
258
259 private:
260 DECLARE_EVENT_TABLE()
261 };
262
263 // a combo which intercepts chars (to test Windows behaviour)
264 class MyComboBox : public wxComboBox
265 {
266 public:
267 MyComboBox(wxWindow *parent, wxWindowID id,
268 const wxString& value = wxEmptyString,
269 const wxPoint& pos = wxDefaultPosition,
270 const wxSize& size = wxDefaultSize,
271 int n = 0, const wxString choices[] = NULL,
272 long style = 0,
273 const wxValidator& validator = wxDefaultValidator,
274 const wxString& name = wxComboBoxNameStr)
275 : wxComboBox(parent, id, value, pos, size, n, choices, style,
276 validator, name) { }
277
278 protected:
279 void OnChar(wxKeyEvent& event);
280 void OnKeyDown(wxKeyEvent& event);
281 void OnKeyUp(wxKeyEvent& event);
282 void OnFocusGot(wxFocusEvent& event)
283 {
284 wxLogMessage(wxT("MyComboBox::OnFocusGot"));
285
286 event.Skip();
287 }
288
289 private:
290 DECLARE_EVENT_TABLE()
291 };
292
293 // a radiobox which handles focus set/kill (for testing)
294 class MyRadioBox : public wxRadioBox
295 {
296 public:
297 MyRadioBox(wxWindow *parent,
298 wxWindowID id,
299 const wxString& title = wxEmptyString,
300 const wxPoint& pos = wxDefaultPosition,
301 const wxSize& size = wxDefaultSize,
302 int n = 0, const wxString choices[] = NULL,
303 int majorDim = 1,
304 long style = wxRA_SPECIFY_COLS,
305 const wxValidator& validator = wxDefaultValidator,
306 const wxString& name = wxRadioBoxNameStr)
307 : wxRadioBox(parent, id, title, pos, size, n, choices, majorDim,
308 style, validator, name)
309 {
310 }
311
312 protected:
313 void OnFocusGot(wxFocusEvent& event)
314 {
315 wxLogMessage(wxT("MyRadioBox::OnFocusGot"));
316
317 event.Skip();
318 }
319
320 void OnFocusLost(wxFocusEvent& event)
321 {
322 wxLogMessage(wxT("MyRadioBox::OnFocusLost"));
323
324 event.Skip();
325 }
326
327 private:
328 DECLARE_EVENT_TABLE()
329 };
330
331 // a choice which handles focus set/kill (for testing)
332 class MyChoice : public wxChoice
333 {
334 public:
335 MyChoice(wxWindow *parent,
336 wxWindowID id,
337 const wxPoint& pos = wxDefaultPosition,
338 const wxSize& size = wxDefaultSize,
339 int n = 0, const wxString choices[] = NULL,
340 long style = 0,
341 const wxValidator& validator = wxDefaultValidator,
342 const wxString& name = wxChoiceNameStr )
343 : wxChoice(parent, id, pos, size, n, choices,
344 style, validator, name) { }
345
346 protected:
347 void OnFocusGot(wxFocusEvent& event)
348 {
349 wxLogMessage(wxT("MyChoice::OnFocusGot"));
350
351 event.Skip();
352 }
353
354 void OnFocusLost(wxFocusEvent& event)
355 {
356 wxLogMessage(wxT("MyChoice::OnFocusLost"));
357
358 event.Skip();
359 }
360
361 private:
362 DECLARE_EVENT_TABLE()
363 };
364
365
366
367 //----------------------------------------------------------------------
368 // other
369 //----------------------------------------------------------------------
370
371 static void SetListboxClientData(const wxChar *name, wxListBox *control);
372
373 #if wxUSE_CHOICE
374 static void SetChoiceClientData(const wxChar *name, wxChoice *control);
375 #endif // wxUSE_CHOICE
376
377 IMPLEMENT_APP(MyApp)
378
379 //----------------------------------------------------------------------
380 // MyApp
381 //----------------------------------------------------------------------
382
383 enum
384 {
385 CONTROLS_QUIT = wxID_EXIT,
386 CONTROLS_ABOUT = wxID_ABOUT,
387 CONTROLS_TEXT = 100,
388 CONTROLS_CLEAR_LOG,
389
390 // tooltip menu
391 CONTROLS_SET_TOOLTIP_DELAY = 200,
392 CONTROLS_ENABLE_TOOLTIPS,
393 CONTROLS_SET_TOOLTIPS_MAX_WIDTH,
394
395 // panel menu
396 CONTROLS_ENABLE_ALL,
397 CONTROLS_HIDE_ALL,
398 CONTROLS_HIDE_LIST,
399 CONTROLS_CONTEXT_HELP
400 };
401
402 bool MyApp::OnInit()
403 {
404 // use standard command line handling:
405 if ( !wxApp::OnInit() )
406 return false;
407
408 // parse the cmd line
409 int x = 50,
410 y = 50;
411 if ( argc == 3 )
412 {
413 wxSscanf(wxString(argv[1]), wxT("%d"), &x);
414 wxSscanf(wxString(argv[2]), wxT("%d"), &y);
415 }
416
417 #if wxUSE_HELP
418 wxHelpProvider::Set( new wxSimpleHelpProvider );
419 #endif // wxUSE_HELP
420
421 // Create the main frame window
422 MyFrame *frame = new MyFrame(wxT("Controls wxWidgets App"), x, y);
423 frame->Show(true);
424
425 return true;
426 }
427
428 //----------------------------------------------------------------------
429 // MyPanel
430 //----------------------------------------------------------------------
431
432 const int ID_BOOK = 1000;
433
434 const int ID_LISTBOX = 130;
435 const int ID_LISTBOX_SEL_NUM = 131;
436 const int ID_LISTBOX_SEL_STR = 132;
437 const int ID_LISTBOX_CLEAR = 133;
438 const int ID_LISTBOX_APPEND = 134;
439 const int ID_LISTBOX_DELETE = 135;
440 const int ID_LISTBOX_FONT = 136;
441 const int ID_LISTBOX_ENABLE = 137;
442 const int ID_LISTBOX_SORTED = 138;
443
444 const int ID_CHOICE = 120;
445 const int ID_CHOICE_SEL_NUM = 121;
446 const int ID_CHOICE_SEL_STR = 122;
447 const int ID_CHOICE_CLEAR = 123;
448 const int ID_CHOICE_APPEND = 124;
449 const int ID_CHOICE_DELETE = 125;
450 const int ID_CHOICE_FONT = 126;
451 const int ID_CHOICE_ENABLE = 127;
452 const int ID_CHOICE_SORTED = 128;
453
454 const int ID_COMBO = 140;
455 const int ID_COMBO_SEL_NUM = 141;
456 const int ID_COMBO_SEL_STR = 142;
457 const int ID_COMBO_CLEAR = 143;
458 const int ID_COMBO_APPEND = 144;
459 const int ID_COMBO_DELETE = 145;
460 const int ID_COMBO_FONT = 146;
461 const int ID_COMBO_ENABLE = 147;
462 const int ID_COMBO_SET_TEXT = 148;
463
464 const int ID_RADIOBOX = 160;
465 const int ID_RADIOBOX_SEL_NUM = 161;
466 const int ID_RADIOBOX_SEL_STR = 162;
467 const int ID_RADIOBOX_FONT = 163;
468 const int ID_RADIOBOX_ENABLE = 164;
469 const int ID_RADIOBOX2 = 165;
470 const int ID_RADIOBUTTON_1 = 166;
471 const int ID_RADIOBUTTON_2 = 167;
472
473 const int ID_SET_FONT = 170;
474
475 #if wxUSE_GAUGE
476 const int ID_GAUGE = 180;
477 #endif // wxUSE_GAUGE
478
479 #if wxUSE_SLIDER
480 const int ID_SLIDER = 181;
481 #endif // wxUSE_SLIDER
482
483 const int ID_SPIN = 182;
484 #if wxUSE_PROGRESSDLG
485 const int ID_BTNPROGRESS = 183;
486 #endif // wxUSE_PROGRESSDLG
487 const int ID_BUTTON_LABEL = 184;
488 const int ID_SPINCTRL = 185;
489 const int ID_BTNNEWTEXT = 186;
490
491 const int ID_BUTTON_TEST1 = 190;
492 const int ID_BUTTON_TEST2 = 191;
493 const int ID_BITMAP_BTN = 192;
494 const int ID_BITMAP_BTN_ENABLE = 193;
495
496 const int ID_CHANGE_COLOUR = 200;
497
498 const int ID_SIZER_CHECK1 = 201;
499 const int ID_SIZER_CHECK2 = 202;
500 const int ID_SIZER_CHECK3 = 203;
501 const int ID_SIZER_CHECK4 = 204;
502 const int ID_SIZER_CHECK14 = 205;
503 const int ID_SIZER_CHECKBIG = 206;
504
505 const int ID_HYPERLINK = 300;
506
507 BEGIN_EVENT_TABLE(MyPanel, wxPanel)
508 EVT_IDLE ( MyPanel::OnIdle)
509 EVT_BOOKCTRL_PAGE_CHANGING(ID_BOOK, MyPanel::OnPageChanging)
510 EVT_BOOKCTRL_PAGE_CHANGED(ID_BOOK, MyPanel::OnPageChanged)
511 EVT_LISTBOX (ID_LISTBOX, MyPanel::OnListBox)
512 EVT_LISTBOX (ID_LISTBOX_SORTED, MyPanel::OnListBox)
513 EVT_LISTBOX_DCLICK(ID_LISTBOX, MyPanel::OnListBoxDoubleClick)
514 EVT_BUTTON (ID_LISTBOX_SEL_NUM, MyPanel::OnListBoxButtons)
515 EVT_BUTTON (ID_LISTBOX_SEL_STR, MyPanel::OnListBoxButtons)
516 EVT_BUTTON (ID_LISTBOX_CLEAR, MyPanel::OnListBoxButtons)
517 EVT_BUTTON (ID_LISTBOX_APPEND, MyPanel::OnListBoxButtons)
518 EVT_BUTTON (ID_LISTBOX_DELETE, MyPanel::OnListBoxButtons)
519 EVT_BUTTON (ID_LISTBOX_FONT, MyPanel::OnListBoxButtons)
520 EVT_CHECKBOX (ID_LISTBOX_ENABLE, MyPanel::OnListBoxButtons)
521 #if wxUSE_CHOICE
522 EVT_CHOICE (ID_CHOICE, MyPanel::OnChoice)
523 EVT_CHOICE (ID_CHOICE_SORTED, MyPanel::OnChoice)
524 EVT_BUTTON (ID_CHOICE_SEL_NUM, MyPanel::OnChoiceButtons)
525 EVT_BUTTON (ID_CHOICE_SEL_STR, MyPanel::OnChoiceButtons)
526 EVT_BUTTON (ID_CHOICE_CLEAR, MyPanel::OnChoiceButtons)
527 EVT_BUTTON (ID_CHOICE_APPEND, MyPanel::OnChoiceButtons)
528 EVT_BUTTON (ID_CHOICE_DELETE, MyPanel::OnChoiceButtons)
529 EVT_BUTTON (ID_CHOICE_FONT, MyPanel::OnChoiceButtons)
530 EVT_CHECKBOX (ID_CHOICE_ENABLE, MyPanel::OnChoiceButtons)
531 #endif
532 EVT_COMBOBOX (ID_COMBO, MyPanel::OnCombo)
533 EVT_TEXT (ID_COMBO, MyPanel::OnComboTextChanged)
534 EVT_TEXT_ENTER(ID_COMBO, MyPanel::OnComboTextEnter)
535 EVT_BUTTON (ID_COMBO_SEL_NUM, MyPanel::OnComboButtons)
536 EVT_BUTTON (ID_COMBO_SEL_STR, MyPanel::OnComboButtons)
537 EVT_BUTTON (ID_COMBO_CLEAR, MyPanel::OnComboButtons)
538 EVT_BUTTON (ID_COMBO_APPEND, MyPanel::OnComboButtons)
539 EVT_BUTTON (ID_COMBO_DELETE, MyPanel::OnComboButtons)
540 EVT_BUTTON (ID_COMBO_FONT, MyPanel::OnComboButtons)
541 EVT_BUTTON (ID_COMBO_SET_TEXT, MyPanel::OnComboButtons)
542 EVT_CHECKBOX (ID_COMBO_ENABLE, MyPanel::OnComboButtons)
543 EVT_RADIOBOX (ID_RADIOBOX, MyPanel::OnRadio)
544 EVT_RADIOBOX (ID_RADIOBOX2, MyPanel::OnRadio)
545 EVT_BUTTON (ID_RADIOBOX_SEL_NUM, MyPanel::OnRadioButtons)
546 EVT_BUTTON (ID_RADIOBOX_SEL_STR, MyPanel::OnRadioButtons)
547 EVT_BUTTON (ID_RADIOBOX_FONT, MyPanel::OnRadioButtons)
548 EVT_CHECKBOX (ID_RADIOBOX_ENABLE, MyPanel::OnRadioButtons)
549 EVT_RADIOBUTTON(ID_RADIOBUTTON_1, MyPanel::OnRadioButton1)
550 EVT_RADIOBUTTON(ID_RADIOBUTTON_2, MyPanel::OnRadioButton2)
551 EVT_BUTTON (ID_SET_FONT, MyPanel::OnSetFont)
552 #if wxUSE_SLIDER
553 EVT_SLIDER (ID_SLIDER, MyPanel::OnSliderUpdate)
554 #endif // wxUSE_SLIDER
555 #if wxUSE_SPINBTN
556 EVT_SPIN (ID_SPIN, MyPanel::OnSpinUpdate)
557 EVT_SPIN_UP (ID_SPIN, MyPanel::OnSpinUp)
558 EVT_SPIN_DOWN (ID_SPIN, MyPanel::OnSpinDown)
559 #if wxUSE_PROGRESSDLG
560 EVT_UPDATE_UI (ID_BTNPROGRESS, MyPanel::OnUpdateShowProgress)
561 EVT_BUTTON (ID_BTNPROGRESS, MyPanel::OnShowProgress)
562 #endif // wxUSE_PROGRESSDLG
563 #endif // wxUSE_SPINBTN
564 #if wxUSE_SPINCTRL
565 EVT_SPINCTRL (ID_SPINCTRL, MyPanel::OnSpinCtrl)
566 EVT_SPIN_UP (ID_SPINCTRL, MyPanel::OnSpinCtrlUp)
567 EVT_SPIN_DOWN (ID_SPINCTRL, MyPanel::OnSpinCtrlDown)
568 EVT_TEXT (ID_SPINCTRL, MyPanel::OnSpinCtrlText)
569 #endif // wxUSE_SPINCTRL
570 EVT_BUTTON (ID_BTNNEWTEXT, MyPanel::OnNewText)
571 EVT_TOGGLEBUTTON(ID_BUTTON_LABEL, MyPanel::OnUpdateLabel)
572 EVT_CHECKBOX (ID_CHANGE_COLOUR, MyPanel::OnChangeColour)
573 EVT_BUTTON (ID_BUTTON_TEST1, MyPanel::OnTestButton)
574 EVT_BUTTON (ID_BUTTON_TEST2, MyPanel::OnTestButton)
575 EVT_BUTTON (ID_BITMAP_BTN, MyPanel::OnBmpButton)
576 EVT_TOGGLEBUTTON(ID_BITMAP_BTN_ENABLE, MyPanel::OnBmpButtonToggle)
577
578 EVT_CHECKBOX (ID_SIZER_CHECK1, MyPanel::OnSizerCheck)
579 EVT_CHECKBOX (ID_SIZER_CHECK2, MyPanel::OnSizerCheck)
580 EVT_CHECKBOX (ID_SIZER_CHECK3, MyPanel::OnSizerCheck)
581 EVT_CHECKBOX (ID_SIZER_CHECK4, MyPanel::OnSizerCheck)
582 EVT_CHECKBOX (ID_SIZER_CHECK14, MyPanel::OnSizerCheck)
583 EVT_CHECKBOX (ID_SIZER_CHECKBIG, MyPanel::OnSizerCheck)
584
585 END_EVENT_TABLE()
586
587 BEGIN_EVENT_TABLE(MyButton, wxButton)
588 EVT_LEFT_DCLICK(MyButton::OnDClick)
589 END_EVENT_TABLE()
590
591 BEGIN_EVENT_TABLE(MyComboBox, wxComboBox)
592 EVT_CHAR(MyComboBox::OnChar)
593 EVT_KEY_DOWN(MyComboBox::OnKeyDown)
594 EVT_KEY_UP(MyComboBox::OnKeyUp)
595
596 EVT_SET_FOCUS(MyComboBox::OnFocusGot)
597 END_EVENT_TABLE()
598
599 BEGIN_EVENT_TABLE(MyRadioBox, wxRadioBox)
600 EVT_SET_FOCUS(MyRadioBox::OnFocusGot)
601 EVT_KILL_FOCUS(MyRadioBox::OnFocusLost)
602 END_EVENT_TABLE()
603
604 BEGIN_EVENT_TABLE(MyChoice, wxChoice)
605 EVT_SET_FOCUS(MyChoice::OnFocusGot)
606 EVT_KILL_FOCUS(MyChoice::OnFocusLost)
607 END_EVENT_TABLE()
608
609 // ============================================================================
610 // implementation
611 // ============================================================================
612
613 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
614 : wxPanel( frame, wxID_ANY, wxPoint(x, y), wxSize(w, h) )
615 {
616 m_listbox = NULL;
617 m_listboxSorted = NULL;
618 #if wxUSE_CHOICE
619 m_choice = NULL;
620 m_choiceSorted = NULL;
621 #endif // wxUSE_CHOICE
622 m_combo = NULL;
623 m_radio = NULL;
624 #if wxUSE_GAUGE
625 m_gauge = NULL;
626 m_gaugeVert = NULL;
627 #endif // wxUSE_GAUGE
628 #if wxUSE_SLIDER
629 m_slider = NULL;
630 #endif // wxUSE_SLIDER
631 m_fontButton = NULL;
632 m_lbSelectNum = NULL;
633 m_lbSelectThis = NULL;
634 #if wxUSE_SPINBTN
635 m_spinbutton = NULL;
636 #if wxUSE_PROGRESSDLG
637 m_btnProgress = NULL;
638 #endif // wxUSE_PROGRESSDLG
639 #endif // wxUSE_SPINBTN
640 #if wxUSE_SPINCTRL
641 m_spinctrl = NULL;
642 #endif // wxUSE_SPINCTRL
643 m_spintext = NULL;
644 m_checkbox = NULL;
645 m_text = NULL;
646 m_book = NULL;
647 m_label = NULL;
648
649 m_text = new wxTextCtrl(this, wxID_ANY, wxT("This is the log window.\n"),
650 wxPoint(0, 250), wxSize(100, 50), wxTE_MULTILINE);
651
652 m_logTargetOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_text));
653
654 m_book = new wxBookCtrl(this, ID_BOOK);
655
656 wxString choices[] =
657 {
658 wxT("This"),
659 wxT("is"),
660 wxT("one of my long and"),
661 wxT("wonderful"),
662 wxT("examples.")
663 };
664
665 #ifndef __WXMSW__
666 // image ids
667 enum
668 {
669 Image_List,
670 Image_Choice,
671 Image_Combo,
672 Image_Text,
673 Image_Radio,
674 #if wxUSE_GAUGE
675 Image_Gauge,
676 #endif // wxUSE_GAUGE
677 Image_Max
678 };
679
680 // fill the image list
681 wxBitmap bmp(list_xpm);
682
683 wxImageList *imagelist = new wxImageList(bmp.GetWidth(), bmp.GetHeight());
684
685 imagelist-> Add( bmp );
686 imagelist-> Add( wxBitmap( choice_xpm ));
687 imagelist-> Add( wxBitmap( combo_xpm ));
688 imagelist-> Add( wxBitmap( text_xpm ));
689 imagelist-> Add( wxBitmap( radio_xpm ));
690 #if wxUSE_GAUGE
691 imagelist-> Add( wxBitmap( gauge_xpm ));
692 #endif // wxUSE_GAUGE
693 m_book->SetImageList(imagelist);
694 #else
695 // load images from resources
696 enum
697 {
698 Image_List,
699 Image_Choice,
700 Image_Combo,
701 Image_Text,
702 Image_Radio,
703 #if wxUSE_GAUGE
704 Image_Gauge,
705 #endif // wxUSE_GAUGE
706 Image_Max
707 };
708 wxImageList *imagelist = new wxImageList(16, 16, false, Image_Max);
709
710 static const wxChar *s_iconNames[Image_Max] =
711 {
712 wxT("list")
713 , wxT("choice")
714 , wxT("combo")
715 , wxT("text")
716 , wxT("radio")
717 #if wxUSE_GAUGE
718 , wxT("gauge")
719 #endif // wxUSE_GAUGE
720 };
721
722 for ( size_t n = 0; n < Image_Max; n++ )
723 {
724 wxBitmap bmp(s_iconNames[n]);
725 if ( !bmp.IsOk() || (imagelist->Add(bmp) == -1) )
726 {
727 wxLogWarning(wxT("Couldn't load the image '%s' for the book control page %d."),
728 s_iconNames[n], n);
729 }
730 }
731
732 m_book->SetImageList(imagelist);
733 #endif
734
735 // ------------------------------------------------------------------------
736 // listbox page
737 // ------------------------------------------------------------------------
738 wxPanel *panel = new wxPanel(m_book);
739 m_listbox = new wxListBox( panel, ID_LISTBOX,
740 wxPoint(10,10), wxSize(120,70),
741 5, choices, wxLB_MULTIPLE | wxLB_ALWAYS_SB | wxHSCROLL );
742 m_listboxSorted = new wxListBox( panel, ID_LISTBOX_SORTED,
743 wxPoint(10,90), wxSize(120,70),
744 3, choices, wxLB_SORT );
745
746 SetListboxClientData(wxT("listbox"), m_listbox);
747 SetListboxClientData(wxT("listbox"), m_listboxSorted);
748
749 m_listbox->SetCursor(*wxCROSS_CURSOR);
750
751 m_lbSelectNum = new wxButton( panel, ID_LISTBOX_SEL_NUM, wxT("Select #&2"), wxPoint(180,30), wxSize(140,30) );
752 m_lbSelectThis = new wxButton( panel, ID_LISTBOX_SEL_STR, wxT("&Select 'This'"), wxPoint(340,30), wxSize(140,30) );
753 (void)new wxButton( panel, ID_LISTBOX_CLEAR, wxT("&Clear"), wxPoint(180,80), wxSize(140,30) );
754 (void)new MyButton( panel, ID_LISTBOX_APPEND, wxT("&Append 'Hi!'"), wxPoint(340,80), wxSize(140,30) );
755 (void)new wxButton( panel, ID_LISTBOX_DELETE, wxT("D&elete selected item"), wxPoint(180,130), wxSize(140,30) );
756 wxButton *button = new MyButton( panel, ID_LISTBOX_FONT, wxT("Set &Italic font"), wxPoint(340,130), wxSize(140,30) );
757
758 button->SetDefault();
759
760 m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, wxT("&Disable"), wxPoint(20,170) );
761 m_checkbox->SetValue(false);
762 button->MoveAfterInTabOrder(m_checkbox);
763 (void)new wxCheckBox( panel, ID_CHANGE_COLOUR, wxT("&Toggle colour"),
764 wxPoint(110,170) );
765 panel->SetCursor(wxCursor(wxCURSOR_HAND));
766 m_book->AddPage(panel, wxT("wxListBox"), true, Image_List);
767
768 // ------------------------------------------------------------------------
769 // choice page
770 // ------------------------------------------------------------------------
771 #if wxUSE_CHOICE
772 panel = new wxPanel(m_book);
773 m_choice = new MyChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,wxDefaultCoord), 5, choices );
774 m_choiceSorted = new MyChoice( panel, ID_CHOICE_SORTED, wxPoint(10,70), wxSize(120,wxDefaultCoord),
775 5, choices, wxCB_SORT );
776
777 SetChoiceClientData(wxT("choice"), m_choice);
778 SetChoiceClientData(wxT("choice"), m_choiceSorted);
779
780 m_choice->SetSelection(2);
781 (void)new wxButton( panel, ID_CHOICE_SEL_NUM, wxT("Select #&2"), wxPoint(180,30), wxSize(140,30) );
782 (void)new wxButton( panel, ID_CHOICE_SEL_STR, wxT("&Select 'This'"), wxPoint(340,30), wxSize(140,30) );
783 (void)new wxButton( panel, ID_CHOICE_CLEAR, wxT("&Clear"), wxPoint(180,80), wxSize(140,30) );
784 (void)new wxButton( panel, ID_CHOICE_APPEND, wxT("&Append 'Hi!'"), wxPoint(340,80), wxSize(140,30) );
785 (void)new wxButton( panel, ID_CHOICE_DELETE, wxT("D&elete selected item"), wxPoint(180,130), wxSize(140,30) );
786 (void)new wxButton( panel, ID_CHOICE_FONT, wxT("Set &Italic font"), wxPoint(340,130), wxSize(140,30) );
787 (void)new wxCheckBox( panel, ID_CHOICE_ENABLE, wxT("&Disable"), wxPoint(20,130), wxSize(140,30) );
788
789 m_book->AddPage(panel, wxT("wxChoice"), false, Image_Choice);
790 #endif // wxUSE_CHOICE
791
792 // ------------------------------------------------------------------------
793 // combo page
794 // ------------------------------------------------------------------------
795 panel = new wxPanel(m_book);
796 (void)new wxStaticBox( panel, wxID_ANY, wxT("&Box around combobox"),
797 wxPoint(5, 5), wxSize(150, 100));
798 m_combo = new MyComboBox( panel, ID_COMBO, wxT("This"),
799 wxPoint(20,25), wxSize(120, wxDefaultCoord),
800 5, choices,
801 wxTE_PROCESS_ENTER);
802
803 (void)new wxButton( panel, ID_COMBO_SEL_NUM, wxT("Select #&2"), wxPoint(180,30), wxSize(140,30) );
804 (void)new wxButton( panel, ID_COMBO_SEL_STR, wxT("&Select 'This'"), wxPoint(340,30), wxSize(140,30) );
805 (void)new wxButton( panel, ID_COMBO_CLEAR, wxT("&Clear"), wxPoint(180,80), wxSize(140,30) );
806 (void)new wxButton( panel, ID_COMBO_APPEND, wxT("&Append 'Hi!'"), wxPoint(340,80), wxSize(140,30) );
807 (void)new wxButton( panel, ID_COMBO_DELETE, wxT("D&elete selected item"), wxPoint(180,130), wxSize(140,30) );
808 (void)new wxButton( panel, ID_COMBO_FONT, wxT("Set &Italic font"), wxPoint(340,130), wxSize(140,30) );
809 (void)new wxButton( panel, ID_COMBO_SET_TEXT, wxT("Set 'Hi!' at #2"), wxPoint(340,180), wxSize(140,30) );
810 (void)new wxCheckBox( panel, ID_COMBO_ENABLE, wxT("&Disable"), wxPoint(20,130), wxSize(140,30) );
811 m_book->AddPage(panel, wxT("wxComboBox"), false, Image_Combo);
812
813 // ------------------------------------------------------------------------
814 // radio box
815 // ------------------------------------------------------------------------
816 wxString choices2[] =
817 {
818 wxT("First"), wxT("Second"),
819 /* "Third",
820 "Fourth", "Fifth", "Sixth",
821 "Seventh", "Eighth", "Nineth", "Tenth" */
822 };
823
824 panel = new wxPanel(m_book);
825 wxGridBagSizer* radio_page_sizer = new wxGridBagSizer(5, 5);
826
827 m_radio = new wxRadioBox(panel, ID_RADIOBOX, wxT("T&his"),
828 wxPoint(10,10), wxDefaultSize,
829 WXSIZEOF(choices), choices,
830 1, wxRA_SPECIFY_COLS );
831 MyRadioBox* mybox = new MyRadioBox(panel, ID_RADIOBOX2, wxT("&That"),
832 wxPoint(10,160), wxDefaultSize,
833 WXSIZEOF(choices2), choices2,
834 1, wxRA_SPECIFY_ROWS );
835
836 radio_page_sizer->Add( m_radio, wxGBPosition(0,0), wxGBSpan(2,1) );
837 radio_page_sizer->Add( mybox, wxGBPosition(2,0), wxGBSpan(2,1) );
838
839 #if wxUSE_HELP
840 for (unsigned int item = 0; item < WXSIZEOF(choices); ++item)
841 m_radio->SetItemHelpText( item, wxString::Format( wxT("Help text for \"%s\""),
842 choices[item].c_str() ) );
843
844 // erase help text for the second item
845 m_radio->SetItemHelpText( 1, wxT("") );
846 // set default help text for control
847 m_radio->SetHelpText( wxT("Default helptext for wxRadioBox") );
848 #endif // wxUSE_HELP
849
850 wxButton* select_two = new wxButton ( panel, ID_RADIOBOX_SEL_NUM, wxT("Select #&2") );
851 wxButton* select_this = new wxButton ( panel, ID_RADIOBOX_SEL_STR, wxT("&Select 'This'") );
852 m_fontButton = new wxButton ( panel, ID_SET_FONT, wxT("Set &more Italic font") );
853 wxButton* set_italic = new wxButton ( panel, ID_RADIOBOX_FONT, wxT("Set &Italic font") );
854 wxCheckBox* disable_cb = new wxCheckBox( panel, ID_RADIOBOX_ENABLE, wxT("&Disable") );
855 wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, wxT("Radiobutton1"),
856 wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
857 wxRadioButton *rb2 = new wxRadioButton( panel, ID_RADIOBUTTON_2, wxT("&Radiobutton2"),
858 wxDefaultPosition, wxDefaultSize );
859 rb->SetValue( false );
860
861 radio_page_sizer->Add( select_two, wxGBPosition(0, 1), wxDefaultSpan, wxALL , 10 );
862 radio_page_sizer->Add( select_this, wxGBPosition(1, 1), wxDefaultSpan, wxALL , 10 );
863 radio_page_sizer->Add( m_fontButton, wxGBPosition(0, 2), wxDefaultSpan, wxALL , 10 );
864 radio_page_sizer->Add( set_italic, wxGBPosition(1, 2), wxDefaultSpan, wxALL , 10 );
865 radio_page_sizer->Add( disable_cb, wxGBPosition(2, 2), wxDefaultSpan, wxLEFT | wxRIGHT, 10 );
866 radio_page_sizer->Add( rb, wxGBPosition(3, 1), wxDefaultSpan, wxLEFT | wxRIGHT, 10 );
867 radio_page_sizer->Add( rb2, wxGBPosition(3, 2), wxDefaultSpan, wxLEFT | wxRIGHT, 10 );
868
869 panel->SetSizer( radio_page_sizer );
870
871 m_book->AddPage(panel, wxT("wxRadioBox"), false, Image_Radio);
872
873 // ------------------------------------------------------------------------
874 // gauge and slider
875 // ------------------------------------------------------------------------
876
877 #if wxUSE_SLIDER && wxUSE_GAUGE
878 panel = new wxPanel(m_book);
879
880 wxBoxSizer *gauge_page_vsizer = new wxBoxSizer( wxVERTICAL );
881
882 wxBoxSizer *gauge_page_first_row_sizer = new wxBoxSizer( wxHORIZONTAL );
883
884 wxStaticBoxSizer *gauge_sizer = new wxStaticBoxSizer( wxHORIZONTAL, panel, wxT("&wxGauge and wxSlider") );
885 gauge_page_first_row_sizer->Add( gauge_sizer, 0, wxALL, 5 );
886 wxBoxSizer *sz = new wxBoxSizer( wxVERTICAL );
887 gauge_sizer->Add( sz );
888 m_gauge = new wxGauge( panel, wxID_ANY, 200, wxDefaultPosition, wxSize(155, 30), wxGA_HORIZONTAL|wxNO_BORDER );
889 sz->Add( m_gauge, 0, wxALL, 10 );
890 m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200,
891 wxDefaultPosition, wxSize(155,wxDefaultCoord),
892 wxSL_AUTOTICKS | wxSL_LABELS);
893 m_slider->SetTickFreq(40);
894 sz->Add( m_slider, 0, wxALL, 10 );
895
896 m_gaugeVert = new wxGauge( panel, wxID_ANY, 100,
897 wxDefaultPosition, wxSize(wxDefaultCoord, 90),
898 wxGA_VERTICAL | wxGA_SMOOTH | wxNO_BORDER );
899 gauge_sizer->Add( m_gaugeVert, 0, wxALL, 10 );
900
901
902
903 wxStaticBox *sb = new wxStaticBox( panel, wxID_ANY, wxT("&Explanation"),
904 wxDefaultPosition, wxDefaultSize ); //, wxALIGN_CENTER );
905 wxStaticBoxSizer *wrapping_sizer = new wxStaticBoxSizer( sb, wxVERTICAL );
906 gauge_page_first_row_sizer->Add( wrapping_sizer, 0, wxALL, 5 );
907
908 #ifdef __WXMOTIF__
909 // No wrapping text in wxStaticText yet :-(
910 m_wrappingText = new wxStaticText( panel, wxID_ANY,
911 wxT("Drag the slider!"),
912 wxPoint(250,30),
913 wxSize(240, wxDefaultCoord)
914 );
915 #else
916 m_wrappingText = new wxStaticText( panel, wxID_ANY,
917 wxT("In order see the gauge (aka progress bar) ")
918 wxT("control do something you have to drag the ")
919 wxT("handle of the slider to the right.")
920 wxT("\n\n")
921 wxT("This is also supposed to demonstrate how ")
922 wxT("to use static controls with line wrapping."),
923 wxDefaultPosition,
924 wxSize(240, wxDefaultCoord)
925 );
926 #endif
927 wrapping_sizer->Add( m_wrappingText );
928
929 wxStaticBoxSizer *non_wrapping_sizer = new wxStaticBoxSizer( wxVERTICAL, panel, wxT("Non-wrapping") );
930 gauge_page_first_row_sizer->Add( non_wrapping_sizer, 0, wxALL, 5 );
931
932 m_nonWrappingText = new wxStaticText( panel, wxID_ANY,
933 wxT("This static text has two lines.\nThey do not wrap."),
934 wxDefaultPosition,
935 wxDefaultSize
936 );
937 non_wrapping_sizer->Add( m_nonWrappingText );
938
939 gauge_page_vsizer->Add( gauge_page_first_row_sizer, 1 );
940 wxBoxSizer *gauge_page_second_row_sizer = new wxBoxSizer( wxHORIZONTAL );
941
942
943 int initialSpinValue = -5;
944 wxString s;
945 s << initialSpinValue;
946 m_spintext = new wxTextCtrl( panel, wxID_ANY, s );
947 gauge_page_second_row_sizer->Add( m_spintext, 0, wxALL, 5 );
948
949 #if wxUSE_SPINBTN
950 m_spinbutton = new wxSpinButton( panel, ID_SPIN );
951 m_spinbutton->SetRange(-40,30);
952 m_spinbutton->SetValue(initialSpinValue);
953 gauge_page_second_row_sizer->Add( m_spinbutton, 0, wxALL, 5 );
954 #endif // wxUSE_SPINBTN
955
956 #if wxUSE_SPINCTRL
957 m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, wxEmptyString );
958 m_spinctrl->SetRange(-10,30);
959 m_spinctrl->SetValue(15);
960 gauge_page_second_row_sizer->Add( m_spinctrl, 0, wxALL, 5 );
961 #endif // wxUSE_SPINCTRL
962
963 #if wxUSE_SPINBTN
964 #if wxUSE_PROGRESSDLG
965 m_btnProgress = new wxButton( panel, ID_BTNPROGRESS, wxT("&Show progress dialog") );
966 gauge_page_second_row_sizer->Add( m_btnProgress, 0, wxALL, 5 );
967 #endif // wxUSE_PROGRESSDLG
968 #endif // wxUSE_SPINBTN
969
970 wxButton* newTextButton = new wxButton( panel, ID_BTNNEWTEXT, wxT("New text"));
971 gauge_page_second_row_sizer->Add( newTextButton, 0, wxALL, 5 );
972
973 gauge_page_vsizer->Add(gauge_page_second_row_sizer, 1);
974 panel->SetSizer( gauge_page_vsizer );
975
976 m_book->AddPage(panel, wxT("wxGauge"), false, Image_Gauge);
977 #endif // wxUSE_SLIDER && wxUSE_GAUGE
978
979
980 // ------------------------------------------------------------------------
981 // wxBitmapXXX
982 // ------------------------------------------------------------------------
983
984 panel = new wxPanel(m_book);
985
986 #if !defined(__WXMOTIF__) // wxStaticBitmap not working under Motif yet.
987 wxIcon icon = wxArtProvider::GetIcon(wxART_INFORMATION);
988 (void) new wxStaticBitmap( panel, wxID_ANY, icon, wxPoint(10, 10) );
989
990 // VZ: don't leak memory
991 // bmpStatic = new wxStaticBitmap(panel, wxID_ANY, wxNullIcon, wxPoint(50, 10));
992 // bmpStatic->SetIcon(wxArtProvider::GetIcon(wxART_QUESTION));
993 #endif // !Motif
994
995 wxBitmap bitmap( 100, 100 );
996 wxMemoryDC dc;
997 dc.SelectObject( bitmap );
998 dc.SetBackground(*wxGREEN);
999 dc.SetPen(*wxRED_PEN);
1000 dc.Clear();
1001 dc.DrawEllipse(5, 5, 90, 90);
1002 dc.DrawText(wxT("Bitmap"), 30, 40);
1003 dc.SelectObject( wxNullBitmap );
1004
1005 wxPanel *panel2 = new wxPanel(panel, -1, wxPoint(100, 0), wxSize(100, 200));
1006 (void)new wxBitmapButton(panel2, ID_BITMAP_BTN, bitmap, wxPoint(0, 20));
1007 (void)new wxToggleButton(panel2, ID_BITMAP_BTN_ENABLE,
1008 wxT("Enable/disable &bitmap"), wxPoint(0, 140));
1009
1010 #if defined(__WXMSW__) || defined(__WXMOTIF__)
1011 // test for masked bitmap display
1012 bitmap = wxBitmap(wxT("test2.bmp"), wxBITMAP_TYPE_BMP);
1013 if (bitmap.IsOk())
1014 {
1015 bitmap.SetMask(new wxMask(bitmap, *wxBLUE));
1016
1017 (void)new wxStaticBitmap(panel, wxID_ANY, bitmap, wxPoint(300, 120));
1018 }
1019 #endif
1020
1021 wxBitmap bmp1(wxArtProvider::GetBitmap(wxART_INFORMATION)),
1022 bmp2(wxArtProvider::GetBitmap(wxART_WARNING)),
1023 bmp3(wxArtProvider::GetBitmap(wxART_QUESTION));
1024 wxBitmapButton *bmpBtn = new wxBitmapButton
1025 (
1026 panel, wxID_ANY,
1027 bmp1,
1028 wxPoint(30, 70)
1029 );
1030
1031 bmpBtn->SetBitmapSelected(bmp2);
1032 bmpBtn->SetBitmapFocus(bmp3);
1033
1034 (void)new wxToggleButton(panel, ID_BUTTON_LABEL,
1035 wxT("&Toggle label"), wxPoint(250, 20));
1036
1037 m_label = new wxStaticText(panel, wxID_ANY, wxT("Label with some long text"),
1038 wxPoint(250, 60), wxDefaultSize,
1039 wxALIGN_RIGHT /*| wxST_NO_AUTORESIZE*/);
1040 m_label->SetForegroundColour( *wxBLUE );
1041
1042 m_book->AddPage(panel, wxT("wxBitmapXXX"));
1043
1044 // ------------------------------------------------------------------------
1045 // sizer page
1046 // ------------------------------------------------------------------------
1047
1048 panel = new wxPanel(m_book);
1049
1050 wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
1051
1052 wxStaticBoxSizer *csizer =
1053 new wxStaticBoxSizer (new wxStaticBox (panel, wxID_ANY, wxT("Show Buttons")), wxHORIZONTAL );
1054
1055 wxCheckBox *check1, *check2, *check3, *check4, *check14, *checkBig;
1056 check1 = new wxCheckBox (panel, ID_SIZER_CHECK1, wxT("1"));
1057 check1->SetValue (true);
1058 csizer->Add (check1);
1059 check2 = new wxCheckBox (panel, ID_SIZER_CHECK2, wxT("2"));
1060 check2->SetValue (true);
1061 csizer->Add (check2);
1062 check3 = new wxCheckBox (panel, ID_SIZER_CHECK3, wxT("3"));
1063 check3->SetValue (true);
1064 csizer->Add (check3);
1065 check4 = new wxCheckBox (panel, ID_SIZER_CHECK4, wxT("4"));
1066 check4->SetValue (true);
1067 csizer->Add (check4);
1068 check14 = new wxCheckBox (panel, ID_SIZER_CHECK14, wxT("1-4"));
1069 check14->SetValue (true);
1070 csizer->Add (check14);
1071 checkBig = new wxCheckBox (panel, ID_SIZER_CHECKBIG, wxT("Big"));
1072 checkBig->SetValue (true);
1073 csizer->Add (checkBig);
1074
1075 sizer->Add (csizer);
1076
1077 m_hsizer = new wxBoxSizer( wxHORIZONTAL );
1078
1079 m_buttonSizer = new wxBoxSizer (wxVERTICAL);
1080
1081 m_sizerBtn1 = new wxButton(panel, wxID_ANY, wxT("Test Button &1 (tab order 1)") );
1082 m_buttonSizer->Add( m_sizerBtn1, 0, wxALL, 10 );
1083 m_sizerBtn2 = new wxButton(panel, wxID_ANY, wxT("Test Button &2 (tab order 3)") );
1084 m_buttonSizer->Add( m_sizerBtn2, 0, wxALL, 10 );
1085 m_sizerBtn3 = new wxButton(panel, wxID_ANY, wxT("Test Button &3 (tab order 2)") );
1086 m_buttonSizer->Add( m_sizerBtn3, 0, wxALL, 10 );
1087 m_sizerBtn4 = new wxButton(panel, wxID_ANY, wxT("Test Button &4 (tab order 4)") );
1088 m_buttonSizer->Add( m_sizerBtn4, 0, wxALL, 10 );
1089
1090 m_sizerBtn3->MoveBeforeInTabOrder(m_sizerBtn2);
1091
1092 m_hsizer->Add (m_buttonSizer);
1093 m_hsizer->Add( 20,20, 1 );
1094 m_bigBtn = new wxButton(panel, wxID_ANY, wxT("Multiline\nbutton") );
1095 m_hsizer->Add( m_bigBtn , 3, wxGROW|wxALL, 10 );
1096
1097 sizer->Add (m_hsizer, 1, wxGROW);
1098
1099 panel->SetSizer( sizer );
1100
1101 m_book->AddPage(panel, wxT("wxSizer"));
1102
1103 // set the sizer for the panel itself
1104 sizer = new wxBoxSizer(wxVERTICAL);
1105 sizer->Add(m_book, wxSizerFlags().Border().Expand());
1106 sizer->Add(m_text, wxSizerFlags(1).Border().Expand());
1107 SetSizer(sizer);
1108
1109 #if wxUSE_TOOLTIPS
1110 SetAllToolTips();
1111 #endif // wxUSE_TOOLTIPS
1112 }
1113
1114 #if wxUSE_TOOLTIPS
1115
1116 namespace
1117 {
1118
1119 void ResetToolTip(wxWindow *win, const char *tip)
1120 {
1121 wxCHECK_RET( win, "NULL window?" );
1122
1123 win->UnsetToolTip();
1124 win->SetToolTip(tip);
1125 }
1126
1127 }
1128
1129 void MyPanel::SetAllToolTips()
1130 {
1131 ResetToolTip(FindWindow(ID_LISTBOX_FONT), "Press here to set italic font");
1132 ResetToolTip(m_checkbox, "Click here to disable the listbox");
1133 ResetToolTip(m_listbox, "This is a list box");
1134 ResetToolTip(m_combo, "This is a natural\ncombobox - can you believe me?");
1135 ResetToolTip(m_slider, "This is a sliding slider");
1136 ResetToolTip(FindWindow(ID_RADIOBOX2), "Ever seen a radiobox?");
1137
1138 //ResetToolTip(m_radio, "Tooltip for the entire radiobox");
1139 for ( unsigned int nb = 0; nb < m_radio->GetCount(); nb++ )
1140 {
1141 m_radio->SetItemToolTip(nb, "");
1142 m_radio->SetItemToolTip(nb, "tooltip for\n" + m_radio->GetString(nb));
1143 }
1144
1145 // remove the tooltip for one of the items
1146 m_radio->SetItemToolTip(2, "");
1147 }
1148 #endif // wxUSE_TOOLTIPS
1149
1150 void MyPanel::OnIdle(wxIdleEvent& event)
1151 {
1152 static const int INVALID_SELECTION = -2;
1153
1154 static int s_selCombo = INVALID_SELECTION;
1155
1156 if (!m_combo || !m_choice)
1157 {
1158 event.Skip();
1159 return;
1160 }
1161
1162 int sel = m_combo->GetSelection();
1163 if ( sel != s_selCombo )
1164 {
1165 if ( s_selCombo != INVALID_SELECTION )
1166 {
1167 wxLogMessage(wxT("EVT_IDLE: combobox selection changed from %d to %d"),
1168 s_selCombo, sel);
1169 }
1170
1171 s_selCombo = sel;
1172 }
1173
1174 static int s_selChoice = INVALID_SELECTION;
1175 sel = m_choice->GetSelection();
1176 if ( sel != s_selChoice )
1177 {
1178 if ( s_selChoice != INVALID_SELECTION )
1179 {
1180 wxLogMessage(wxT("EVT_IDLE: choice selection changed from %d to %d"),
1181 s_selChoice, sel);
1182 }
1183
1184 s_selChoice = sel;
1185 }
1186
1187 event.Skip();
1188 }
1189
1190 void MyPanel::OnPageChanging( wxBookCtrlEvent &event )
1191 {
1192 int selOld = event.GetOldSelection();
1193 if ( selOld == 2 )
1194 {
1195 if ( wxMessageBox(wxT("This demonstrates how a program may prevent the\n")
1196 wxT("page change from taking place - if you select\n")
1197 wxT("[No] the current page will stay the third one\n"),
1198 wxT("Control sample"),
1199 wxICON_QUESTION | wxYES_NO, this) != wxYES )
1200 {
1201 event.Veto();
1202
1203 return;
1204 }
1205 }
1206
1207 *m_text << wxT("Book selection is being changed from ") << selOld
1208 << wxT(" to ") << event.GetSelection()
1209 << wxT(" (current page from book is ")
1210 << m_book->GetSelection() << wxT(")\n");
1211 }
1212
1213 void MyPanel::OnPageChanged( wxBookCtrlEvent &event )
1214 {
1215 *m_text << wxT("Book selection is now ") << event.GetSelection()
1216 << wxT(" (from book: ") << m_book->GetSelection()
1217 << wxT(")\n");
1218 }
1219
1220 void MyPanel::OnTestButton(wxCommandEvent& event)
1221 {
1222 wxLogMessage(wxT("Button %c clicked."),
1223 event.GetId() == ID_BUTTON_TEST1 ? wxT('1') : wxT('2'));
1224 }
1225
1226 void MyPanel::OnBmpButton(wxCommandEvent& WXUNUSED(event))
1227 {
1228 wxLogMessage(wxT("Bitmap button clicked."));
1229 }
1230
1231 void MyPanel::OnBmpButtonToggle(wxCommandEvent& event)
1232 {
1233 FindWindow(ID_BITMAP_BTN)->Enable(!event.IsChecked());
1234 }
1235
1236 void MyPanel::OnChangeColour(wxCommandEvent& WXUNUSED(event))
1237 {
1238 static wxColour s_colOld;
1239
1240 SetThemeEnabled(false);
1241 // test panel colour changing and propagation to the subcontrols
1242 if ( s_colOld.IsOk() )
1243 {
1244 SetBackgroundColour(s_colOld);
1245 s_colOld = wxNullColour;
1246
1247 m_lbSelectThis->SetForegroundColour(wxNullColour);
1248 m_lbSelectThis->SetBackgroundColour(wxNullColour);
1249 }
1250 else
1251 {
1252 s_colOld = wxColour(wxT("red"));
1253 SetBackgroundColour(wxT("white"));
1254
1255 m_lbSelectThis->SetForegroundColour(wxT("white"));
1256 m_lbSelectThis->SetBackgroundColour(wxT("red"));
1257 }
1258
1259 m_lbSelectThis->Refresh();
1260 Refresh();
1261 }
1262
1263 void MyPanel::OnListBox( wxCommandEvent &event )
1264 {
1265 wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
1266 : m_listboxSorted;
1267
1268 bool deselect = false;
1269 if (listbox->HasFlag(wxLB_MULTIPLE) || listbox->HasFlag(wxLB_EXTENDED))
1270 {
1271 deselect = !event.IsSelection();
1272 if (deselect)
1273 m_text->AppendText( wxT("ListBox deselection event\n") );
1274 }
1275
1276 m_text->AppendText( wxT("ListBox event selection string is: '") );
1277 m_text->AppendText( event.GetString() );
1278 m_text->AppendText( wxT("'\n") );
1279
1280 // can't use GetStringSelection() with multiple selections, there could be
1281 // more than one of them
1282 if ( !listbox->HasFlag(wxLB_MULTIPLE) && !listbox->HasFlag(wxLB_EXTENDED) )
1283 {
1284 m_text->AppendText( wxT("ListBox control selection string is: '") );
1285 m_text->AppendText( listbox->GetStringSelection() );
1286 m_text->AppendText( wxT("'\n") );
1287 }
1288
1289 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
1290 m_text->AppendText( wxT("ListBox event client data string is: '") );
1291 if (obj) // BC++ doesn't like use of '? .. : .. ' in this context
1292 m_text->AppendText( obj->GetData() );
1293 else
1294 m_text->AppendText( wxString(wxT("none")) );
1295
1296 m_text->AppendText( wxT("'\n") );
1297 m_text->AppendText( wxT("ListBox control client data string is: '") );
1298 obj = (wxStringClientData *)listbox->GetClientObject(event.GetInt());
1299 if (obj)
1300 m_text->AppendText( obj->GetData() );
1301 else
1302 m_text->AppendText( wxString(wxT("none")) );
1303 m_text->AppendText( wxT("'\n") );
1304 }
1305
1306 void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
1307 {
1308 m_text->AppendText( wxT("ListBox double click string is: ") );
1309 m_text->AppendText( event.GetString() );
1310 m_text->AppendText( wxT("\n") );
1311 }
1312
1313 void MyPanel::OnListBoxButtons( wxCommandEvent &event )
1314 {
1315 switch (event.GetId())
1316 {
1317 case ID_LISTBOX_ENABLE:
1318 {
1319 m_text->AppendText(wxT("Checkbox clicked.\n"));
1320 #if wxUSE_TOOLTIPS
1321 wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
1322 if (event.GetInt())
1323 cb->SetToolTip( wxT("Click to enable listbox") );
1324 else
1325 cb->SetToolTip( wxT("Click to disable listbox") );
1326 #endif // wxUSE_TOOLTIPS
1327 m_listbox->Enable( event.GetInt() == 0 );
1328 m_lbSelectThis->Enable( event.GetInt() == 0 );
1329 m_lbSelectNum->Enable( event.GetInt() == 0 );
1330 m_listboxSorted->Enable( event.GetInt() == 0 );
1331 FindWindow(ID_CHANGE_COLOUR)->Enable( event.GetInt() == 0 );
1332 break;
1333 }
1334 case ID_LISTBOX_SEL_NUM:
1335 {
1336 if (m_listbox->GetCount() > 2)
1337 m_listbox->SetSelection( 2 );
1338 if (m_listboxSorted->GetCount() > 2)
1339 m_listboxSorted->SetSelection( 2 );
1340 m_lbSelectThis->WarpPointer( 40, 14 );
1341 break;
1342 }
1343 case ID_LISTBOX_SEL_STR:
1344 {
1345 if (m_listbox->FindString(wxT("This")) != wxNOT_FOUND)
1346 m_listbox->SetStringSelection( wxT("This") );
1347 if (m_listboxSorted->FindString(wxT("This")) != wxNOT_FOUND)
1348 m_listboxSorted->SetStringSelection( wxT("This") );
1349 m_lbSelectNum->WarpPointer( 40, 14 );
1350 break;
1351 }
1352 case ID_LISTBOX_CLEAR:
1353 {
1354 m_listbox->Clear();
1355 m_listboxSorted->Clear();
1356 break;
1357 }
1358 case ID_LISTBOX_APPEND:
1359 {
1360 m_listbox->Append( wxT("Hi kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk!") );
1361 m_listboxSorted->Append( wxT("Hi hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh!") );
1362 break;
1363 }
1364 case ID_LISTBOX_DELETE:
1365 {
1366 int idx;
1367 idx = m_listbox->GetSelection();
1368 if ( idx != wxNOT_FOUND )
1369 m_listbox->Delete( idx );
1370 idx = m_listboxSorted->GetSelection();
1371 if ( idx != wxNOT_FOUND )
1372 m_listboxSorted->Delete( idx );
1373 break;
1374 }
1375 case ID_LISTBOX_FONT:
1376 {
1377 m_listbox->SetFont( *wxITALIC_FONT );
1378 m_listboxSorted->SetFont( *wxITALIC_FONT );
1379 m_checkbox->SetFont( *wxITALIC_FONT );
1380 break;
1381 }
1382 }
1383 }
1384
1385 #if wxUSE_CHOICE
1386
1387 static wxString GetDataString(wxClientData *data)
1388 {
1389 return data ? static_cast<wxStringClientData *>(data)->GetData()
1390 : wxString("none");
1391 }
1392
1393 void MyPanel::OnChoice( wxCommandEvent &event )
1394 {
1395 wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice
1396 : m_choiceSorted;
1397
1398 const int sel = choice->GetSelection();
1399
1400 wxClientData *dataEvt = event.GetClientObject(),
1401 *dataCtrl = choice->GetClientObject(sel);
1402
1403 wxLogMessage(wxT("EVT_CHOICE: item %d/%d (event/control), ")
1404 wxT("string \"%s\"/\"%s\", ")
1405 wxT("data \"%s\"/\"%s\""),
1406 (int)event.GetInt(),
1407 sel,
1408 event.GetString(),
1409 choice->GetStringSelection(),
1410 GetDataString(dataEvt),
1411 GetDataString(dataCtrl));
1412 }
1413
1414 void MyPanel::OnChoiceButtons( wxCommandEvent &event )
1415 {
1416 switch (event.GetId())
1417 {
1418 case ID_CHOICE_ENABLE:
1419 {
1420 m_choice->Enable( event.GetInt() == 0 );
1421 m_choiceSorted->Enable( event.GetInt() == 0 );
1422 break;
1423 }
1424 case ID_CHOICE_SEL_NUM:
1425 {
1426 m_choice->SetSelection( 2 );
1427 m_choiceSorted->SetSelection( 2 );
1428 break;
1429 }
1430 case ID_CHOICE_SEL_STR:
1431 {
1432 m_choice->SetStringSelection( wxT("This") );
1433 m_choiceSorted->SetStringSelection( wxT("This") );
1434 break;
1435 }
1436 case ID_CHOICE_CLEAR:
1437 {
1438 m_choice->Clear();
1439 m_choiceSorted->Clear();
1440 break;
1441 }
1442 case ID_CHOICE_APPEND:
1443 {
1444 m_choice->Append( wxT("Hi!") );
1445 m_choiceSorted->Append( wxT("Hi!") );
1446 break;
1447 }
1448 case ID_CHOICE_DELETE:
1449 {
1450 int idx = m_choice->GetSelection();
1451 if ( idx != wxNOT_FOUND )
1452 m_choice->Delete( idx );
1453 idx = m_choiceSorted->GetSelection();
1454 if ( idx != wxNOT_FOUND )
1455 m_choiceSorted->Delete( idx );
1456 break;
1457 }
1458 case ID_CHOICE_FONT:
1459 {
1460 m_choice->SetFont( *wxITALIC_FONT );
1461 m_choiceSorted->SetFont( *wxITALIC_FONT );
1462 break;
1463 }
1464 }
1465 }
1466 #endif // wxUSE_CHOICE
1467
1468 void MyPanel::OnCombo( wxCommandEvent &event )
1469 {
1470 if (!m_combo)
1471 return;
1472
1473 wxLogMessage(wxT("EVT_COMBOBOX: item %d/%d (event/control), string \"%s\"/\"%s\""),
1474 (int)event.GetInt(),
1475 m_combo->GetSelection(),
1476 event.GetString().c_str(),
1477 m_combo->GetStringSelection().c_str());
1478 }
1479
1480 void MyPanel::OnComboTextChanged(wxCommandEvent& event)
1481 {
1482 if (m_combo)
1483 {
1484 wxLogMessage(wxT("EVT_TEXT for the combobox: \"%s\" (event) or \"%s\" (control)."),
1485 event.GetString().c_str(),
1486 m_combo->GetValue().c_str());
1487 }
1488 }
1489
1490 void MyPanel::OnComboTextEnter(wxCommandEvent& WXUNUSED(event))
1491 {
1492 if (m_combo)
1493 {
1494 wxLogMessage(wxT("Enter pressed in the combobox: value is '%s'."),
1495 m_combo->GetValue().c_str());
1496 }
1497 }
1498
1499 void MyPanel::OnComboButtons( wxCommandEvent &event )
1500 {
1501 switch (event.GetId())
1502 {
1503 case ID_COMBO_ENABLE:
1504 {
1505 m_combo->Enable( event.GetInt() == 0 );
1506 break;
1507 }
1508 case ID_COMBO_SEL_NUM:
1509 {
1510 m_combo->SetSelection( 2 );
1511 break;
1512 }
1513 case ID_COMBO_SEL_STR:
1514 {
1515 m_combo->SetStringSelection( wxT("This") );
1516 break;
1517 }
1518 case ID_COMBO_CLEAR:
1519 {
1520 m_combo->Clear();
1521 break;
1522 }
1523 case ID_COMBO_APPEND:
1524 {
1525 m_combo->Append( wxT("Hi!") );
1526 break;
1527 }
1528 case ID_COMBO_DELETE:
1529 {
1530 int idx = m_combo->GetSelection();
1531 m_combo->Delete( idx );
1532 break;
1533 }
1534 case ID_COMBO_FONT:
1535 {
1536 m_combo->SetFont( *wxITALIC_FONT );
1537 break;
1538 }
1539 case ID_COMBO_SET_TEXT:
1540 {
1541 m_combo->SetString( 2, wxT("Hi!") );
1542 break;
1543 }
1544 }
1545 }
1546
1547 void MyPanel::OnRadio( wxCommandEvent &event )
1548 {
1549 m_text->AppendText( wxT("RadioBox selection string is: ") );
1550 m_text->AppendText( event.GetString() );
1551 m_text->AppendText( wxT("\n") );
1552 }
1553
1554 void MyPanel::OnRadioButton1( wxCommandEvent & WXUNUSED(event) )
1555 {
1556 wxMessageBox(wxT("First wxRadioButton selected."), wxT("wxControl sample"));
1557 }
1558
1559 void MyPanel::OnRadioButton2( wxCommandEvent & WXUNUSED(event) )
1560 {
1561 m_text->AppendText(wxT("Second wxRadioButton selected.\n"));
1562 }
1563
1564 void MyPanel::OnRadioButtons( wxCommandEvent &event )
1565 {
1566 switch (event.GetId())
1567 {
1568 case ID_RADIOBOX_ENABLE:
1569 m_radio->Enable( event.GetInt() == 0 );
1570 break;
1571
1572 case ID_RADIOBOX_SEL_NUM:
1573 m_radio->SetSelection( 2 );
1574 break;
1575
1576 case ID_RADIOBOX_SEL_STR:
1577 m_radio->SetStringSelection( wxT("This") );
1578 break;
1579
1580 case ID_RADIOBOX_FONT:
1581 m_radio->SetFont( *wxITALIC_FONT );
1582 break;
1583 }
1584 }
1585
1586 void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) )
1587 {
1588 m_fontButton->SetFont( *wxITALIC_FONT );
1589 m_text->SetFont( *wxITALIC_FONT );
1590 }
1591
1592 void MyPanel::OnUpdateLabel( wxCommandEvent &event )
1593 {
1594 m_label->SetLabel(event.GetInt() ? wxT("Very very very very very long text.")
1595 : wxT("Shorter text."));
1596 }
1597
1598 #if wxUSE_SLIDER
1599
1600 void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
1601 {
1602 #if wxUSE_GAUGE
1603 m_gauge->SetValue( m_slider->GetValue() );
1604 m_gaugeVert->SetValue( m_slider->GetValue() / 2 );
1605 #endif // wxUSE_GAUGE
1606 }
1607
1608 #endif // wxUSE_SLIDER
1609
1610 #if wxUSE_SPINCTRL
1611
1612 void MyPanel::OnSpinCtrlText(wxCommandEvent& event)
1613 {
1614 if ( m_spinctrl )
1615 {
1616 wxString s;
1617 s.Printf( wxT("Spin ctrl text changed: now %d (from event: %s)\n"),
1618 m_spinctrl->GetValue(), event.GetString().c_str() );
1619 m_text->AppendText(s);
1620 }
1621 }
1622
1623 void MyPanel::OnSpinCtrl(wxSpinEvent& event)
1624 {
1625 if ( m_spinctrl )
1626 {
1627 wxString s;
1628 s.Printf( wxT("Spin ctrl changed: now %d (from event: %d)\n"),
1629 m_spinctrl->GetValue(), event.GetInt() );
1630 m_text->AppendText(s);
1631 }
1632 }
1633
1634 void MyPanel::OnSpinCtrlUp(wxSpinEvent& event)
1635 {
1636 if ( m_spinctrl )
1637 {
1638 m_text->AppendText( wxString::Format(
1639 wxT("Spin up: %d (from event: %d)\n"),
1640 m_spinctrl->GetValue(), event.GetInt() ) );
1641 }
1642 }
1643
1644 void MyPanel::OnSpinCtrlDown(wxSpinEvent& event)
1645 {
1646 if ( m_spinctrl )
1647 {
1648 m_text->AppendText( wxString::Format(
1649 wxT("Spin down: %d (from event: %d)\n"),
1650 m_spinctrl->GetValue(), event.GetInt() ) );
1651 }
1652 }
1653
1654 #endif // wxUSE_SPINCTRL
1655
1656 #if wxUSE_SPINBTN
1657 void MyPanel::OnSpinUp( wxSpinEvent &event )
1658 {
1659 wxString value;
1660 value.Printf( wxT("Spin control up: current = %d\n"),
1661 m_spinbutton->GetValue());
1662
1663 if ( event.GetPosition() > 17 )
1664 {
1665 value += wxT("Preventing the spin button from going above 17.\n");
1666
1667 event.Veto();
1668 }
1669
1670 m_text->AppendText(value);
1671 }
1672
1673 void MyPanel::OnSpinDown( wxSpinEvent &event )
1674 {
1675 wxString value;
1676 value.Printf( wxT("Spin control down: current = %d\n"),
1677 m_spinbutton->GetValue());
1678
1679 if ( event.GetPosition() < -17 )
1680 {
1681 value += wxT("Preventing the spin button from going below -17.\n");
1682
1683 event.Veto();
1684 }
1685
1686 m_text->AppendText(value);
1687 }
1688
1689 void MyPanel::OnSpinUpdate( wxSpinEvent &event )
1690 {
1691 wxString value;
1692 value.Printf( wxT("%d"), event.GetPosition() );
1693 m_spintext->SetValue( value );
1694
1695 value.Printf( wxT("Spin control range: (%d, %d), current = %d\n"),
1696 m_spinbutton->GetMin(), m_spinbutton->GetMax(),
1697 m_spinbutton->GetValue());
1698
1699 m_text->AppendText(value);
1700 }
1701
1702 void MyPanel::OnNewText( wxCommandEvent& /* event */)
1703 {
1704 m_nonWrappingText->SetLabel( wxT("This text is short\nbut still spans\nover three lines.") );
1705 m_wrappingText->SetLabel( wxT("This text is short but will still be wrapped if it is too long.") );
1706 m_wrappingText->GetParent()->Layout();
1707 }
1708
1709 #if wxUSE_PROGRESSDLG
1710
1711 void MyPanel::OnUpdateShowProgress( wxUpdateUIEvent& event )
1712 {
1713 event.Enable( m_spinbutton->GetValue() > 0 );
1714 }
1715
1716 void MyPanel::OnShowProgress( wxCommandEvent& WXUNUSED(event) )
1717 {
1718 int max = m_spinbutton->GetValue();
1719
1720 if ( max <= 0 )
1721 {
1722 wxLogError(wxT("You must set positive range!"));
1723 return;
1724 }
1725
1726 wxProgressDialog dialog(wxT("Progress dialog example"),
1727 wxT("An informative message"),
1728 max, // range
1729 this, // parent
1730 wxPD_CAN_ABORT |
1731 wxPD_AUTO_HIDE |
1732 wxPD_APP_MODAL |
1733 wxPD_ELAPSED_TIME |
1734 wxPD_ESTIMATED_TIME |
1735 wxPD_REMAINING_TIME);
1736
1737
1738 bool cont = true;
1739 for ( int i = 0; i <= max && cont; i++ )
1740 {
1741 wxSleep(1);
1742 if ( i == max )
1743 {
1744 cont = dialog.Update(i, wxT("That's all, folks!"));
1745 }
1746 else if ( i == max / 2 )
1747 {
1748 cont = dialog.Update(i, wxT("Only a half left (very long message)!"));
1749 }
1750 else
1751 {
1752 cont = dialog.Update(i);
1753 }
1754 }
1755
1756 if ( !cont )
1757 {
1758 *m_text << wxT("Progress dialog aborted!\n");
1759 }
1760 else
1761 {
1762 *m_text << wxT("Countdown from ") << max << wxT(" finished.\n");
1763 }
1764 }
1765
1766 #endif // wxUSE_PROGRESSDLG
1767 #endif // wxUSE_SPINBTN
1768
1769 void MyPanel::OnSizerCheck( wxCommandEvent &event)
1770 {
1771 switch (event.GetId ()) {
1772 case ID_SIZER_CHECK1:
1773 m_buttonSizer->Show (m_sizerBtn1, event.IsChecked ());
1774 m_buttonSizer->Layout ();
1775 break;
1776 case ID_SIZER_CHECK2:
1777 m_buttonSizer->Show (m_sizerBtn2, event.IsChecked ());
1778 m_buttonSizer->Layout ();
1779 break;
1780 case ID_SIZER_CHECK3:
1781 m_buttonSizer->Show (m_sizerBtn3, event.IsChecked ());
1782 m_buttonSizer->Layout ();
1783 break;
1784 case ID_SIZER_CHECK4:
1785 m_buttonSizer->Show (m_sizerBtn4, event.IsChecked ());
1786 m_buttonSizer->Layout ();
1787 break;
1788 case ID_SIZER_CHECK14:
1789 m_hsizer->Show (m_buttonSizer, event.IsChecked ());
1790 m_hsizer->Layout ();
1791 break;
1792 case ID_SIZER_CHECKBIG:
1793 m_hsizer->Show (m_bigBtn, event.IsChecked ());
1794 m_hsizer->Layout ();
1795 break;
1796 }
1797
1798 }
1799
1800 MyPanel::~MyPanel()
1801 {
1802 //wxLog::RemoveTraceMask(wxT("focus"));
1803 delete wxLog::SetActiveTarget(m_logTargetOld);
1804
1805 delete m_book->GetImageList();
1806 }
1807
1808 //----------------------------------------------------------------------
1809 // MyFrame
1810 //----------------------------------------------------------------------
1811
1812 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1813 EVT_MENU(CONTROLS_QUIT, MyFrame::OnQuit)
1814 EVT_MENU(CONTROLS_ABOUT, MyFrame::OnAbout)
1815 EVT_MENU(CONTROLS_CLEAR_LOG, MyFrame::OnClearLog)
1816 #if wxUSE_TOOLTIPS
1817 EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1818 EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
1819 #ifdef __WXMSW__
1820 EVT_MENU(CONTROLS_SET_TOOLTIPS_MAX_WIDTH, MyFrame::OnSetMaxTooltipWidth)
1821 #endif // __WXMSW__
1822 #endif // wxUSE_TOOLTIPS
1823
1824 EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
1825 EVT_MENU(CONTROLS_HIDE_ALL, MyFrame::OnHideAll)
1826 EVT_MENU(CONTROLS_HIDE_LIST, MyFrame::OnHideList)
1827 EVT_MENU(CONTROLS_CONTEXT_HELP, MyFrame::OnContextHelp)
1828
1829 EVT_ICONIZE(MyFrame::OnIconized)
1830 EVT_MAXIMIZE(MyFrame::OnMaximized)
1831 EVT_SIZE(MyFrame::OnSize)
1832 EVT_MOVE(MyFrame::OnMove)
1833
1834 EVT_IDLE(MyFrame::OnIdle)
1835 END_EVENT_TABLE()
1836
1837 MyFrame::MyFrame(const wxChar *title, int x, int y)
1838 : wxFrame(NULL, wxID_ANY, title, wxPoint(x, y), wxSize(700, 450))
1839 {
1840 SetHelpText( wxT("Controls sample demonstrating various widgets") );
1841
1842 // Give it an icon
1843 // The wxICON() macros loads an icon from a resource under Windows
1844 // and uses an #included XPM image under GTK+ and Motif
1845
1846 SetIcon( wxICON(sample) );
1847
1848 wxMenu *file_menu = new wxMenu;
1849
1850 file_menu->Append(CONTROLS_CLEAR_LOG, wxT("&Clear log\tCtrl-L"));
1851 file_menu->AppendSeparator();
1852 file_menu->Append(CONTROLS_ABOUT, wxT("&About\tF1"));
1853 file_menu->AppendSeparator();
1854 file_menu->Append(CONTROLS_QUIT, wxT("E&xit\tAlt-X"), wxT("Quit controls sample"));
1855
1856 wxMenuBar *menu_bar = new wxMenuBar;
1857 menu_bar->Append(file_menu, wxT("&File"));
1858
1859 #if wxUSE_TOOLTIPS
1860 wxMenu *tooltip_menu = new wxMenu;
1861 tooltip_menu->Append(CONTROLS_SET_TOOLTIP_DELAY, wxT("Set &delay\tCtrl-D"));
1862 tooltip_menu->AppendSeparator();
1863 tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, wxT("&Toggle tooltips\tCtrl-T"),
1864 wxT("enable/disable tooltips"), true);
1865 tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, true);
1866 #ifdef __WXMSW__
1867 tooltip_menu->Append(CONTROLS_SET_TOOLTIPS_MAX_WIDTH, "Set maximal &width");
1868 #endif // __WXMSW__
1869 menu_bar->Append(tooltip_menu, wxT("&Tooltips"));
1870 #endif // wxUSE_TOOLTIPS
1871
1872 wxMenu *panel_menu = new wxMenu;
1873 panel_menu->Append(CONTROLS_ENABLE_ALL, wxT("&Disable all\tCtrl-E"),
1874 wxT("Enable/disable all panel controls"), true);
1875 panel_menu->Append(CONTROLS_HIDE_ALL, wxT("&Hide all\tCtrl-I"),
1876 wxT("Show/hide thoe whole panel controls"), true);
1877 panel_menu->Append(CONTROLS_HIDE_LIST, wxT("Hide &list ctrl\tCtrl-S"),
1878 wxT("Enable/disable all panel controls"), true);
1879 panel_menu->Append(CONTROLS_CONTEXT_HELP, wxT("&Context help...\tCtrl-H"),
1880 wxT("Get context help for a control"));
1881 menu_bar->Append(panel_menu, wxT("&Panel"));
1882
1883 SetMenuBar(menu_bar);
1884
1885 #if wxUSE_STATUSBAR
1886 CreateStatusBar(2);
1887 #endif // wxUSE_STATUSBAR
1888
1889 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1890 }
1891
1892 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1893 {
1894 Close(true);
1895 }
1896
1897 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1898 {
1899 wxBusyCursor bc;
1900
1901 wxMessageDialog dialog(this, wxT("This is a control sample"), wxT("About Controls"), wxOK );
1902 dialog.ShowModal();
1903 }
1904
1905 void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
1906 {
1907 m_panel->m_text->Clear();
1908 }
1909
1910 #if wxUSE_TOOLTIPS
1911 void MyFrame::OnSetTooltipDelay(wxCommandEvent& WXUNUSED(event))
1912 {
1913 static long s_delay = 5000;
1914
1915 wxString delay;
1916 delay.Printf( wxT("%ld"), s_delay);
1917
1918 delay = wxGetTextFromUser(wxT("Enter delay (in milliseconds)"),
1919 wxT("Set tooltip delay"),
1920 delay,
1921 this);
1922 if ( !delay )
1923 return; // cancelled
1924
1925 wxSscanf(delay, wxT("%ld"), &s_delay);
1926
1927 wxToolTip::SetDelay(s_delay);
1928
1929 wxLogStatus(this, wxT("Tooltip delay set to %ld milliseconds"), s_delay);
1930 }
1931
1932 void MyFrame::OnToggleTooltips(wxCommandEvent& WXUNUSED(event))
1933 {
1934 static bool s_enabled = true;
1935
1936 s_enabled = !s_enabled;
1937
1938 wxToolTip::Enable(s_enabled);
1939
1940 wxLogStatus(this, wxT("Tooltips %sabled"), s_enabled ? wxT("en") : wxT("dis") );
1941 }
1942
1943 #ifdef __WXMSW__
1944
1945 void MyFrame::OnSetMaxTooltipWidth(wxCommandEvent& WXUNUSED(event))
1946 {
1947 static int s_maxWidth = 0;
1948
1949 wxNumberEntryDialog dlg
1950 (
1951 this,
1952 "Change maximal tooltip width",
1953 "&Width in pixels:",
1954 GetTitle(),
1955 s_maxWidth,
1956 -1,
1957 600
1958 );
1959 if ( dlg.ShowModal() == wxID_CANCEL )
1960 return;
1961
1962 s_maxWidth = dlg.GetValue();
1963 wxToolTip::SetMaxWidth(s_maxWidth);
1964
1965 // we need to set the tooltip again to test the new width
1966 m_panel->SetAllToolTips();
1967 }
1968
1969 #endif // __WXMSW__
1970
1971 #endif // wxUSE_TOOLTIPS
1972
1973 void MyFrame::OnEnableAll(wxCommandEvent& WXUNUSED(event))
1974 {
1975 static bool s_enable = true;
1976
1977 s_enable = !s_enable;
1978 m_panel->Enable(s_enable);
1979 static bool s_enableCheckbox = true;
1980 if ( !s_enable )
1981 {
1982 // this is a test for correct behaviour of either enabling or disabling
1983 // a child when its parent is disabled: the checkbox should have the
1984 // correct state when the parent is enabled back
1985 m_panel->m_checkbox->Enable(s_enableCheckbox);
1986 s_enableCheckbox = !s_enableCheckbox;
1987 }
1988 }
1989
1990 void MyFrame::OnHideAll(wxCommandEvent& WXUNUSED(event))
1991 {
1992 static bool s_show = true;
1993
1994 s_show = !s_show;
1995 m_panel->Show(s_show);
1996 }
1997
1998 void MyFrame::OnHideList(wxCommandEvent& WXUNUSED(event))
1999 {
2000 static bool s_show = true;
2001
2002 s_show = !s_show;
2003 m_panel->m_listbox->Show(s_show);
2004 }
2005
2006 void MyFrame::OnContextHelp(wxCommandEvent& WXUNUSED(event))
2007 {
2008 // starts a local event loop
2009 wxContextHelp chelp(this);
2010 }
2011
2012 void MyFrame::OnMove( wxMoveEvent& event )
2013 {
2014 #if wxUSE_STATUSBAR
2015 UpdateStatusBar(event.GetPosition(), GetSize());
2016 #endif // wxUSE_STATUSBAR
2017
2018 event.Skip();
2019 }
2020
2021 void MyFrame::OnIconized( wxIconizeEvent& event )
2022 {
2023 wxLogMessage(wxT("Frame %s"), event.IsIconized() ? wxT("iconized")
2024 : wxT("restored"));
2025 event.Skip();
2026 }
2027
2028 void MyFrame::OnMaximized( wxMaximizeEvent& WXUNUSED(event) )
2029 {
2030 wxLogMessage(wxT("Frame maximized"));
2031 }
2032
2033 void MyFrame::OnSize( wxSizeEvent& event )
2034 {
2035 #if wxUSE_STATUSBAR
2036 UpdateStatusBar(GetPosition(), event.GetSize());
2037 #endif // wxUSE_STATUSBAR
2038
2039 event.Skip();
2040 }
2041
2042 void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
2043 {
2044 // track the window which has the focus in the status bar
2045 static wxWindow *s_windowFocus = NULL;
2046 wxWindow *focus = wxWindow::FindFocus();
2047 if ( focus != s_windowFocus )
2048 {
2049 s_windowFocus = focus;
2050
2051 wxString msg;
2052 if ( focus )
2053 {
2054 msg.Printf(
2055 "Focus: %s"
2056 #ifdef __WXMSW__
2057 ", HWND = %08x"
2058 #endif
2059 , s_windowFocus->GetName().c_str()
2060 #ifdef __WXMSW__
2061 , (unsigned int) s_windowFocus->GetHWND()
2062 #endif
2063 );
2064 }
2065 else
2066 {
2067 msg = wxT("No focus");
2068 }
2069
2070 #if wxUSE_STATUSBAR
2071 SetStatusText(msg);
2072 #endif // wxUSE_STATUSBAR
2073 }
2074 }
2075
2076 void MyComboBox::OnChar(wxKeyEvent& event)
2077 {
2078 wxLogMessage(wxT("MyComboBox::OnChar"));
2079
2080 if ( event.GetKeyCode() == 'w' )
2081 {
2082 wxLogMessage(wxT("MyComboBox: 'w' will be ignored."));
2083 }
2084 else
2085 {
2086 event.Skip();
2087 }
2088 }
2089
2090 void MyComboBox::OnKeyDown(wxKeyEvent& event)
2091 {
2092 wxLogMessage(wxT("MyComboBox::OnKeyDown"));
2093
2094 if ( event.GetKeyCode() == 'w' )
2095 {
2096 wxLogMessage(wxT("MyComboBox: 'w' will be ignored."));
2097 }
2098 else
2099 {
2100 event.Skip();
2101 }
2102 }
2103
2104 void MyComboBox::OnKeyUp(wxKeyEvent& event)
2105 {
2106 wxLogMessage(wxT("MyComboBox::OnKeyUp"));
2107
2108 event.Skip();
2109 }
2110
2111 static void SetListboxClientData(const wxChar *name, wxListBox *control)
2112 {
2113 size_t count = control->GetCount();
2114 for ( size_t n = 0; n < count; n++ )
2115 {
2116 wxString s;
2117 s.Printf(wxT("%s client data for '%s'"),
2118 name, control->GetString(n).c_str());
2119
2120 control->SetClientObject(n, new wxStringClientData(s));
2121 }
2122 }
2123
2124 #if wxUSE_CHOICE
2125
2126 static void SetChoiceClientData(const wxChar *name, wxChoice *control)
2127 {
2128 size_t count = control->GetCount();
2129 for ( size_t n = 0; n < count; n++ )
2130 {
2131 wxString s;
2132 s.Printf(wxT("%s client data for '%s'"),
2133 name, control->GetString(n).c_str());
2134
2135 control->SetClientObject(n, new wxStringClientData(s));
2136 }
2137 }
2138
2139 #endif // wxUSE_CHOICE