Initialized control member pointers and checked for null pointer
[wxWidgets.git] / samples / controls / controls.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: controls.cpp
3 // Purpose: Controls wxWindows sample
4 // Author: Robert Roebling
5 // Modified by:
6 // RCS-ID: $Id$
7 // Copyright: (c) Robert Roebling, Julian Smart
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
10
11 #ifdef __GNUG__
12 #pragma implementation "controls.h"
13 #endif
14
15 // For compilers that support precompilation, includes "wx/wx.h".
16 #include "wx/wxprec.h"
17
18 #ifdef __BORLANDC__
19 #pragma hdrstop
20 #endif
21
22 #ifndef WX_PRECOMP
23 #include "wx/wx.h"
24 #endif
25
26 #if !defined( __WXMSW__ ) || defined( __WIN95__ )
27 #include "wx/spinbutt.h"
28 #endif
29 #include "wx/tglbtn.h"
30 #include "wx/notebook.h"
31 #include "wx/imaglist.h"
32 #include "wx/artprov.h"
33
34 #if wxUSE_TOOLTIPS
35 #include "wx/tooltip.h"
36 #endif
37
38 #if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
39 #define USE_XPM
40 #endif
41
42 #ifdef USE_XPM
43 #include "mondrian.xpm"
44 #include "icons/choice.xpm"
45 #include "icons/combo.xpm"
46 #include "icons/list.xpm"
47 #include "icons/radio.xpm"
48 #include "icons/text.xpm"
49 #include "icons/gauge.xpm"
50 #endif
51
52 #ifdef __WIN16__
53 // Win16 doesn't have them
54 #ifdef wxUSE_SPINBTN
55 #undef wxUSE_SPINBTN
56 #endif
57 #define wxUSE_SPINBTN 0
58 #else
59 #ifndef wxUSE_SPINBTN
60 #define wxUSE_SPINBTN 1
61 #endif
62 #endif // __WIN16__
63
64 #include "wx/progdlg.h"
65
66 #if wxUSE_SPINCTRL
67 #include "wx/spinctrl.h"
68 #endif // wxUSE_SPINCTRL
69
70 //----------------------------------------------------------------------
71 // class definitions
72 //----------------------------------------------------------------------
73
74 class MyApp: public wxApp
75 {
76 public:
77 bool OnInit();
78 };
79
80 class MyPanel: public wxPanel
81 {
82 public:
83 MyPanel(wxFrame *frame, int x, int y, int w, int h);
84 virtual ~MyPanel();
85
86 void OnSize( wxSizeEvent& event );
87 void OnListBox( wxCommandEvent &event );
88 void OnListBoxDoubleClick( wxCommandEvent &event );
89 void OnListBoxButtons( wxCommandEvent &event );
90 #if wxUSE_CHOICE
91 void OnChoice( wxCommandEvent &event );
92 void OnChoiceButtons( wxCommandEvent &event );
93 #endif
94 void OnCombo( wxCommandEvent &event );
95 void OnComboTextChanged( wxCommandEvent &event );
96 void OnComboTextEnter( wxCommandEvent &event );
97 void OnComboButtons( wxCommandEvent &event );
98 void OnRadio( wxCommandEvent &event );
99 void OnRadioButtons( wxCommandEvent &event );
100 void OnSetFont( wxCommandEvent &event );
101 void OnPageChanged( wxNotebookEvent &event );
102 void OnPageChanging( wxNotebookEvent &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 void OnUpdateShowProgress( wxUpdateUIEvent& event );
110 void OnShowProgress( wxCommandEvent &event );
111 #endif // wxUSE_SPINBTN
112
113 #if wxUSE_SPINCTRL
114 void OnSpinCtrl(wxSpinEvent& event);
115 #endif // wxUSE_SPINCTRL
116
117 void OnEnableAll(wxCommandEvent& event);
118 void OnChangeColour(wxCommandEvent& event);
119 void OnTestButton(wxCommandEvent& event);
120 void OnBmpButton(wxCommandEvent& event);
121
122 wxListBox *m_listbox,
123 *m_listboxSorted;
124 #if wxUSE_CHOICE
125 wxChoice *m_choice,
126 *m_choiceSorted;
127 #endif
128 wxComboBox *m_combo;
129 wxRadioBox *m_radio;
130 wxGauge *m_gauge,
131 *m_gaugeVert;
132 wxSlider *m_slider;
133 wxButton *m_fontButton;
134 wxButton *m_lbSelectNum;
135 wxButton *m_lbSelectThis;
136 #if wxUSE_SPINBTN
137 wxSpinButton *m_spinbutton;
138 wxButton *m_btnProgress;
139 #endif // wxUSE_SPINBTN
140
141 #if wxUSE_SPINCTRL
142 wxSpinCtrl *m_spinctrl;
143 #endif // wxUSE_SPINCTRL
144
145 wxTextCtrl *m_spintext;
146 wxCheckBox *m_checkbox;
147
148 wxTextCtrl *m_text;
149 wxNotebook *m_notebook;
150
151 wxStaticText *m_label;
152
153 private:
154 wxLog *m_logTargetOld;
155
156 DECLARE_EVENT_TABLE()
157 };
158
159 class MyFrame: public wxFrame
160 {
161 public:
162 MyFrame(const char *title, int x, int y);
163
164 void OnQuit(wxCommandEvent& event);
165 void OnAbout(wxCommandEvent& event);
166 void OnClearLog(wxCommandEvent& event);
167
168 #if wxUSE_TOOLTIPS
169 void OnSetTooltipDelay(wxCommandEvent& event);
170 void OnToggleTooltips(wxCommandEvent& event);
171 #endif // wxUSE_TOOLTIPS
172
173 void OnEnableAll(wxCommandEvent& event);
174
175 void OnIdle( wxIdleEvent& event );
176 void OnSize( wxSizeEvent& event );
177 void OnMove( wxMoveEvent& event );
178
179 MyPanel *GetPanel() const { return m_panel; }
180
181 private:
182 void UpdateStatusBar(const wxPoint& pos, const wxSize& size)
183 {
184 if ( m_frameStatusBar )
185 {
186 wxString msg;
187 wxSize sizeAll = GetSize(),
188 sizeCl = GetClientSize();
189 msg.Printf(_("pos=(%d, %d), size=%dx%d or %dx%d (client=%dx%d)"),
190 pos.x, pos.y,
191 size.x, size.y,
192 sizeAll.x, sizeAll.y,
193 sizeCl.x, sizeCl.y);
194 SetStatusText(msg, 1);
195 }
196 }
197
198 MyPanel *m_panel;
199
200 DECLARE_EVENT_TABLE()
201 };
202
203 // a button which intercepts double clicks (for testing...)
204 class MyButton : public wxButton
205 {
206 public:
207 MyButton(wxWindow *parent,
208 wxWindowID id,
209 const wxString& label = wxEmptyString,
210 const wxPoint& pos = wxDefaultPosition,
211 const wxSize& size = wxDefaultSize)
212 : wxButton(parent, id, label, pos, size)
213 {
214 }
215
216 void OnDClick(wxMouseEvent& event)
217 {
218 wxLogMessage(_T("MyButton::OnDClick"));
219
220 event.Skip();
221 }
222
223 private:
224 DECLARE_EVENT_TABLE()
225 };
226
227 // a combo which intercepts chars (to test Windows behaviour)
228 class MyComboBox : public wxComboBox
229 {
230 public:
231 MyComboBox(wxWindow *parent, wxWindowID id,
232 const wxString& value = wxEmptyString,
233 const wxPoint& pos = wxDefaultPosition,
234 const wxSize& size = wxDefaultSize,
235 int n = 0, const wxString choices[] = NULL,
236 long style = 0,
237 const wxValidator& validator = wxDefaultValidator,
238 const wxString& name = wxComboBoxNameStr)
239 : wxComboBox(parent, id, value, pos, size, n, choices, style,
240 validator, name) { }
241
242 protected:
243 void OnChar(wxKeyEvent& event);
244 void OnKeyDown(wxKeyEvent& event);
245 void OnKeyUp(wxKeyEvent& event);
246 void OnFocusGot(wxFocusEvent& event)
247 {
248 wxLogMessage(_T("MyComboBox::OnFocusGot"));
249
250 event.Skip();
251 }
252
253 private:
254 DECLARE_EVENT_TABLE()
255 };
256
257 // a radiobox which handles focus set/kill (for testing)
258 class MyRadioBox : public wxRadioBox
259 {
260 public:
261 MyRadioBox(wxWindow *parent,
262 wxWindowID id,
263 const wxString& title = wxEmptyString,
264 const wxPoint& pos = wxDefaultPosition,
265 const wxSize& size = wxDefaultSize,
266 int n = 0, const wxString choices[] = NULL,
267 int majorDim = 1,
268 long style = wxRA_HORIZONTAL,
269 const wxValidator& validator = wxDefaultValidator,
270 const wxString& name = wxRadioBoxNameStr)
271 : wxRadioBox(parent, id, title, pos, size, n, choices, majorDim,
272 style, validator, name) { }
273
274 protected:
275 void OnFocusGot(wxFocusEvent& event)
276 {
277 wxLogMessage(_T("MyRadioBox::OnFocusGot"));
278
279 event.Skip();
280 }
281
282 void OnFocusLost(wxFocusEvent& event)
283 {
284 wxLogMessage(_T("MyRadioBox::OnFocusLost"));
285
286 event.Skip();
287 }
288
289 private:
290 DECLARE_EVENT_TABLE()
291 };
292
293 //----------------------------------------------------------------------
294 // other
295 //----------------------------------------------------------------------
296
297 static void SetListboxClientData(const wxChar *name, wxListBox *control);
298 static void SetChoiceClientData(const wxChar *name, wxChoice *control);
299
300 IMPLEMENT_APP(MyApp)
301
302 //----------------------------------------------------------------------
303 // MyApp
304 //----------------------------------------------------------------------
305
306 enum
307 {
308 CONTROLS_QUIT = 100,
309 CONTROLS_TEXT,
310 CONTROLS_ABOUT,
311 CONTROLS_CLEAR_LOG,
312
313 // tooltip menu
314 CONTROLS_SET_TOOLTIP_DELAY = 200,
315 CONTROLS_ENABLE_TOOLTIPS,
316
317 // panel menu
318 CONTROLS_ENABLE_ALL
319 };
320
321 bool MyApp::OnInit()
322 {
323 // use standard command line handling:
324 if ( !wxApp::OnInit() )
325 return FALSE;
326
327 // parse the cmd line
328 int x = 50,
329 y = 50;
330 if ( argc == 3 )
331 {
332 wxSscanf(wxString(argv[1]), wxT("%d"), &x);
333 wxSscanf(wxString(argv[2]), wxT("%d"), &y);
334 }
335
336 // Create the main frame window
337 MyFrame *frame = new MyFrame("Controls wxWindows App", x, y);
338 frame->Show(TRUE);
339
340 return TRUE;
341 }
342
343 //----------------------------------------------------------------------
344 // MyPanel
345 //----------------------------------------------------------------------
346
347 const int ID_NOTEBOOK = 1000;
348
349 const int ID_LISTBOX = 130;
350 const int ID_LISTBOX_SEL_NUM = 131;
351 const int ID_LISTBOX_SEL_STR = 132;
352 const int ID_LISTBOX_CLEAR = 133;
353 const int ID_LISTBOX_APPEND = 134;
354 const int ID_LISTBOX_DELETE = 135;
355 const int ID_LISTBOX_FONT = 136;
356 const int ID_LISTBOX_ENABLE = 137;
357 const int ID_LISTBOX_SORTED = 138;
358
359 const int ID_CHOICE = 120;
360 const int ID_CHOICE_SEL_NUM = 121;
361 const int ID_CHOICE_SEL_STR = 122;
362 const int ID_CHOICE_CLEAR = 123;
363 const int ID_CHOICE_APPEND = 124;
364 const int ID_CHOICE_DELETE = 125;
365 const int ID_CHOICE_FONT = 126;
366 const int ID_CHOICE_ENABLE = 127;
367 const int ID_CHOICE_SORTED = 128;
368
369 const int ID_COMBO = 140;
370 const int ID_COMBO_SEL_NUM = 141;
371 const int ID_COMBO_SEL_STR = 142;
372 const int ID_COMBO_CLEAR = 143;
373 const int ID_COMBO_APPEND = 144;
374 const int ID_COMBO_DELETE = 145;
375 const int ID_COMBO_FONT = 146;
376 const int ID_COMBO_ENABLE = 147;
377
378 const int ID_RADIOBOX = 160;
379 const int ID_RADIOBOX_SEL_NUM = 161;
380 const int ID_RADIOBOX_SEL_STR = 162;
381 const int ID_RADIOBOX_FONT = 163;
382 const int ID_RADIOBOX_ENABLE = 164;
383
384 const int ID_RADIOBUTTON_1 = 166;
385 const int ID_RADIOBUTTON_2 = 167;
386
387 const int ID_SET_FONT = 170;
388
389 const int ID_GAUGE = 180;
390 const int ID_SLIDER = 181;
391
392 const int ID_SPIN = 182;
393 const int ID_BTNPROGRESS = 183;
394 const int ID_BUTTON_LABEL = 184;
395 const int ID_SPINCTRL = 185;
396
397 const int ID_BUTTON_TEST1 = 190;
398 const int ID_BUTTON_TEST2 = 191;
399 const int ID_BITMAP_BTN = 192;
400
401 const int ID_CHANGE_COLOUR = 200;
402
403 BEGIN_EVENT_TABLE(MyPanel, wxPanel)
404 EVT_SIZE ( MyPanel::OnSize)
405 EVT_NOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK, MyPanel::OnPageChanging)
406 EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, MyPanel::OnPageChanged)
407 EVT_LISTBOX (ID_LISTBOX, MyPanel::OnListBox)
408 EVT_LISTBOX (ID_LISTBOX_SORTED, MyPanel::OnListBox)
409 EVT_LISTBOX_DCLICK(ID_LISTBOX, MyPanel::OnListBoxDoubleClick)
410 EVT_BUTTON (ID_LISTBOX_SEL_NUM, MyPanel::OnListBoxButtons)
411 EVT_BUTTON (ID_LISTBOX_SEL_STR, MyPanel::OnListBoxButtons)
412 EVT_BUTTON (ID_LISTBOX_CLEAR, MyPanel::OnListBoxButtons)
413 EVT_BUTTON (ID_LISTBOX_APPEND, MyPanel::OnListBoxButtons)
414 EVT_BUTTON (ID_LISTBOX_DELETE, MyPanel::OnListBoxButtons)
415 EVT_BUTTON (ID_LISTBOX_FONT, MyPanel::OnListBoxButtons)
416 EVT_CHECKBOX (ID_LISTBOX_ENABLE, MyPanel::OnListBoxButtons)
417 #if wxUSE_CHOICE
418 EVT_CHOICE (ID_CHOICE, MyPanel::OnChoice)
419 EVT_CHOICE (ID_CHOICE_SORTED, MyPanel::OnChoice)
420 EVT_BUTTON (ID_CHOICE_SEL_NUM, MyPanel::OnChoiceButtons)
421 EVT_BUTTON (ID_CHOICE_SEL_STR, MyPanel::OnChoiceButtons)
422 EVT_BUTTON (ID_CHOICE_CLEAR, MyPanel::OnChoiceButtons)
423 EVT_BUTTON (ID_CHOICE_APPEND, MyPanel::OnChoiceButtons)
424 EVT_BUTTON (ID_CHOICE_DELETE, MyPanel::OnChoiceButtons)
425 EVT_BUTTON (ID_CHOICE_FONT, MyPanel::OnChoiceButtons)
426 EVT_CHECKBOX (ID_CHOICE_ENABLE, MyPanel::OnChoiceButtons)
427 #endif
428 EVT_COMBOBOX (ID_COMBO, MyPanel::OnCombo)
429 EVT_TEXT (ID_COMBO, MyPanel::OnComboTextChanged)
430 EVT_TEXT_ENTER(ID_COMBO, MyPanel::OnComboTextEnter)
431 EVT_BUTTON (ID_COMBO_SEL_NUM, MyPanel::OnComboButtons)
432 EVT_BUTTON (ID_COMBO_SEL_STR, MyPanel::OnComboButtons)
433 EVT_BUTTON (ID_COMBO_CLEAR, MyPanel::OnComboButtons)
434 EVT_BUTTON (ID_COMBO_APPEND, MyPanel::OnComboButtons)
435 EVT_BUTTON (ID_COMBO_DELETE, MyPanel::OnComboButtons)
436 EVT_BUTTON (ID_COMBO_FONT, MyPanel::OnComboButtons)
437 EVT_CHECKBOX (ID_COMBO_ENABLE, MyPanel::OnComboButtons)
438 EVT_RADIOBOX (ID_RADIOBOX, MyPanel::OnRadio)
439 EVT_BUTTON (ID_RADIOBOX_SEL_NUM, MyPanel::OnRadioButtons)
440 EVT_BUTTON (ID_RADIOBOX_SEL_STR, MyPanel::OnRadioButtons)
441 EVT_BUTTON (ID_RADIOBOX_FONT, MyPanel::OnRadioButtons)
442 EVT_CHECKBOX (ID_RADIOBOX_ENABLE, MyPanel::OnRadioButtons)
443 EVT_BUTTON (ID_SET_FONT, MyPanel::OnSetFont)
444 EVT_SLIDER (ID_SLIDER, MyPanel::OnSliderUpdate)
445 #if wxUSE_SPINBTN
446 EVT_SPIN (ID_SPIN, MyPanel::OnSpinUpdate)
447 EVT_SPIN_UP (ID_SPIN, MyPanel::OnSpinUp)
448 EVT_SPIN_DOWN (ID_SPIN, MyPanel::OnSpinDown)
449 EVT_UPDATE_UI (ID_BTNPROGRESS, MyPanel::OnUpdateShowProgress)
450 EVT_BUTTON (ID_BTNPROGRESS, MyPanel::OnShowProgress)
451 #endif // wxUSE_SPINBTN
452 #if wxUSE_SPINCTRL
453 EVT_SPINCTRL (ID_SPINCTRL, MyPanel::OnSpinCtrl)
454 #endif // wxUSE_SPINCTRL
455 #if wxUSE_TOGGLEBTN
456 EVT_TOGGLEBUTTON(ID_BUTTON_LABEL, MyPanel::OnUpdateLabel)
457 #endif // wxUSE_TOGGLEBTN
458 EVT_CHECKBOX (ID_CHANGE_COLOUR, MyPanel::OnChangeColour)
459 EVT_BUTTON (ID_BUTTON_TEST1, MyPanel::OnTestButton)
460 EVT_BUTTON (ID_BUTTON_TEST2, MyPanel::OnTestButton)
461 EVT_BUTTON (ID_BITMAP_BTN, MyPanel::OnBmpButton)
462 END_EVENT_TABLE()
463
464 BEGIN_EVENT_TABLE(MyButton, wxButton)
465 EVT_LEFT_DCLICK(MyButton::OnDClick)
466 END_EVENT_TABLE()
467
468 BEGIN_EVENT_TABLE(MyComboBox, wxComboBox)
469 EVT_CHAR(MyComboBox::OnChar)
470 EVT_KEY_DOWN(MyComboBox::OnKeyDown)
471 EVT_KEY_UP(MyComboBox::OnKeyUp)
472
473 EVT_SET_FOCUS(MyComboBox::OnFocusGot)
474 END_EVENT_TABLE()
475
476 BEGIN_EVENT_TABLE(MyRadioBox, wxRadioBox)
477 EVT_SET_FOCUS(MyRadioBox::OnFocusGot)
478 EVT_KILL_FOCUS(MyRadioBox::OnFocusLost)
479 END_EVENT_TABLE()
480
481 // ============================================================================
482 // implementation
483 // ============================================================================
484
485 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
486 : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) )
487 {
488 m_listbox = NULL;
489 m_listboxSorted = NULL;
490 #if wxUSE_CHOICE
491 m_choice = NULL;
492 m_choiceSorted = NULL;
493 #endif
494 m_combo = NULL;
495 m_radio = NULL;
496 m_gauge = NULL;
497 m_gaugeVert = NULL;
498 m_slider = NULL;
499 m_fontButton = NULL;
500 m_lbSelectNum = NULL;
501 m_lbSelectThis = NULL;
502 #if wxUSE_SPINBTN
503 m_spinbutton = NULL;
504 m_btnProgress = NULL;
505 #endif // wxUSE_SPINBTN
506 #if wxUSE_SPINCTRL
507 m_spinctrl = NULL;
508 #endif // wxUSE_SPINCTRL
509 m_spintext = NULL;
510 m_checkbox = NULL;
511 m_text = NULL;
512 m_notebook = NULL;
513 m_label = NULL;
514
515 m_text = new wxTextCtrl(this, -1, "This is the log window.\n",
516 wxPoint(0, 250), wxSize(100, 50), wxTE_MULTILINE);
517 m_text->SetBackgroundColour(wxT("wheat"));
518
519 if ( 0 )
520 wxLog::AddTraceMask(_T("focus"));
521 m_logTargetOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_text));
522
523 m_notebook = new wxNotebook(this, ID_NOTEBOOK);
524
525 wxString choices[] =
526 {
527 "This",
528 "is one of my",
529 "really",
530 "wonderful",
531 "examples."
532 };
533
534 #ifdef USE_XPM
535 // image ids
536 enum
537 {
538 Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
539 };
540
541 // fill the image list
542 wxImageList *imagelist = new wxImageList(32, 32);
543
544 imagelist-> Add( wxBitmap( list_xpm ));
545 imagelist-> Add( wxBitmap( choice_xpm ));
546 imagelist-> Add( wxBitmap( combo_xpm ));
547 imagelist-> Add( wxBitmap( text_xpm ));
548 imagelist-> Add( wxBitmap( radio_xpm ));
549 imagelist-> Add( wxBitmap( gauge_xpm ));
550 m_notebook->SetImageList(imagelist);
551 #elif defined(__WXMSW__)
552 // load images from resources
553 enum
554 {
555 Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
556 };
557 wxImageList *imagelist = new wxImageList(16, 16, FALSE, Image_Max);
558
559 static const char *s_iconNames[Image_Max] =
560 {
561 "list", "choice", "combo", "text", "radio", "gauge"
562 };
563
564 for ( size_t n = 0; n < Image_Max; n++ )
565 {
566 wxBitmap bmp(s_iconNames[n]);
567 if ( !bmp.Ok() || (imagelist->Add(bmp) == -1) )
568 {
569 wxLogWarning(wxT("Couldn't load the image '%s' for the notebook page %d."),
570 s_iconNames[n], n);
571 }
572 }
573
574 m_notebook->SetImageList(imagelist);
575 #else
576
577 // No images for now
578 #define Image_List -1
579 #define Image_Choice -1
580 #define Image_Combo -1
581 #define Image_Text -1
582 #define Image_Radio -1
583 #define Image_Gauge -1
584 #define Image_Max -1
585
586 #endif
587
588 wxPanel *panel = new wxPanel(m_notebook);
589 m_listbox = new wxListBox( panel, ID_LISTBOX,
590 wxPoint(10,10), wxSize(120,70),
591 5, choices, wxLB_ALWAYS_SB );
592 m_listboxSorted = new wxListBox( panel, ID_LISTBOX_SORTED,
593 wxPoint(10,90), wxSize(120,70),
594 5, choices, wxLB_SORT );
595
596 SetListboxClientData(wxT("listbox"), m_listbox);
597 SetListboxClientData(wxT("listbox"), m_listboxSorted);
598
599 m_listbox->SetCursor(*wxCROSS_CURSOR);
600 #if wxUSE_TOOLTIPS
601 m_listbox->SetToolTip( "This is a list box" );
602 #endif // wxUSE_TOOLTIPS
603
604 m_lbSelectNum = new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
605 m_lbSelectThis = new wxButton( panel, ID_LISTBOX_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
606 (void)new wxButton( panel, ID_LISTBOX_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
607 (void)new MyButton( panel, ID_LISTBOX_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
608 (void)new wxButton( panel, ID_LISTBOX_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
609 wxButton *button = new MyButton( panel, ID_LISTBOX_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
610
611 button->SetDefault();
612
613 button->SetForegroundColour(*wxBLUE);
614
615 #if wxUSE_TOOLTIPS
616 button->SetToolTip( "Press here to set italic font" );
617 #endif // wxUSE_TOOLTIPS
618
619 m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, "&Disable", wxPoint(20,170) );
620 m_checkbox->SetValue(FALSE);
621 #if wxUSE_TOOLTIPS
622 m_checkbox->SetToolTip( "Click here to disable the listbox" );
623 #endif // wxUSE_TOOLTIPS
624 (void)new wxCheckBox( panel, ID_CHANGE_COLOUR, "&Toggle colour",
625 wxPoint(110,170) );
626 panel->SetCursor(wxCursor(wxCURSOR_HAND));
627 m_notebook->AddPage(panel, "wxListBox", TRUE, Image_List);
628
629 #if wxUSE_CHOICE
630 panel = new wxPanel(m_notebook);
631 m_choice = new wxChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,-1), 5, choices );
632 m_choiceSorted = new wxChoice( panel, ID_CHOICE_SORTED, wxPoint(10,70), wxSize(120,-1),
633 5, choices, wxCB_SORT );
634
635 SetChoiceClientData(wxT("choice"), m_choice);
636 SetChoiceClientData(wxT("choice"), m_choiceSorted);
637
638 m_choice->SetSelection(2);
639 m_choice->SetBackgroundColour( wxT("red") );
640 (void)new wxButton( panel, ID_CHOICE_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
641 (void)new wxButton( panel, ID_CHOICE_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
642 (void)new wxButton( panel, ID_CHOICE_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
643 (void)new wxButton( panel, ID_CHOICE_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
644 (void)new wxButton( panel, ID_CHOICE_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
645 (void)new wxButton( panel, ID_CHOICE_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
646 (void)new wxCheckBox( panel, ID_CHOICE_ENABLE, "&Disable", wxPoint(20,130), wxSize(140,30) );
647
648 m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
649 #endif // wxUSE_CHOICE
650
651 panel = new wxPanel(m_notebook);
652 (void)new wxStaticBox( panel, -1, "&Box around combobox",
653 wxPoint(5, 5), wxSize(150, 100));
654 m_combo = new MyComboBox( panel, ID_COMBO, "This",
655 wxPoint(20,25), wxSize(120, -1),
656 5, choices,
657 /* wxCB_READONLY | */ wxPROCESS_ENTER);
658
659 (void)new wxButton( panel, ID_COMBO_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
660 (void)new wxButton( panel, ID_COMBO_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
661 (void)new wxButton( panel, ID_COMBO_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
662 (void)new wxButton( panel, ID_COMBO_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
663 (void)new wxButton( panel, ID_COMBO_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
664 (void)new wxButton( panel, ID_COMBO_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
665 (void)new wxCheckBox( panel, ID_COMBO_ENABLE, "&Disable", wxPoint(20,130), wxSize(140,30) );
666 m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo);
667
668 wxString choices2[] =
669 {
670 "First", "Second",
671 /* "Third",
672 "Fourth", "Fifth", "Sixth",
673 "Seventh", "Eighth", "Nineth", "Tenth" */
674 };
675
676 panel = new wxPanel(m_notebook);
677 (void)new MyRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
678 m_radio = new wxRadioBox( panel, ID_RADIOBOX, "T&his", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
679
680 #if wxUSE_TOOLTIPS
681 m_combo->SetToolTip("This is a natural\ncombobox - can you believe me?");
682 m_radio->SetToolTip("Ever seen a radiobox?");
683 #endif // wxUSE_TOOLTIPS
684
685 (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
686 (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "&Select 'This'", wxPoint(180,80), wxSize(140,30) );
687 m_fontButton = new wxButton( panel, ID_SET_FONT, "Set &more Italic font", wxPoint(340,30), wxSize(140,30) );
688 (void)new wxButton( panel, ID_RADIOBOX_FONT, "Set &Italic font", wxPoint(340,80), wxSize(140,30) );
689 (void)new wxCheckBox( panel, ID_RADIOBOX_ENABLE, "&Disable", wxPoint(340,130), wxDefaultSize );
690 wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxDefaultSize, wxRB_GROUP );
691 rb->SetValue( FALSE );
692 (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "&Radiobutton2", wxPoint(340,170), wxDefaultSize );
693 m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
694
695 panel = new wxPanel(m_notebook);
696 (void)new wxStaticBox( panel, -1, "&wxGauge and wxSlider", wxPoint(10,10), wxSize(222,130) );
697 m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155, 30), wxGA_HORIZONTAL|wxNO_BORDER );
698 m_gauge->SetBackgroundColour(*wxGREEN);
699 m_gauge->SetForegroundColour(*wxRED);
700 m_gaugeVert = new wxGauge( panel, -1, 100,
701 wxPoint(195,35), wxSize(30, 90),
702 wxGA_VERTICAL | wxGA_SMOOTH | wxNO_BORDER );
703 m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1),
704 wxSL_AUTOTICKS | wxSL_LABELS );
705 m_slider->SetTickFreq(40, 0);
706 (void)new wxStaticBox( panel, -1, "&Explanation",
707 wxPoint(230,10), wxSize(270,130),
708 wxALIGN_CENTER );
709
710 #ifdef __WXMOTIF__
711 // No wrapping text in wxStaticText yet :-(
712 (void)new wxStaticText( panel, -1,
713 "Drag the slider!",
714 wxPoint(250,30),
715 wxSize(240, -1)
716 );
717 #else
718 (void)new wxStaticText( panel, -1,
719 "In order see the gauge (aka progress bar)\n"
720 "control do something you have to drag the\n"
721 "handle of the slider to the right.\n"
722 "\n"
723 "This is also supposed to demonstrate how\n"
724 "to use static controls.\n",
725 wxPoint(250,25),
726 wxSize(240, 110)
727 );
728 #endif
729 int initialSpinValue = -5;
730 wxString s;
731 s << initialSpinValue;
732 m_spintext = new wxTextCtrl( panel, -1, s, wxPoint(20,160), wxSize(80,-1) );
733 #if wxUSE_SPINBTN
734 m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160), wxSize(80, -1) );
735 m_spinbutton->SetRange(-40,30);
736 m_spinbutton->SetValue(initialSpinValue);
737
738 m_btnProgress = new wxButton( panel, ID_BTNPROGRESS, "&Show progress dialog",
739 wxPoint(300, 160) );
740 #endif // wxUSE_SPINBTN
741
742 #if wxUSE_SPINCTRL
743 m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, "", wxPoint(200, 160), wxSize(80, -1) );
744 m_spinctrl->SetRange(10,30);
745 m_spinctrl->SetValue(15);
746 #endif // wxUSE_SPINCTRL
747
748 m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
749
750 panel = new wxPanel(m_notebook);
751
752 #if !defined(__WXMOTIF__) && !defined(__WIN16__) // wxStaticBitmap not working under Motif yet; and icons not allowed under WIN16.
753 wxIcon icon = wxArtProvider::GetIcon(wxART_INFORMATION);
754 wxStaticBitmap *bmpStatic = new wxStaticBitmap(panel, -1, icon,
755 wxPoint(10, 10));
756
757 bmpStatic = new wxStaticBitmap(panel, -1, wxNullIcon, wxPoint(50, 10));
758 bmpStatic->SetIcon(wxArtProvider::GetIcon(wxART_QUESTION));
759 #endif // !Motif
760
761 wxBitmap bitmap( 100, 100 );
762 wxMemoryDC dc;
763 dc.SelectObject( bitmap );
764 dc.SetPen(*wxGREEN_PEN);
765 dc.Clear();
766 dc.DrawEllipse(5, 5, 90, 90);
767 dc.DrawText("Bitmap", 30, 40);
768 dc.SelectObject( wxNullBitmap );
769
770 (void)new wxBitmapButton(panel, ID_BITMAP_BTN, bitmap, wxPoint(100, 20));
771
772 #ifdef __WXMSW__
773 // test for masked bitmap display
774 bitmap = wxBitmap("test2.bmp", wxBITMAP_TYPE_BMP);
775 if (bitmap.Ok())
776 {
777 bitmap.SetMask(new wxMask(bitmap, *wxBLUE));
778
779 (void)new wxStaticBitmap /* wxBitmapButton */ (panel, -1, bitmap, wxPoint(300, 120));
780 }
781 #endif
782
783 wxBitmap bmp1(wxArtProvider::GetBitmap(wxART_INFORMATION)),
784 bmp2(wxArtProvider::GetBitmap(wxART_WARNING)),
785 bmp3(wxArtProvider::GetBitmap(wxART_QUESTION));
786 wxBitmapButton *bmpBtn = new wxBitmapButton
787 (
788 panel, -1,
789 bmp1,
790 wxPoint(30, 70)
791 );
792
793 bmpBtn->SetBitmapSelected(bmp2);
794 bmpBtn->SetBitmapFocus(bmp3);
795
796 #if wxUSE_TOGGLEBTN
797 (void)new wxToggleButton(panel, ID_BUTTON_LABEL,
798 "&Toggle label", wxPoint(250, 20));
799 #endif // wxUSE_TOGGLEBTN
800
801 m_label = new wxStaticText(panel, -1, "Label with some long text",
802 wxPoint(250, 60), wxDefaultSize,
803 wxALIGN_RIGHT /*| wxST_NO_AUTORESIZE*/);
804 m_label->SetForegroundColour( *wxBLUE );
805
806 m_notebook->AddPage(panel, "wxBitmapXXX");
807
808 // layout constraints
809 #if wxUSE_CONSTRAINTS
810 wxLayoutConstraints *c;
811
812 panel = new wxPanel(m_notebook);
813 panel->SetAutoLayout( TRUE );
814
815 c = new wxLayoutConstraints;
816 c->top.SameAs( panel, wxTop, 10 );
817 c->height.AsIs( );
818 c->left.SameAs( panel, wxLeft, 10 );
819 c->width.PercentOf( panel, wxWidth, 40 );
820
821 wxButton *pMyButton = new wxButton(panel, ID_BUTTON_TEST1, "Test Button &1" );
822 pMyButton->SetConstraints( c );
823
824 c = new wxLayoutConstraints;
825 c->top.SameAs( panel, wxTop, 10 );
826 c->bottom.SameAs( panel, wxBottom, 10 );
827 c->right.SameAs( panel, wxRight, 10 );
828 c->width.PercentOf( panel, wxWidth, 40 );
829
830 wxButton *pMyButton2 = new wxButton(panel, ID_BUTTON_TEST2, "Test Button &2" );
831 pMyButton2->SetConstraints( c );
832
833 m_notebook->AddPage(panel, "wxLayoutConstraint");
834 #endif
835
836 // sizer
837
838 panel = new wxPanel(m_notebook);
839 panel->SetAutoLayout( TRUE );
840
841 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
842
843 sizer->Add( new wxButton(panel, -1, "Test Button &1" ), 3, wxALL, 10 );
844 sizer->Add( 20,20, 1 );
845 sizer->Add( new wxButton(panel, -1, "Multiline\nbutton" ), 3, wxGROW|wxALL, 10 );
846
847 panel->SetSizer( sizer );
848
849 m_notebook->AddPage(panel, "wxSizer");
850 }
851
852 void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
853 {
854 int x = 0;
855 int y = 0;
856 GetClientSize( &x, &y );
857
858 if (m_notebook) m_notebook->SetSize( 2, 2, x-4, y*2/3-4 );
859 if (m_text) m_text->SetSize( 2, y*2/3+2, x-4, y/3-4 );
860 }
861
862 void MyPanel::OnPageChanging( wxNotebookEvent &event )
863 {
864 int selOld = event.GetOldSelection();
865 if ( selOld == 2 )
866 {
867 if ( wxMessageBox("This demonstrates how a program may prevent the\n"
868 "page change from taking place - if you select\n"
869 "[No] the current page will stay the third one\n",
870 "Control sample",
871 wxICON_QUESTION | wxYES_NO, this) != wxYES )
872 {
873 event.Veto();
874
875 return;
876 }
877 }
878
879 *m_text << "Notebook selection is being changed from " << selOld
880 << " to " << event.GetSelection()
881 << " (current page from notebook is "
882 << m_notebook->GetSelection() << ")\n";
883 }
884
885 void MyPanel::OnPageChanged( wxNotebookEvent &event )
886 {
887 *m_text << "Notebook selection is now " << event.GetSelection()
888 << " (from notebook: " << m_notebook->GetSelection() << ")\n";
889 }
890
891 void MyPanel::OnTestButton(wxCommandEvent& event)
892 {
893 wxLogMessage(_T("Button %c clicked."),
894 event.GetId() == ID_BUTTON_TEST1 ? _T('1') : _T('2'));
895 }
896
897 void MyPanel::OnBmpButton(wxCommandEvent& event)
898 {
899 wxLogMessage(_T("Bitmap button clicked."));
900 }
901
902 void MyPanel::OnChangeColour(wxCommandEvent& WXUNUSED(event))
903 {
904 static wxColour s_colOld;
905
906 // test panel colour changing and propagation to the subcontrols
907 if ( s_colOld.Ok() )
908 {
909 SetBackgroundColour(s_colOld);
910 s_colOld = wxNullColour;
911
912 m_lbSelectThis->SetForegroundColour(wxT("red"));
913 m_lbSelectThis->SetBackgroundColour(wxT("white"));
914 }
915 else
916 {
917 s_colOld = wxColour(wxT("red"));
918 SetBackgroundColour(wxT("white"));
919
920 m_lbSelectThis->SetForegroundColour(wxT("white"));
921 m_lbSelectThis->SetBackgroundColour(wxT("red"));
922 }
923
924 m_lbSelectThis->Refresh();
925 Refresh();
926 }
927
928 void MyPanel::OnListBox( wxCommandEvent &event )
929 {
930 // GetParent()->Move(100, 100);
931
932 if (event.GetInt() == -1)
933 {
934 m_text->AppendText( "ListBox has no selections anymore\n" );
935 return;
936 }
937
938 wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
939 : m_listboxSorted;
940
941 m_text->AppendText( "ListBox event selection string is: '" );
942 m_text->AppendText( event.GetString() );
943 m_text->AppendText( "'\n" );
944 m_text->AppendText( "ListBox control selection string is: '" );
945 m_text->AppendText( listbox->GetStringSelection() );
946 m_text->AppendText( "'\n" );
947
948 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
949 m_text->AppendText( "ListBox event client data string is: '" );
950 if (obj) // BC++ doesn't like use of '? .. : .. ' in this context
951 m_text->AppendText( obj->GetData() );
952 else
953 m_text->AppendText( wxString("none") );
954
955 m_text->AppendText( "'\n" );
956 m_text->AppendText( "ListBox control client data string is: '" );
957 obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection());
958 if (obj)
959 m_text->AppendText( obj->GetData() );
960 else
961 m_text->AppendText( wxString("none") );
962 m_text->AppendText( "'\n" );
963 }
964
965 void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
966 {
967 m_text->AppendText( "ListBox double click string is: " );
968 m_text->AppendText( event.GetString() );
969 m_text->AppendText( "\n" );
970 }
971
972 void MyPanel::OnListBoxButtons( wxCommandEvent &event )
973 {
974 switch (event.GetId())
975 {
976 case ID_LISTBOX_ENABLE:
977 {
978 m_text->AppendText("Checkbox clicked.\n");
979 #if wxUSE_TOOLTIPS
980 wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
981 if (event.GetInt())
982 cb->SetToolTip( "Click to enable listbox" );
983 else
984 cb->SetToolTip( "Click to disable listbox" );
985 #endif // wxUSE_TOOLTIPS
986 m_listbox->Enable( event.GetInt() == 0 );
987 m_lbSelectThis->Enable( event.GetInt() == 0 );
988 m_lbSelectNum->Enable( event.GetInt() == 0 );
989 m_listboxSorted->Enable( event.GetInt() == 0 );
990 FindWindow(ID_CHANGE_COLOUR)->Enable( event.GetInt() == 0 );
991 break;
992 }
993 case ID_LISTBOX_SEL_NUM:
994 {
995 m_listbox->SetSelection( 2 );
996 m_listboxSorted->SetSelection( 2 );
997 m_lbSelectThis->WarpPointer( 40, 14 );
998 break;
999 }
1000 case ID_LISTBOX_SEL_STR:
1001 {
1002 m_listbox->SetStringSelection( "This" );
1003 m_listboxSorted->SetStringSelection( "This" );
1004 m_lbSelectNum->WarpPointer( 40, 14 );
1005 break;
1006 }
1007 case ID_LISTBOX_CLEAR:
1008 {
1009 m_listbox->Clear();
1010 m_listboxSorted->Clear();
1011 break;
1012 }
1013 case ID_LISTBOX_APPEND:
1014 {
1015 m_listbox->Append( "Hi!" );
1016 m_listboxSorted->Append( "Hi!" );
1017 break;
1018 }
1019 case ID_LISTBOX_DELETE:
1020 {
1021 int idx;
1022 idx = m_listbox->GetSelection();
1023 if ( idx != wxNOT_FOUND )
1024 m_listbox->Delete( idx );
1025 idx = m_listboxSorted->GetSelection();
1026 if ( idx != wxNOT_FOUND )
1027 m_listboxSorted->Delete( idx );
1028 break;
1029 }
1030 case ID_LISTBOX_FONT:
1031 {
1032 m_listbox->SetFont( *wxITALIC_FONT );
1033 m_listboxSorted->SetFont( *wxITALIC_FONT );
1034 m_checkbox->SetFont( *wxITALIC_FONT );
1035 break;
1036 }
1037 }
1038 }
1039
1040 #if wxUSE_CHOICE
1041 void MyPanel::OnChoice( wxCommandEvent &event )
1042 {
1043 wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice
1044 : m_choiceSorted;
1045
1046 m_text->AppendText( "Choice event selection string is: '" );
1047 m_text->AppendText( event.GetString() );
1048 m_text->AppendText( "'\n" );
1049 m_text->AppendText( "Choice control selection string is: '" );
1050 m_text->AppendText( choice->GetStringSelection() );
1051 m_text->AppendText( "'\n" );
1052
1053 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
1054 m_text->AppendText( "Choice event client data string is: '" );
1055
1056 if (obj)
1057 m_text->AppendText( obj->GetData() );
1058 else
1059 m_text->AppendText( wxString("none") );
1060
1061 m_text->AppendText( "'\n" );
1062 m_text->AppendText( "Choice control client data string is: '" );
1063 obj = (wxStringClientData *)choice->GetClientObject(choice->GetSelection());
1064
1065 if (obj)
1066 m_text->AppendText( obj->GetData() );
1067 else
1068 m_text->AppendText( wxString("none") );
1069 m_text->AppendText( "'\n" );
1070 }
1071
1072 void MyPanel::OnChoiceButtons( wxCommandEvent &event )
1073 {
1074 switch (event.GetId())
1075 {
1076 case ID_CHOICE_ENABLE:
1077 {
1078 m_choice->Enable( event.GetInt() == 0 );
1079 m_choiceSorted->Enable( event.GetInt() == 0 );
1080 break;
1081 }
1082 case ID_CHOICE_SEL_NUM:
1083 {
1084 m_choice->SetSelection( 2 );
1085 m_choiceSorted->SetSelection( 2 );
1086 break;
1087 }
1088 case ID_CHOICE_SEL_STR:
1089 {
1090 m_choice->SetStringSelection( "This" );
1091 m_choiceSorted->SetStringSelection( "This" );
1092 break;
1093 }
1094 case ID_CHOICE_CLEAR:
1095 {
1096 m_choice->Clear();
1097 m_choiceSorted->Clear();
1098 break;
1099 }
1100 case ID_CHOICE_APPEND:
1101 {
1102 m_choice->Append( "Hi!" );
1103 m_choiceSorted->Append( "Hi!" );
1104 break;
1105 }
1106 case ID_CHOICE_DELETE:
1107 {
1108 int idx = m_choice->GetSelection();
1109 if ( idx != wxNOT_FOUND )
1110 m_choice->Delete( idx );
1111 idx = m_choiceSorted->GetSelection();
1112 if ( idx != wxNOT_FOUND )
1113 m_choiceSorted->Delete( idx );
1114 break;
1115 }
1116 case ID_CHOICE_FONT:
1117 {
1118 m_choice->SetFont( *wxITALIC_FONT );
1119 m_choiceSorted->SetFont( *wxITALIC_FONT );
1120 break;
1121 }
1122 }
1123 }
1124 #endif // wxUSE_CHOICE
1125
1126 void MyPanel::OnCombo( wxCommandEvent &event )
1127 {
1128 m_text->AppendText( "ComboBox event selection string is: " );
1129 m_text->AppendText( event.GetString() );
1130 m_text->AppendText( "\n" );
1131 m_text->AppendText( "ComboBox control selection string is: " );
1132 m_text->AppendText( m_combo->GetStringSelection() );
1133 m_text->AppendText( "\n" );
1134 }
1135
1136 void MyPanel::OnComboTextChanged(wxCommandEvent& WXUNUSED(event))
1137 {
1138 wxLogMessage(_T("Text in the combobox changed: now is '%s'."),
1139 m_combo->GetValue().c_str());
1140 }
1141
1142 void MyPanel::OnComboTextEnter(wxCommandEvent& WXUNUSED(event))
1143 {
1144 wxLogMessage(_T("Enter pressed in the combobox: value is '%s'."),
1145 m_combo->GetValue().c_str());
1146 }
1147
1148 void MyPanel::OnComboButtons( wxCommandEvent &event )
1149 {
1150 switch (event.GetId())
1151 {
1152 case ID_COMBO_ENABLE:
1153 {
1154 m_combo->Enable( event.GetInt() == 0 );
1155 break;
1156 }
1157 case ID_COMBO_SEL_NUM:
1158 {
1159 m_combo->SetSelection( 2 );
1160 break;
1161 }
1162 case ID_COMBO_SEL_STR:
1163 {
1164 m_combo->SetStringSelection( "This" );
1165 break;
1166 }
1167 case ID_COMBO_CLEAR:
1168 {
1169 m_combo->Clear();
1170 break;
1171 }
1172 case ID_COMBO_APPEND:
1173 {
1174 m_combo->Append( "Hi!" );
1175 break;
1176 }
1177 case ID_COMBO_DELETE:
1178 {
1179 int idx = m_combo->GetSelection();
1180 m_combo->Delete( idx );
1181 break;
1182 }
1183 case ID_COMBO_FONT:
1184 {
1185 m_combo->SetFont( *wxITALIC_FONT );
1186 break;
1187 }
1188 }
1189 }
1190
1191 void MyPanel::OnRadio( wxCommandEvent &event )
1192 {
1193 m_text->AppendText( "RadioBox selection string is: " );
1194 m_text->AppendText( event.GetString() );
1195 m_text->AppendText( "\n" );
1196 }
1197
1198 void MyPanel::OnRadioButtons( wxCommandEvent &event )
1199 {
1200 switch (event.GetId())
1201 {
1202 case ID_RADIOBOX_ENABLE:
1203 {
1204 m_radio->Enable( event.GetInt() == 0 );
1205 break;
1206 }
1207 case ID_RADIOBOX_SEL_NUM:
1208 {
1209 m_radio->SetSelection( 2 );
1210 break;
1211 }
1212 case ID_RADIOBOX_SEL_STR:
1213 {
1214 m_radio->SetStringSelection( "This" );
1215 break;
1216 }
1217 case ID_RADIOBOX_FONT:
1218 {
1219 m_radio->SetFont( *wxITALIC_FONT );
1220 break;
1221 }
1222 }
1223 }
1224
1225 void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) )
1226 {
1227 m_fontButton->SetFont( *wxITALIC_FONT );
1228 m_text->SetFont( *wxITALIC_FONT );
1229 }
1230
1231 void MyPanel::OnUpdateLabel( wxCommandEvent &event )
1232 {
1233 m_label->SetLabel(event.GetInt() ? "Very very very very very long text."
1234 : "Shorter text.");
1235 }
1236
1237 void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
1238 {
1239 m_gauge->SetValue( m_slider->GetValue() );
1240 m_gaugeVert->SetValue( m_slider->GetValue() / 2 );
1241 }
1242
1243 #if wxUSE_SPINCTRL
1244
1245 void MyPanel::OnSpinCtrl(wxSpinEvent& event)
1246 {
1247 if (!m_spinctrl)
1248 return ;
1249 wxString s;
1250 s.Printf(_T("Spin ctrl changed: now %d (from event: %d)\n"),
1251 m_spinctrl->GetValue(), event.GetInt());
1252 m_text->AppendText(s);
1253 }
1254
1255 #endif // wxUSE_SPINCTRL
1256
1257 #if wxUSE_SPINBTN
1258 void MyPanel::OnSpinUp( wxSpinEvent &event )
1259 {
1260 wxString value;
1261 value.Printf( _T("Spin control up: current = %d\n"),
1262 m_spinbutton->GetValue());
1263
1264 if ( event.GetPosition() > 17 )
1265 {
1266 value += _T("Preventing the spin button from going above 17.\n");
1267
1268 event.Veto();
1269 }
1270
1271 m_text->AppendText(value);
1272 }
1273
1274 void MyPanel::OnSpinDown( wxSpinEvent &event )
1275 {
1276 wxString value;
1277 value.Printf( _T("Spin control down: current = %d\n"),
1278 m_spinbutton->GetValue());
1279
1280 if ( event.GetPosition() < -17 )
1281 {
1282 value += _T("Preventing the spin button from going below -17.\n");
1283
1284 event.Veto();
1285 }
1286
1287 m_text->AppendText(value);
1288 }
1289
1290 void MyPanel::OnSpinUpdate( wxSpinEvent &event )
1291 {
1292 wxString value;
1293 value.Printf( _T("%d"), event.GetPosition() );
1294 m_spintext->SetValue( value );
1295
1296 value.Printf( _T("Spin control range: (%d, %d), current = %d\n"),
1297 m_spinbutton->GetMin(), m_spinbutton->GetMax(),
1298 m_spinbutton->GetValue());
1299
1300 m_text->AppendText(value);
1301 }
1302
1303 void MyPanel::OnUpdateShowProgress( wxUpdateUIEvent& event )
1304 {
1305 event.Enable( m_spinbutton->GetValue() > 0 );
1306 }
1307
1308 void MyPanel::OnShowProgress( wxCommandEvent& WXUNUSED(event) )
1309 {
1310 int max = m_spinbutton->GetValue();
1311
1312 if ( max <= 0 )
1313 {
1314 wxLogError(_T("You must set positive range!"));
1315 return;
1316 }
1317
1318 wxProgressDialog dialog("Progress dialog example",
1319 "An informative message",
1320 max, // range
1321 this, // parent
1322 wxPD_CAN_ABORT |
1323 wxPD_AUTO_HIDE |
1324 wxPD_APP_MODAL |
1325 wxPD_ELAPSED_TIME |
1326 wxPD_ESTIMATED_TIME |
1327 wxPD_REMAINING_TIME);
1328
1329
1330 bool cont = TRUE;
1331 for ( int i = 0; i <= max && cont; i++ )
1332 {
1333 wxSleep(1);
1334 if ( i == max )
1335 {
1336 cont = dialog.Update(i, "That's all, folks!");
1337 }
1338 else if ( i == max / 2 )
1339 {
1340 cont = dialog.Update(i, "Only a half left (very long message)!");
1341 }
1342 else
1343 {
1344 cont = dialog.Update(i);
1345 }
1346 }
1347
1348 if ( !cont )
1349 {
1350 *m_text << "Progress dialog aborted!\n";
1351 }
1352 else
1353 {
1354 *m_text << "Countdown from " << max << " finished.\n";
1355 }
1356 }
1357
1358 #endif // wxUSE_SPINBTN
1359
1360 MyPanel::~MyPanel()
1361 {
1362 //wxLog::RemoveTraceMask(_T("focus"));
1363 delete wxLog::SetActiveTarget(m_logTargetOld);
1364
1365 delete m_notebook->GetImageList();
1366 }
1367
1368 //----------------------------------------------------------------------
1369 // MyFrame
1370 //----------------------------------------------------------------------
1371
1372 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1373 EVT_MENU(CONTROLS_QUIT, MyFrame::OnQuit)
1374 EVT_MENU(CONTROLS_ABOUT, MyFrame::OnAbout)
1375 EVT_MENU(CONTROLS_CLEAR_LOG, MyFrame::OnClearLog)
1376 #if wxUSE_TOOLTIPS
1377 EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1378 EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
1379 #endif // wxUSE_TOOLTIPS
1380
1381 EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
1382
1383 EVT_SIZE(MyFrame::OnSize)
1384 EVT_MOVE(MyFrame::OnMove)
1385
1386 EVT_IDLE(MyFrame::OnIdle)
1387 END_EVENT_TABLE()
1388
1389 MyFrame::MyFrame(const char *title, int x, int y)
1390 : wxFrame(NULL, -1, title, wxPoint(x, y), wxSize(500, 430))
1391 {
1392 // Give it an icon
1393 // The wxICON() macros loads an icon from a resource under Windows
1394 // and uses an #included XPM image under GTK+ and Motif
1395
1396 SetIcon( wxICON(mondrian) );
1397
1398 wxMenu *file_menu = new wxMenu;
1399
1400 file_menu->Append(CONTROLS_CLEAR_LOG, "&Clear log\tCtrl-L");
1401 file_menu->AppendSeparator();
1402 file_menu->Append(CONTROLS_ABOUT, "&About\tF1");
1403 file_menu->AppendSeparator();
1404 file_menu->Append(CONTROLS_QUIT, "E&xit\tAlt-X", "Quit controls sample");
1405
1406 wxMenuBar *menu_bar = new wxMenuBar;
1407 menu_bar->Append(file_menu, "&File");
1408
1409 #if wxUSE_TOOLTIPS
1410 wxMenu *tooltip_menu = new wxMenu;
1411 tooltip_menu->Append(CONTROLS_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D");
1412 tooltip_menu->AppendSeparator();
1413 tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, "&Toggle tooltips\tCtrl-T",
1414 "enable/disable tooltips", TRUE);
1415 tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, TRUE);
1416 menu_bar->Append(tooltip_menu, "&Tooltips");
1417 #endif // wxUSE_TOOLTIPS
1418
1419 wxMenu *panel_menu = new wxMenu;
1420 panel_menu->Append(CONTROLS_ENABLE_ALL, "&Disable all\tCtrl-E",
1421 "Enable/disable all panel controls", TRUE);
1422 menu_bar->Append(panel_menu, "&Panel");
1423
1424 SetMenuBar(menu_bar);
1425
1426 CreateStatusBar(2);
1427
1428 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1429
1430 SetSizeHints( 500, 425 );
1431 }
1432
1433 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1434 {
1435 Close(TRUE);
1436 }
1437
1438 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1439 {
1440 wxBusyCursor bc;
1441
1442 wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
1443 dialog.ShowModal();
1444 }
1445
1446 void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
1447 {
1448 m_panel->m_text->Clear();
1449 }
1450
1451 #if wxUSE_TOOLTIPS
1452 void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1453 {
1454 static long s_delay = 5000;
1455
1456 wxString delay;
1457 delay.Printf( _T("%ld"), s_delay);
1458
1459 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
1460 "Set tooltip delay",
1461 delay,
1462 this);
1463 if ( !delay )
1464 return; // cancelled
1465
1466 wxSscanf(delay, _T("%ld"), &s_delay);
1467
1468 wxToolTip::SetDelay(s_delay);
1469
1470 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
1471 }
1472
1473 void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1474 {
1475 static bool s_enabled = TRUE;
1476
1477 s_enabled = !s_enabled;
1478
1479 wxToolTip::Enable(s_enabled);
1480
1481 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
1482 }
1483 #endif // tooltips
1484
1485 void MyFrame::OnEnableAll(wxCommandEvent& WXUNUSED(event))
1486 {
1487 static bool s_enable = TRUE;
1488
1489 s_enable = !s_enable;
1490 m_panel->Enable(s_enable);
1491 }
1492
1493 void MyFrame::OnMove( wxMoveEvent& event )
1494 {
1495 UpdateStatusBar(event.GetPosition(), GetSize());
1496
1497 event.Skip();
1498 }
1499
1500 void MyFrame::OnSize( wxSizeEvent& event )
1501 {
1502 UpdateStatusBar(GetPosition(), event.GetSize());
1503
1504 event.Skip();
1505 }
1506
1507 void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
1508 {
1509 // track the window which has the focus in the status bar
1510 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1511 wxWindow *focus = wxWindow::FindFocus();
1512 if ( focus && (focus != s_windowFocus) )
1513 {
1514 s_windowFocus = focus;
1515
1516 wxString msg;
1517 msg.Printf(
1518 #ifdef __WXMSW__
1519 _T("Focus: %s, HWND = %08x"),
1520 #else
1521 _T("Focus: %s"),
1522 #endif
1523 s_windowFocus->GetClassInfo()->GetClassName()
1524 #ifdef __WXMSW__
1525 , s_windowFocus->GetHWND()
1526 #endif
1527 );
1528
1529 SetStatusText(msg);
1530 }
1531 }
1532
1533 void MyComboBox::OnChar(wxKeyEvent& event)
1534 {
1535 wxLogMessage(_T("MyComboBox::OnChar"));
1536
1537 if ( event.KeyCode() == 'w' )
1538 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1539 else
1540 event.Skip();
1541 }
1542
1543 void MyComboBox::OnKeyDown(wxKeyEvent& event)
1544 {
1545 wxLogMessage(_T("MyComboBox::OnKeyDown"));
1546
1547 if ( event.KeyCode() == 'w' )
1548 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1549 else
1550 event.Skip();
1551 }
1552
1553 void MyComboBox::OnKeyUp(wxKeyEvent& event)
1554 {
1555 wxLogMessage(_T("MyComboBox::OnKeyUp"));
1556
1557 event.Skip();
1558 }
1559
1560 static void SetListboxClientData(const wxChar *name, wxListBox *control)
1561 {
1562 size_t count = control->GetCount();
1563 for ( size_t n = 0; n < count; n++ )
1564 {
1565 wxString s;
1566 s.Printf(wxT("%s client data for '%s'"),
1567 name, control->GetString(n).c_str());
1568
1569 control->SetClientObject(n, new wxStringClientData(s));
1570 }
1571 }
1572
1573 static void SetChoiceClientData(const wxChar *name, wxChoice *control)
1574 {
1575 size_t count = control->GetCount();
1576 for ( size_t n = 0; n < count; n++ )
1577 {
1578 wxString s;
1579 s.Printf(wxT("%s client data for '%s'"),
1580 name, control->GetString(n).c_str());
1581
1582 control->SetClientObject(n, new wxStringClientData(s));
1583 }
1584 }