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