gcc 3.1 warning fixes (patch 598343)
[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) { SetForegroundColour(*wxRED); }
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 m_radio->SetForegroundColour(*wxRED);
686
687 #if wxUSE_TOOLTIPS
688 m_combo->SetToolTip("This is a natural\ncombobox - can you believe me?");
689 m_radio->SetToolTip("Ever seen a radiobox?");
690 #endif // wxUSE_TOOLTIPS
691
692 (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
693 (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "&Select 'This'", wxPoint(180,80), wxSize(140,30) );
694 m_fontButton = new wxButton( panel, ID_SET_FONT, "Set &more Italic font", wxPoint(340,30), wxSize(140,30) );
695 (void)new wxButton( panel, ID_RADIOBOX_FONT, "Set &Italic font", wxPoint(340,80), wxSize(140,30) );
696 (void)new wxCheckBox( panel, ID_RADIOBOX_ENABLE, "&Disable", wxPoint(340,130), wxDefaultSize );
697 wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxDefaultSize, wxRB_GROUP );
698 rb->SetValue( FALSE );
699 (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "&Radiobutton2", wxPoint(340,170), wxDefaultSize );
700 m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
701
702 panel = new wxPanel(m_notebook);
703 (void)new wxStaticBox( panel, -1, "&wxGauge and wxSlider", wxPoint(10,10), wxSize(222,130) );
704 m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155, 30), wxGA_HORIZONTAL|wxNO_BORDER );
705 m_gauge->SetBackgroundColour(*wxGREEN);
706 m_gauge->SetForegroundColour(*wxRED);
707 m_gaugeVert = new wxGauge( panel, -1, 100,
708 wxPoint(195,35), wxSize(30, 90),
709 wxGA_VERTICAL | wxGA_SMOOTH | wxNO_BORDER );
710 m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1),
711 wxSL_AUTOTICKS | wxSL_LABELS );
712 m_slider->SetTickFreq(40, 0);
713 m_slider->SetToolTip(_T("This is a sliding slider"));
714
715 (void)new wxStaticBox( panel, -1, "&Explanation",
716 wxPoint(230,10), wxSize(270,130),
717 wxALIGN_CENTER );
718
719 #ifdef __WXMOTIF__
720 // No wrapping text in wxStaticText yet :-(
721 (void)new wxStaticText( panel, -1,
722 "Drag the slider!",
723 wxPoint(250,30),
724 wxSize(240, -1)
725 );
726 #else
727 (void)new wxStaticText( panel, -1,
728 "In order see the gauge (aka progress bar)\n"
729 "control do something you have to drag the\n"
730 "handle of the slider to the right.\n"
731 "\n"
732 "This is also supposed to demonstrate how\n"
733 "to use static controls.\n",
734 wxPoint(250,25),
735 wxSize(240, 110)
736 );
737 #endif
738 int initialSpinValue = -5;
739 wxString s;
740 s << initialSpinValue;
741 m_spintext = new wxTextCtrl( panel, -1, s, wxPoint(20,160), wxSize(80,-1) );
742 #if wxUSE_SPINBTN
743 m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160), wxSize(80, -1) );
744 m_spinbutton->SetRange(-40,30);
745 m_spinbutton->SetValue(initialSpinValue);
746
747 m_btnProgress = new wxButton( panel, ID_BTNPROGRESS, "&Show progress dialog",
748 wxPoint(300, 160) );
749 #endif // wxUSE_SPINBTN
750
751 #if wxUSE_SPINCTRL
752 m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, "", wxPoint(200, 160), wxSize(80, -1) );
753 m_spinctrl->SetRange(10,30);
754 m_spinctrl->SetValue(15);
755 #endif // wxUSE_SPINCTRL
756
757 m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
758
759 panel = new wxPanel(m_notebook);
760
761 #if !defined(__WXMOTIF__) && !defined(__WIN16__) // wxStaticBitmap not working under Motif yet; and icons not allowed under WIN16.
762 wxIcon icon = wxArtProvider::GetIcon(wxART_INFORMATION);
763 (void) new wxStaticBitmap( panel, -1, icon, wxPoint(10, 10) );
764
765 // VZ: don't leak memory
766 // bmpStatic = new wxStaticBitmap(panel, -1, wxNullIcon, wxPoint(50, 10));
767 // bmpStatic->SetIcon(wxArtProvider::GetIcon(wxART_QUESTION));
768 #endif // !Motif
769
770 wxBitmap bitmap( 100, 100 );
771 wxMemoryDC dc;
772 dc.SelectObject( bitmap );
773 dc.SetPen(*wxGREEN_PEN);
774 dc.Clear();
775 dc.DrawEllipse(5, 5, 90, 90);
776 dc.DrawText("Bitmap", 30, 40);
777 dc.SelectObject( wxNullBitmap );
778
779 (void)new wxBitmapButton(panel, ID_BITMAP_BTN, bitmap, wxPoint(100, 20));
780
781 #ifdef __WXMSW__
782 // test for masked bitmap display
783 bitmap = wxBitmap("test2.bmp", wxBITMAP_TYPE_BMP);
784 if (bitmap.Ok())
785 {
786 bitmap.SetMask(new wxMask(bitmap, *wxBLUE));
787
788 (void)new wxStaticBitmap /* wxBitmapButton */ (panel, -1, bitmap, wxPoint(300, 120));
789 }
790 #endif
791
792 wxBitmap bmp1(wxArtProvider::GetBitmap(wxART_INFORMATION)),
793 bmp2(wxArtProvider::GetBitmap(wxART_WARNING)),
794 bmp3(wxArtProvider::GetBitmap(wxART_QUESTION));
795 wxBitmapButton *bmpBtn = new wxBitmapButton
796 (
797 panel, -1,
798 bmp1,
799 wxPoint(30, 70)
800 );
801
802 bmpBtn->SetBitmapSelected(bmp2);
803 bmpBtn->SetBitmapFocus(bmp3);
804
805 #if wxUSE_TOGGLEBTN
806 (void)new wxToggleButton(panel, ID_BUTTON_LABEL,
807 "&Toggle label", wxPoint(250, 20));
808 #endif // wxUSE_TOGGLEBTN
809
810 m_label = new wxStaticText(panel, -1, "Label with some long text",
811 wxPoint(250, 60), wxDefaultSize,
812 wxALIGN_RIGHT /*| wxST_NO_AUTORESIZE*/);
813 m_label->SetForegroundColour( *wxBLUE );
814
815 m_notebook->AddPage(panel, "wxBitmapXXX");
816
817 // layout constraints
818 #if wxUSE_CONSTRAINTS
819 wxLayoutConstraints *c;
820
821 panel = new wxPanel(m_notebook);
822 panel->SetAutoLayout( TRUE );
823
824 c = new wxLayoutConstraints;
825 c->top.SameAs( panel, wxTop, 10 );
826 c->height.AsIs( );
827 c->left.SameAs( panel, wxLeft, 10 );
828 c->width.PercentOf( panel, wxWidth, 40 );
829
830 wxButton *pMyButton = new wxButton(panel, ID_BUTTON_TEST1, "Test Button &1" );
831 pMyButton->SetConstraints( c );
832
833 c = new wxLayoutConstraints;
834 c->top.SameAs( panel, wxTop, 10 );
835 c->bottom.SameAs( panel, wxBottom, 10 );
836 c->right.SameAs( panel, wxRight, 10 );
837 c->width.PercentOf( panel, wxWidth, 40 );
838
839 wxButton *pMyButton2 = new wxButton(panel, ID_BUTTON_TEST2, "Test Button &2" );
840 pMyButton2->SetConstraints( c );
841
842 m_notebook->AddPage(panel, "wxLayoutConstraint");
843 #endif
844
845 // sizer
846
847 panel = new wxPanel(m_notebook);
848 panel->SetAutoLayout( TRUE );
849
850 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
851
852 sizer->Add( new wxButton(panel, -1, "Test Button &1" ), 3, wxALL, 10 );
853 sizer->Add( 20,20, 1 );
854 sizer->Add( new wxButton(panel, -1, "Multiline\nbutton" ), 3, wxGROW|wxALL, 10 );
855
856 panel->SetSizer( sizer );
857
858 m_notebook->AddPage(panel, "wxSizer");
859 }
860
861 void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
862 {
863 int x = 0;
864 int y = 0;
865 GetClientSize( &x, &y );
866
867 if (m_notebook) m_notebook->SetSize( 2, 2, x-4, y*2/3-4 );
868 if (m_text) m_text->SetSize( 2, y*2/3+2, x-4, y/3-4 );
869 }
870
871 void MyPanel::OnPageChanging( wxNotebookEvent &event )
872 {
873 int selOld = event.GetOldSelection();
874 if ( selOld == 2 )
875 {
876 if ( wxMessageBox("This demonstrates how a program may prevent the\n"
877 "page change from taking place - if you select\n"
878 "[No] the current page will stay the third one\n",
879 "Control sample",
880 wxICON_QUESTION | wxYES_NO, this) != wxYES )
881 {
882 event.Veto();
883
884 return;
885 }
886 }
887
888 *m_text << "Notebook selection is being changed from " << selOld
889 << " to " << event.GetSelection()
890 << " (current page from notebook is "
891 << m_notebook->GetSelection() << ")\n";
892 }
893
894 void MyPanel::OnPageChanged( wxNotebookEvent &event )
895 {
896 *m_text << "Notebook selection is now " << event.GetSelection()
897 << " (from notebook: " << m_notebook->GetSelection() << ")\n";
898 }
899
900 void MyPanel::OnTestButton(wxCommandEvent& event)
901 {
902 wxLogMessage(_T("Button %c clicked."),
903 event.GetId() == ID_BUTTON_TEST1 ? _T('1') : _T('2'));
904 }
905
906 void MyPanel::OnBmpButton(wxCommandEvent& event)
907 {
908 wxLogMessage(_T("Bitmap button clicked."));
909 }
910
911 void MyPanel::OnChangeColour(wxCommandEvent& WXUNUSED(event))
912 {
913 static wxColour s_colOld;
914
915 // test panel colour changing and propagation to the subcontrols
916 if ( s_colOld.Ok() )
917 {
918 SetBackgroundColour(s_colOld);
919 s_colOld = wxNullColour;
920
921 m_lbSelectThis->SetForegroundColour(wxT("red"));
922 m_lbSelectThis->SetBackgroundColour(wxT("white"));
923 }
924 else
925 {
926 s_colOld = wxColour(wxT("red"));
927 SetBackgroundColour(wxT("white"));
928
929 m_lbSelectThis->SetForegroundColour(wxT("white"));
930 m_lbSelectThis->SetBackgroundColour(wxT("red"));
931 }
932
933 m_lbSelectThis->Refresh();
934 Refresh();
935 }
936
937 void MyPanel::OnListBox( wxCommandEvent &event )
938 {
939 // GetParent()->Move(100, 100);
940
941 if (event.GetInt() == -1)
942 {
943 m_text->AppendText( "ListBox has no selections anymore\n" );
944 return;
945 }
946
947 wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
948 : m_listboxSorted;
949
950 m_text->AppendText( "ListBox event selection string is: '" );
951 m_text->AppendText( event.GetString() );
952 m_text->AppendText( "'\n" );
953 m_text->AppendText( "ListBox control selection string is: '" );
954 m_text->AppendText( listbox->GetStringSelection() );
955 m_text->AppendText( "'\n" );
956
957 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
958 m_text->AppendText( "ListBox event client data string is: '" );
959 if (obj) // BC++ doesn't like use of '? .. : .. ' in this context
960 m_text->AppendText( obj->GetData() );
961 else
962 m_text->AppendText( wxString("none") );
963
964 m_text->AppendText( "'\n" );
965 m_text->AppendText( "ListBox control client data string is: '" );
966 obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection());
967 if (obj)
968 m_text->AppendText( obj->GetData() );
969 else
970 m_text->AppendText( wxString("none") );
971 m_text->AppendText( "'\n" );
972 }
973
974 void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
975 {
976 m_text->AppendText( "ListBox double click string is: " );
977 m_text->AppendText( event.GetString() );
978 m_text->AppendText( "\n" );
979 }
980
981 void MyPanel::OnListBoxButtons( wxCommandEvent &event )
982 {
983 switch (event.GetId())
984 {
985 case ID_LISTBOX_ENABLE:
986 {
987 m_text->AppendText("Checkbox clicked.\n");
988 #if wxUSE_TOOLTIPS
989 wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
990 if (event.GetInt())
991 cb->SetToolTip( "Click to enable listbox" );
992 else
993 cb->SetToolTip( "Click to disable listbox" );
994 #endif // wxUSE_TOOLTIPS
995 m_listbox->Enable( event.GetInt() == 0 );
996 m_lbSelectThis->Enable( event.GetInt() == 0 );
997 m_lbSelectNum->Enable( event.GetInt() == 0 );
998 m_listboxSorted->Enable( event.GetInt() == 0 );
999 FindWindow(ID_CHANGE_COLOUR)->Enable( event.GetInt() == 0 );
1000 break;
1001 }
1002 case ID_LISTBOX_SEL_NUM:
1003 {
1004 m_listbox->SetSelection( 2 );
1005 m_listboxSorted->SetSelection( 2 );
1006 m_lbSelectThis->WarpPointer( 40, 14 );
1007 break;
1008 }
1009 case ID_LISTBOX_SEL_STR:
1010 {
1011 m_listbox->SetStringSelection( "This" );
1012 m_listboxSorted->SetStringSelection( "This" );
1013 m_lbSelectNum->WarpPointer( 40, 14 );
1014 break;
1015 }
1016 case ID_LISTBOX_CLEAR:
1017 {
1018 m_listbox->Clear();
1019 m_listboxSorted->Clear();
1020 break;
1021 }
1022 case ID_LISTBOX_APPEND:
1023 {
1024 m_listbox->Append( "Hi!" );
1025 m_listboxSorted->Append( "Hi!" );
1026 break;
1027 }
1028 case ID_LISTBOX_DELETE:
1029 {
1030 int idx;
1031 idx = m_listbox->GetSelection();
1032 if ( idx != wxNOT_FOUND )
1033 m_listbox->Delete( idx );
1034 idx = m_listboxSorted->GetSelection();
1035 if ( idx != wxNOT_FOUND )
1036 m_listboxSorted->Delete( idx );
1037 break;
1038 }
1039 case ID_LISTBOX_FONT:
1040 {
1041 m_listbox->SetFont( *wxITALIC_FONT );
1042 m_listboxSorted->SetFont( *wxITALIC_FONT );
1043 m_checkbox->SetFont( *wxITALIC_FONT );
1044 break;
1045 }
1046 }
1047 }
1048
1049 #if wxUSE_CHOICE
1050 void MyPanel::OnChoice( wxCommandEvent &event )
1051 {
1052 wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice
1053 : m_choiceSorted;
1054
1055 m_text->AppendText( "Choice event selection string is: '" );
1056 m_text->AppendText( event.GetString() );
1057 m_text->AppendText( "'\n" );
1058 m_text->AppendText( "Choice control selection string is: '" );
1059 m_text->AppendText( choice->GetStringSelection() );
1060 m_text->AppendText( "'\n" );
1061
1062 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
1063 m_text->AppendText( "Choice event client data string is: '" );
1064
1065 if (obj)
1066 m_text->AppendText( obj->GetData() );
1067 else
1068 m_text->AppendText( wxString("none") );
1069
1070 m_text->AppendText( "'\n" );
1071 m_text->AppendText( "Choice control client data string is: '" );
1072 obj = (wxStringClientData *)choice->GetClientObject(choice->GetSelection());
1073
1074 if (obj)
1075 m_text->AppendText( obj->GetData() );
1076 else
1077 m_text->AppendText( wxString("none") );
1078 m_text->AppendText( "'\n" );
1079 }
1080
1081 void MyPanel::OnChoiceButtons( wxCommandEvent &event )
1082 {
1083 switch (event.GetId())
1084 {
1085 case ID_CHOICE_ENABLE:
1086 {
1087 m_choice->Enable( event.GetInt() == 0 );
1088 m_choiceSorted->Enable( event.GetInt() == 0 );
1089 break;
1090 }
1091 case ID_CHOICE_SEL_NUM:
1092 {
1093 m_choice->SetSelection( 2 );
1094 m_choiceSorted->SetSelection( 2 );
1095 break;
1096 }
1097 case ID_CHOICE_SEL_STR:
1098 {
1099 m_choice->SetStringSelection( "This" );
1100 m_choiceSorted->SetStringSelection( "This" );
1101 break;
1102 }
1103 case ID_CHOICE_CLEAR:
1104 {
1105 m_choice->Clear();
1106 m_choiceSorted->Clear();
1107 break;
1108 }
1109 case ID_CHOICE_APPEND:
1110 {
1111 m_choice->Append( "Hi!" );
1112 m_choiceSorted->Append( "Hi!" );
1113 break;
1114 }
1115 case ID_CHOICE_DELETE:
1116 {
1117 int idx = m_choice->GetSelection();
1118 if ( idx != wxNOT_FOUND )
1119 m_choice->Delete( idx );
1120 idx = m_choiceSorted->GetSelection();
1121 if ( idx != wxNOT_FOUND )
1122 m_choiceSorted->Delete( idx );
1123 break;
1124 }
1125 case ID_CHOICE_FONT:
1126 {
1127 m_choice->SetFont( *wxITALIC_FONT );
1128 m_choiceSorted->SetFont( *wxITALIC_FONT );
1129 break;
1130 }
1131 }
1132 }
1133 #endif // wxUSE_CHOICE
1134
1135 void MyPanel::OnCombo( wxCommandEvent &event )
1136 {
1137 m_text->AppendText( "ComboBox event selection string is: " );
1138 m_text->AppendText( event.GetString() );
1139 m_text->AppendText( "\n" );
1140 m_text->AppendText( "ComboBox control selection string is: " );
1141 m_text->AppendText( m_combo->GetStringSelection() );
1142 m_text->AppendText( "\n" );
1143 }
1144
1145 void MyPanel::OnComboTextChanged(wxCommandEvent& event)
1146 {
1147 wxString str;
1148 str.Printf( wxT("Text in the combobox changed: now is '%s'."),
1149 event.GetString().c_str() );
1150 wxLogMessage( str.c_str() );
1151 }
1152
1153 void MyPanel::OnComboTextEnter(wxCommandEvent& WXUNUSED(event))
1154 {
1155 wxLogMessage(_T("Enter pressed in the combobox: value is '%s'."),
1156 m_combo->GetValue().c_str());
1157 }
1158
1159 void MyPanel::OnComboButtons( wxCommandEvent &event )
1160 {
1161 switch (event.GetId())
1162 {
1163 case ID_COMBO_ENABLE:
1164 {
1165 m_combo->Enable( event.GetInt() == 0 );
1166 break;
1167 }
1168 case ID_COMBO_SEL_NUM:
1169 {
1170 m_combo->SetSelection( 2 );
1171 break;
1172 }
1173 case ID_COMBO_SEL_STR:
1174 {
1175 m_combo->SetStringSelection( "This" );
1176 break;
1177 }
1178 case ID_COMBO_CLEAR:
1179 {
1180 m_combo->Clear();
1181 break;
1182 }
1183 case ID_COMBO_APPEND:
1184 {
1185 m_combo->Append( "Hi!" );
1186 break;
1187 }
1188 case ID_COMBO_DELETE:
1189 {
1190 int idx = m_combo->GetSelection();
1191 m_combo->Delete( idx );
1192 break;
1193 }
1194 case ID_COMBO_FONT:
1195 {
1196 m_combo->SetFont( *wxITALIC_FONT );
1197 break;
1198 }
1199 }
1200 }
1201
1202 void MyPanel::OnRadio( wxCommandEvent &event )
1203 {
1204 m_text->AppendText( "RadioBox selection string is: " );
1205 m_text->AppendText( event.GetString() );
1206 m_text->AppendText( "\n" );
1207 }
1208
1209 void MyPanel::OnRadioButtons( wxCommandEvent &event )
1210 {
1211 switch (event.GetId())
1212 {
1213 case ID_RADIOBOX_ENABLE:
1214 {
1215 m_radio->Enable( event.GetInt() == 0 );
1216 break;
1217 }
1218 case ID_RADIOBOX_SEL_NUM:
1219 {
1220 m_radio->SetSelection( 2 );
1221 break;
1222 }
1223 case ID_RADIOBOX_SEL_STR:
1224 {
1225 m_radio->SetStringSelection( "This" );
1226 break;
1227 }
1228 case ID_RADIOBOX_FONT:
1229 {
1230 m_radio->SetForegroundColour(*wxGREEN);
1231
1232 m_radio->SetFont( *wxITALIC_FONT );
1233 break;
1234 }
1235 }
1236 }
1237
1238 void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) )
1239 {
1240 m_fontButton->SetFont( *wxITALIC_FONT );
1241 m_text->SetFont( *wxITALIC_FONT );
1242 }
1243
1244 void MyPanel::OnUpdateLabel( wxCommandEvent &event )
1245 {
1246 m_label->SetLabel(event.GetInt() ? "Very very very very very long text."
1247 : "Shorter text.");
1248 }
1249
1250 void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
1251 {
1252 m_gauge->SetValue( m_slider->GetValue() );
1253 m_gaugeVert->SetValue( m_slider->GetValue() / 2 );
1254 }
1255
1256 #if wxUSE_SPINCTRL
1257
1258 void MyPanel::OnSpinCtrlText(wxCommandEvent& event)
1259 {
1260 if ( m_spinctrl )
1261 {
1262 wxString s;
1263 s.Printf( _T("Spin ctrl text changed: now %d (from event: %s)\n"),
1264 m_spinctrl->GetValue(), event.GetString().c_str() );
1265 m_text->AppendText(s);
1266 }
1267 }
1268
1269 void MyPanel::OnSpinCtrl(wxSpinEvent& event)
1270 {
1271 if ( m_spinctrl )
1272 {
1273 wxString s;
1274 s.Printf( _T("Spin ctrl changed: now %d (from event: %ld)\n"),
1275 m_spinctrl->GetValue(), event.GetInt() );
1276 m_text->AppendText(s);
1277 }
1278 }
1279
1280 void MyPanel::OnSpinCtrlUp(wxSpinEvent& event)
1281 {
1282 if ( m_spinctrl )
1283 {
1284 m_text->AppendText( wxString::Format(
1285 _T("Spin up: %d (from event: %ld)\n"),
1286 m_spinctrl->GetValue(), event.GetInt() ) );
1287 }
1288 }
1289
1290 void MyPanel::OnSpinCtrlDown(wxSpinEvent& event)
1291 {
1292 if ( m_spinctrl )
1293 {
1294 m_text->AppendText( wxString::Format(
1295 _T("Spin down: %d (from event: %ld)\n"),
1296 m_spinctrl->GetValue(), event.GetInt() ) );
1297 }
1298 }
1299
1300 #endif // wxUSE_SPINCTRL
1301
1302 #if wxUSE_SPINBTN
1303 void MyPanel::OnSpinUp( wxSpinEvent &event )
1304 {
1305 wxString value;
1306 value.Printf( _T("Spin control up: current = %d\n"),
1307 m_spinbutton->GetValue());
1308
1309 if ( event.GetPosition() > 17 )
1310 {
1311 value += _T("Preventing the spin button from going above 17.\n");
1312
1313 event.Veto();
1314 }
1315
1316 m_text->AppendText(value);
1317 }
1318
1319 void MyPanel::OnSpinDown( wxSpinEvent &event )
1320 {
1321 wxString value;
1322 value.Printf( _T("Spin control down: current = %d\n"),
1323 m_spinbutton->GetValue());
1324
1325 if ( event.GetPosition() < -17 )
1326 {
1327 value += _T("Preventing the spin button from going below -17.\n");
1328
1329 event.Veto();
1330 }
1331
1332 m_text->AppendText(value);
1333 }
1334
1335 void MyPanel::OnSpinUpdate( wxSpinEvent &event )
1336 {
1337 wxString value;
1338 value.Printf( _T("%d"), event.GetPosition() );
1339 m_spintext->SetValue( value );
1340
1341 value.Printf( _T("Spin control range: (%d, %d), current = %d\n"),
1342 m_spinbutton->GetMin(), m_spinbutton->GetMax(),
1343 m_spinbutton->GetValue());
1344
1345 m_text->AppendText(value);
1346 }
1347
1348 void MyPanel::OnUpdateShowProgress( wxUpdateUIEvent& event )
1349 {
1350 event.Enable( m_spinbutton->GetValue() > 0 );
1351 }
1352
1353 void MyPanel::OnShowProgress( wxCommandEvent& WXUNUSED(event) )
1354 {
1355 int max = m_spinbutton->GetValue();
1356
1357 if ( max <= 0 )
1358 {
1359 wxLogError(_T("You must set positive range!"));
1360 return;
1361 }
1362
1363 wxProgressDialog dialog("Progress dialog example",
1364 "An informative message",
1365 max, // range
1366 this, // parent
1367 wxPD_CAN_ABORT |
1368 wxPD_AUTO_HIDE |
1369 wxPD_APP_MODAL |
1370 wxPD_ELAPSED_TIME |
1371 wxPD_ESTIMATED_TIME |
1372 wxPD_REMAINING_TIME);
1373
1374
1375 bool cont = TRUE;
1376 for ( int i = 0; i <= max && cont; i++ )
1377 {
1378 wxSleep(1);
1379 if ( i == max )
1380 {
1381 cont = dialog.Update(i, "That's all, folks!");
1382 }
1383 else if ( i == max / 2 )
1384 {
1385 cont = dialog.Update(i, "Only a half left (very long message)!");
1386 }
1387 else
1388 {
1389 cont = dialog.Update(i);
1390 }
1391 }
1392
1393 if ( !cont )
1394 {
1395 *m_text << "Progress dialog aborted!\n";
1396 }
1397 else
1398 {
1399 *m_text << "Countdown from " << max << " finished.\n";
1400 }
1401 }
1402
1403 #endif // wxUSE_SPINBTN
1404
1405 MyPanel::~MyPanel()
1406 {
1407 //wxLog::RemoveTraceMask(_T("focus"));
1408 delete wxLog::SetActiveTarget(m_logTargetOld);
1409
1410 delete m_notebook->GetImageList();
1411 }
1412
1413 //----------------------------------------------------------------------
1414 // MyFrame
1415 //----------------------------------------------------------------------
1416
1417 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1418 EVT_MENU(CONTROLS_QUIT, MyFrame::OnQuit)
1419 EVT_MENU(CONTROLS_ABOUT, MyFrame::OnAbout)
1420 EVT_MENU(CONTROLS_CLEAR_LOG, MyFrame::OnClearLog)
1421 #if wxUSE_TOOLTIPS
1422 EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1423 EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
1424 #endif // wxUSE_TOOLTIPS
1425
1426 EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
1427
1428 EVT_SIZE(MyFrame::OnSize)
1429 EVT_MOVE(MyFrame::OnMove)
1430
1431 EVT_IDLE(MyFrame::OnIdle)
1432 END_EVENT_TABLE()
1433
1434 MyFrame::MyFrame(const char *title, int x, int y)
1435 : wxFrame(NULL, -1, title, wxPoint(x, y), wxSize(500, 430))
1436 {
1437 // Give it an icon
1438 // The wxICON() macros loads an icon from a resource under Windows
1439 // and uses an #included XPM image under GTK+ and Motif
1440
1441 SetIcon( wxICON(mondrian) );
1442
1443 wxMenu *file_menu = new wxMenu;
1444
1445 file_menu->Append(CONTROLS_CLEAR_LOG, "&Clear log\tCtrl-L");
1446 file_menu->AppendSeparator();
1447 file_menu->Append(CONTROLS_ABOUT, "&About\tF1");
1448 file_menu->AppendSeparator();
1449 file_menu->Append(CONTROLS_QUIT, "E&xit\tAlt-X", "Quit controls sample");
1450
1451 wxMenuBar *menu_bar = new wxMenuBar;
1452 menu_bar->Append(file_menu, "&File");
1453
1454 #if wxUSE_TOOLTIPS
1455 wxMenu *tooltip_menu = new wxMenu;
1456 tooltip_menu->Append(CONTROLS_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D");
1457 tooltip_menu->AppendSeparator();
1458 tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, "&Toggle tooltips\tCtrl-T",
1459 "enable/disable tooltips", TRUE);
1460 tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, TRUE);
1461 menu_bar->Append(tooltip_menu, "&Tooltips");
1462 #endif // wxUSE_TOOLTIPS
1463
1464 wxMenu *panel_menu = new wxMenu;
1465 panel_menu->Append(CONTROLS_ENABLE_ALL, "&Disable all\tCtrl-E",
1466 "Enable/disable all panel controls", TRUE);
1467 menu_bar->Append(panel_menu, "&Panel");
1468
1469 SetMenuBar(menu_bar);
1470
1471 CreateStatusBar(2);
1472
1473 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1474
1475 SetSizeHints( 500, 425 );
1476 }
1477
1478 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1479 {
1480 Close(TRUE);
1481 }
1482
1483 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1484 {
1485 wxBusyCursor bc;
1486
1487 wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
1488 dialog.ShowModal();
1489 }
1490
1491 void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
1492 {
1493 m_panel->m_text->Clear();
1494 }
1495
1496 #if wxUSE_TOOLTIPS
1497 void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1498 {
1499 static long s_delay = 5000;
1500
1501 wxString delay;
1502 delay.Printf( _T("%ld"), s_delay);
1503
1504 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
1505 "Set tooltip delay",
1506 delay,
1507 this);
1508 if ( !delay )
1509 return; // cancelled
1510
1511 wxSscanf(delay, _T("%ld"), &s_delay);
1512
1513 wxToolTip::SetDelay(s_delay);
1514
1515 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
1516 }
1517
1518 void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1519 {
1520 static bool s_enabled = TRUE;
1521
1522 s_enabled = !s_enabled;
1523
1524 wxToolTip::Enable(s_enabled);
1525
1526 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
1527 }
1528 #endif // tooltips
1529
1530 void MyFrame::OnEnableAll(wxCommandEvent& WXUNUSED(event))
1531 {
1532 static bool s_enable = TRUE;
1533
1534 s_enable = !s_enable;
1535 m_panel->Enable(s_enable);
1536 }
1537
1538 void MyFrame::OnMove( wxMoveEvent& event )
1539 {
1540 UpdateStatusBar(event.GetPosition(), GetSize());
1541
1542 event.Skip();
1543 }
1544
1545 void MyFrame::OnSize( wxSizeEvent& event )
1546 {
1547 UpdateStatusBar(GetPosition(), event.GetSize());
1548
1549 event.Skip();
1550 }
1551
1552 void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
1553 {
1554 // track the window which has the focus in the status bar
1555 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1556 wxWindow *focus = wxWindow::FindFocus();
1557 if ( focus && (focus != s_windowFocus) )
1558 {
1559 s_windowFocus = focus;
1560
1561 wxString msg;
1562 msg.Printf(
1563 #ifdef __WXMSW__
1564 _T("Focus: %s, HWND = %08x"),
1565 #else
1566 _T("Focus: %s"),
1567 #endif
1568 s_windowFocus->GetClassInfo()->GetClassName()
1569 #ifdef __WXMSW__
1570 , (unsigned int) s_windowFocus->GetHWND()
1571 #endif
1572 );
1573
1574 SetStatusText(msg);
1575 }
1576 }
1577
1578 void MyComboBox::OnChar(wxKeyEvent& event)
1579 {
1580 wxLogMessage(_T("MyComboBox::OnChar"));
1581
1582 if ( event.KeyCode() == 'w' )
1583 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1584 else
1585 event.Skip();
1586 }
1587
1588 void MyComboBox::OnKeyDown(wxKeyEvent& event)
1589 {
1590 wxLogMessage(_T("MyComboBox::OnKeyDown"));
1591
1592 if ( event.KeyCode() == 'w' )
1593 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1594 else
1595 event.Skip();
1596 }
1597
1598 void MyComboBox::OnKeyUp(wxKeyEvent& event)
1599 {
1600 wxLogMessage(_T("MyComboBox::OnKeyUp"));
1601
1602 event.Skip();
1603 }
1604
1605 static void SetListboxClientData(const wxChar *name, wxListBox *control)
1606 {
1607 size_t count = control->GetCount();
1608 for ( size_t n = 0; n < count; n++ )
1609 {
1610 wxString s;
1611 s.Printf(wxT("%s client data for '%s'"),
1612 name, control->GetString(n).c_str());
1613
1614 control->SetClientObject(n, new wxStringClientData(s));
1615 }
1616 }
1617
1618 static void SetChoiceClientData(const wxChar *name, wxChoice *control)
1619 {
1620 size_t count = control->GetCount();
1621 for ( size_t n = 0; n < count; n++ )
1622 {
1623 wxString s;
1624 s.Printf(wxT("%s client data for '%s'"),
1625 name, control->GetString(n).c_str());
1626
1627 control->SetClientObject(n, new wxStringClientData(s));
1628 }
1629 }