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