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