wxUSE_CONSTRAINTS now refers to constraints only, since sizers
[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 m_text = new wxTextCtrl(this, -1, "This is the log window.\n",
487 wxPoint(0, 250), wxSize(100, 50), wxTE_MULTILINE);
488 m_text->SetBackgroundColour(wxT("wheat"));
489
490 if ( 0 )
491 wxLog::AddTraceMask(_T("focus"));
492 m_logTargetOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_text));
493
494 m_notebook = new wxNotebook(this, ID_NOTEBOOK);
495
496 wxString choices[] =
497 {
498 "This",
499 "is one of my",
500 "really",
501 "wonderful",
502 "examples."
503 };
504
505 #ifdef USE_XPM
506 // image ids
507 enum
508 {
509 Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
510 };
511
512 // fill the image list
513 wxImageList *imagelist = new wxImageList(32, 32);
514
515 imagelist-> Add( wxBitmap( list_xpm ));
516 imagelist-> Add( wxBitmap( choice_xpm ));
517 imagelist-> Add( wxBitmap( combo_xpm ));
518 imagelist-> Add( wxBitmap( text_xpm ));
519 imagelist-> Add( wxBitmap( radio_xpm ));
520 imagelist-> Add( wxBitmap( gauge_xpm ));
521 m_notebook->SetImageList(imagelist);
522 #elif defined(__WXMSW__)
523 // load images from resources
524 enum
525 {
526 Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
527 };
528 wxImageList *imagelist = new wxImageList(16, 16, FALSE, Image_Max);
529
530 static const char *s_iconNames[Image_Max] =
531 {
532 "list", "choice", "combo", "text", "radio", "gauge"
533 };
534
535 for ( size_t n = 0; n < Image_Max; n++ )
536 {
537 wxBitmap bmp(s_iconNames[n]);
538 if ( !bmp.Ok() || (imagelist->Add(bmp) == -1) )
539 {
540 wxLogWarning(wxT("Couldn't load the image '%s' for the notebook page %d."),
541 s_iconNames[n], n);
542 }
543 }
544
545 m_notebook->SetImageList(imagelist);
546 #else
547
548 // No images for now
549 #define Image_List -1
550 #define Image_Choice -1
551 #define Image_Combo -1
552 #define Image_Text -1
553 #define Image_Radio -1
554 #define Image_Gauge -1
555 #define Image_Max -1
556
557 #endif
558
559 wxPanel *panel = new wxPanel(m_notebook);
560 m_listbox = new wxListBox( panel, ID_LISTBOX,
561 wxPoint(10,10), wxSize(120,70),
562 5, choices, wxLB_ALWAYS_SB );
563 m_listboxSorted = new wxListBox( panel, ID_LISTBOX_SORTED,
564 wxPoint(10,90), wxSize(120,70),
565 5, choices, wxLB_SORT );
566
567 SetListboxClientData(wxT("listbox"), m_listbox);
568 SetListboxClientData(wxT("listbox"), m_listboxSorted);
569
570 m_listbox->SetCursor(*wxCROSS_CURSOR);
571 #if wxUSE_TOOLTIPS
572 m_listbox->SetToolTip( "This is a list box" );
573 #endif // wxUSE_TOOLTIPS
574
575 m_lbSelectNum = new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
576 m_lbSelectThis = new wxButton( panel, ID_LISTBOX_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
577 (void)new wxButton( panel, ID_LISTBOX_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
578 (void)new MyButton( panel, ID_LISTBOX_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
579 (void)new wxButton( panel, ID_LISTBOX_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
580 wxButton *button = new MyButton( panel, ID_LISTBOX_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
581
582 button->SetDefault();
583
584 button->SetForegroundColour(*wxBLUE);
585
586 #if wxUSE_TOOLTIPS
587 button->SetToolTip( "Press here to set italic font" );
588 #endif // wxUSE_TOOLTIPS
589
590 m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, "&Disable", wxPoint(20,170) );
591 m_checkbox->SetValue(FALSE);
592 #if wxUSE_TOOLTIPS
593 m_checkbox->SetToolTip( "Click here to disable the listbox" );
594 #endif // wxUSE_TOOLTIPS
595 (void)new wxCheckBox( panel, ID_CHANGE_COLOUR, "&Toggle colour",
596 wxPoint(110,170) );
597 panel->SetCursor(wxCursor(wxCURSOR_HAND));
598 m_notebook->AddPage(panel, "wxListBox", TRUE, Image_List);
599
600 #if wxUSE_CHOICE
601 panel = new wxPanel(m_notebook);
602 m_choice = new wxChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,-1), 5, choices );
603 m_choiceSorted = new wxChoice( panel, ID_CHOICE_SORTED, wxPoint(10,70), wxSize(120,-1),
604 5, choices, wxCB_SORT );
605
606 SetChoiceClientData(wxT("choice"), m_choice);
607 SetChoiceClientData(wxT("choice"), m_choiceSorted);
608
609 m_choice->SetSelection(2);
610 m_choice->SetBackgroundColour( wxT("red") );
611 (void)new wxButton( panel, ID_CHOICE_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
612 (void)new wxButton( panel, ID_CHOICE_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
613 (void)new wxButton( panel, ID_CHOICE_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
614 (void)new wxButton( panel, ID_CHOICE_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
615 (void)new wxButton( panel, ID_CHOICE_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
616 (void)new wxButton( panel, ID_CHOICE_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
617 (void)new wxCheckBox( panel, ID_CHOICE_ENABLE, "&Disable", wxPoint(20,130), wxSize(140,30) );
618
619 m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
620 #endif // wxUSE_CHOICE
621
622 panel = new wxPanel(m_notebook);
623 (void)new wxStaticBox( panel, -1, "&Box around combobox",
624 wxPoint(5, 5), wxSize(150, 100));
625 m_combo = new MyComboBox( panel, ID_COMBO, "This",
626 wxPoint(20,25), wxSize(120, -1),
627 5, choices,
628 /* wxCB_READONLY | */ wxPROCESS_ENTER);
629
630 (void)new wxButton( panel, ID_COMBO_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
631 (void)new wxButton( panel, ID_COMBO_SEL_STR, "&Select 'This'", wxPoint(340,30), wxSize(140,30) );
632 (void)new wxButton( panel, ID_COMBO_CLEAR, "&Clear", wxPoint(180,80), wxSize(140,30) );
633 (void)new wxButton( panel, ID_COMBO_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
634 (void)new wxButton( panel, ID_COMBO_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
635 (void)new wxButton( panel, ID_COMBO_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
636 (void)new wxCheckBox( panel, ID_COMBO_ENABLE, "&Disable", wxPoint(20,130), wxSize(140,30) );
637 m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo);
638
639 wxString choices2[] =
640 {
641 "First", "Second",
642 /* "Third",
643 "Fourth", "Fifth", "Sixth",
644 "Seventh", "Eighth", "Nineth", "Tenth" */
645 };
646
647 panel = new wxPanel(m_notebook);
648 (void)new MyRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
649 m_radio = new wxRadioBox( panel, ID_RADIOBOX, "T&his", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
650
651 #if wxUSE_TOOLTIPS
652 m_combo->SetToolTip("This is a natural\ncombobox - can you believe me?");
653 m_radio->SetToolTip("Ever seen a radiobox?");
654 #endif // wxUSE_TOOLTIPS
655
656 (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #&2", wxPoint(180,30), wxSize(140,30) );
657 (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "&Select 'This'", wxPoint(180,80), wxSize(140,30) );
658 m_fontButton = new wxButton( panel, ID_SET_FONT, "Set &more Italic font", wxPoint(340,30), wxSize(140,30) );
659 (void)new wxButton( panel, ID_RADIOBOX_FONT, "Set &Italic font", wxPoint(340,80), wxSize(140,30) );
660 (void)new wxCheckBox( panel, ID_RADIOBOX_ENABLE, "&Disable", wxPoint(340,130), wxDefaultSize );
661 wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxDefaultSize, wxRB_GROUP );
662 rb->SetValue( FALSE );
663 (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "&Radiobutton2", wxPoint(340,170), wxDefaultSize );
664 m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
665
666 panel = new wxPanel(m_notebook);
667 (void)new wxStaticBox( panel, -1, "&wxGauge and wxSlider", wxPoint(10,10), wxSize(222,130) );
668 m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155, 30), wxGA_HORIZONTAL|wxNO_BORDER );
669 m_gauge->SetBackgroundColour(*wxGREEN);
670 m_gauge->SetForegroundColour(*wxRED);
671 m_gaugeVert = new wxGauge( panel, -1, 100,
672 wxPoint(195,35), wxSize(30, 90),
673 wxGA_VERTICAL | wxGA_SMOOTH | wxNO_BORDER );
674 m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1),
675 wxSL_AUTOTICKS | wxSL_LABELS );
676 m_slider->SetTickFreq(40, 0);
677 (void)new wxStaticBox( panel, -1, "&Explanation",
678 wxPoint(230,10), wxSize(270,130),
679 wxALIGN_CENTER );
680
681 #ifdef __WXMOTIF__
682 // No wrapping text in wxStaticText yet :-(
683 (void)new wxStaticText( panel, -1,
684 "Drag the slider!",
685 wxPoint(250,30),
686 wxSize(240, -1)
687 );
688 #else
689 (void)new wxStaticText( panel, -1,
690 "In order see the gauge (aka progress bar)\n"
691 "control do something you have to drag the\n"
692 "handle of the slider to the right.\n"
693 "\n"
694 "This is also supposed to demonstrate how\n"
695 "to use static controls.\n",
696 wxPoint(250,25),
697 wxSize(240, 110)
698 );
699 #endif
700 int initialSpinValue = -5;
701 wxString s;
702 s << initialSpinValue;
703 m_spintext = new wxTextCtrl( panel, -1, s, wxPoint(20,160), wxSize(80,-1) );
704 #if wxUSE_SPINBTN
705 m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160), wxSize(80, -1) );
706 m_spinbutton->SetRange(-10,30);
707 m_spinbutton->SetValue(initialSpinValue);
708
709 m_btnProgress = new wxButton( panel, ID_BTNPROGRESS, "&Show progress dialog",
710 wxPoint(300, 160) );
711 #endif // wxUSE_SPINBTN
712
713 #if wxUSE_SPINCTRL
714 m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, "", wxPoint(200, 160), wxSize(80, -1) );
715 m_spinctrl->SetRange(10,30);
716 m_spinctrl->SetValue(15);
717 #endif // wxUSE_SPINCTRL
718
719 m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
720
721 panel = new wxPanel(m_notebook);
722
723 #if !defined(__WXMOTIF__) && !defined(__WIN16__) // wxStaticBitmap not working under Motif yet; and icons not allowed under WIN16.
724 wxIcon icon = wxTheApp->GetStdIcon(wxICON_INFORMATION);
725 wxStaticBitmap *bmpStatic = new wxStaticBitmap(panel, -1, icon,
726 wxPoint(10, 10));
727
728 bmpStatic = new wxStaticBitmap(panel, -1, wxNullIcon, wxPoint(50, 10));
729 bmpStatic->SetIcon(wxTheApp->GetStdIcon(wxICON_QUESTION));
730 #endif // !Motif
731
732 wxBitmap bitmap( 100, 100 );
733 wxMemoryDC dc;
734 dc.SelectObject( bitmap );
735 dc.SetPen(*wxGREEN_PEN);
736 dc.Clear();
737 dc.DrawEllipse(5, 5, 90, 90);
738 dc.DrawText("Bitmap", 30, 40);
739 dc.SelectObject( wxNullBitmap );
740
741 (void)new wxBitmapButton(panel, ID_BITMAP_BTN, bitmap, wxPoint(100, 20));
742
743 #ifdef __WXMSW__
744 // test for masked bitmap display
745 bitmap = wxBitmap("test2.bmp", wxBITMAP_TYPE_BMP);
746 if (bitmap.Ok())
747 {
748 bitmap.SetMask(new wxMask(bitmap, *wxBLUE));
749
750 (void)new wxStaticBitmap /* wxBitmapButton */ (panel, -1, bitmap, wxPoint(300, 120));
751 }
752 #endif
753
754 wxBitmap bmp1(wxTheApp->GetStdIcon(wxICON_INFORMATION)),
755 bmp2(wxTheApp->GetStdIcon(wxICON_WARNING)),
756 bmp3(wxTheApp->GetStdIcon(wxICON_QUESTION));
757 wxBitmapButton *bmpBtn = new wxBitmapButton
758 (
759 panel, -1,
760 bmp1,
761 wxPoint(30, 70)
762 );
763
764 bmpBtn->SetBitmapSelected(bmp2);
765 bmpBtn->SetBitmapFocus(bmp3);
766
767 #if wxUSE_TOGGLEBTN
768 (void)new wxToggleButton(panel, ID_BUTTON_LABEL,
769 "&Toggle label", wxPoint(250, 20));
770 #endif // wxUSE_TOGGLEBTN
771
772 m_label = new wxStaticText(panel, -1, "Label with some long text",
773 wxPoint(250, 60), wxDefaultSize,
774 wxALIGN_RIGHT /*| wxST_NO_AUTORESIZE*/);
775 m_label->SetForegroundColour( *wxBLUE );
776
777 m_notebook->AddPage(panel, "wxBitmapXXX");
778
779 // layout constraints
780 #if wxUSE_CONSTRAINTS
781 wxLayoutConstraints *c;
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 #endif
806
807 // sizer
808
809 panel = new wxPanel(m_notebook);
810 panel->SetAutoLayout( TRUE );
811
812 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
813
814 sizer->Add( new wxButton(panel, -1, "Test Button &1" ), 3, wxALL, 10 );
815 sizer->Add( 20,20, 1 );
816 sizer->Add( new wxButton(panel, -1, "Test Button &2" ), 3, wxGROW|wxALL, 10 );
817
818 panel->SetSizer( sizer );
819
820 m_notebook->AddPage(panel, "wxSizer");
821 }
822
823 void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
824 {
825 int x = 0;
826 int y = 0;
827 GetClientSize( &x, &y );
828
829 if (m_notebook) m_notebook->SetSize( 2, 2, x-4, y*2/3-4 );
830 if (m_text) m_text->SetSize( 2, y*2/3+2, x-4, y/3-4 );
831 }
832
833 void MyPanel::OnPageChanging( wxNotebookEvent &event )
834 {
835 int selOld = event.GetOldSelection();
836 if ( selOld == 2 )
837 {
838 if ( wxMessageBox("This demonstrates how a program may prevent the\n"
839 "page change from taking place - if you select\n"
840 "[No] the current page will stay the third one\n",
841 "Control sample",
842 wxICON_QUESTION | wxYES_NO, this) != wxYES )
843 {
844 event.Veto();
845
846 return;
847 }
848 }
849
850 *m_text << "Notebook selection is being changed from " << selOld
851 << " to " << event.GetSelection()
852 << " (current page from notebook is "
853 << m_notebook->GetSelection() << ")\n";
854 }
855
856 void MyPanel::OnPageChanged( wxNotebookEvent &event )
857 {
858 *m_text << "Notebook selection is now " << event.GetSelection()
859 << " (from notebook: " << m_notebook->GetSelection() << ")\n";
860 }
861
862 void MyPanel::OnTestButton(wxCommandEvent& event)
863 {
864 wxLogMessage(_T("Button %c clicked."),
865 event.GetId() == ID_BUTTON_TEST1 ? _T('1') : _T('2'));
866 }
867
868 void MyPanel::OnBmpButton(wxCommandEvent& event)
869 {
870 wxLogMessage(_T("Bitmap button clicked."));
871 }
872
873 void MyPanel::OnChangeColour(wxCommandEvent& WXUNUSED(event))
874 {
875 static wxColour s_colOld;
876
877 // test panel colour changing and propagation to the subcontrols
878 if ( s_colOld.Ok() )
879 {
880 SetBackgroundColour(s_colOld);
881 s_colOld = wxNullColour;
882
883 m_lbSelectThis->SetForegroundColour(wxT("red"));
884 m_lbSelectThis->SetBackgroundColour(wxT("white"));
885 }
886 else
887 {
888 s_colOld = wxColour(wxT("red"));
889 SetBackgroundColour(wxT("white"));
890
891 m_lbSelectThis->SetForegroundColour(wxT("white"));
892 m_lbSelectThis->SetBackgroundColour(wxT("red"));
893 }
894
895 m_lbSelectThis->Refresh();
896 Refresh();
897 }
898
899 void MyPanel::OnListBox( wxCommandEvent &event )
900 {
901 // GetParent()->Move(100, 100);
902
903 if (event.GetInt() == -1)
904 {
905 m_text->AppendText( "ListBox has no selections anymore\n" );
906 return;
907 }
908
909 wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
910 : m_listboxSorted;
911
912 m_text->AppendText( "ListBox event selection string is: '" );
913 m_text->AppendText( event.GetString() );
914 m_text->AppendText( "'\n" );
915 m_text->AppendText( "ListBox control selection string is: '" );
916 m_text->AppendText( listbox->GetStringSelection() );
917 m_text->AppendText( "'\n" );
918
919 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
920 m_text->AppendText( "ListBox event client data string is: '" );
921 if (obj) // BC++ doesn't like use of '? .. : .. ' in this context
922 m_text->AppendText( obj->GetData() );
923 else
924 m_text->AppendText( wxString("none") );
925
926 m_text->AppendText( "'\n" );
927 m_text->AppendText( "ListBox control client data string is: '" );
928 obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection());
929 if (obj)
930 m_text->AppendText( obj->GetData() );
931 else
932 m_text->AppendText( wxString("none") );
933 m_text->AppendText( "'\n" );
934 }
935
936 void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
937 {
938 m_text->AppendText( "ListBox double click string is: " );
939 m_text->AppendText( event.GetString() );
940 m_text->AppendText( "\n" );
941 }
942
943 void MyPanel::OnListBoxButtons( wxCommandEvent &event )
944 {
945 switch (event.GetId())
946 {
947 case ID_LISTBOX_ENABLE:
948 {
949 m_text->AppendText("Checkbox clicked.\n");
950 #if wxUSE_TOOLTIPS
951 wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
952 if (event.GetInt())
953 cb->SetToolTip( "Click to enable listbox" );
954 else
955 cb->SetToolTip( "Click to disable listbox" );
956 #endif // wxUSE_TOOLTIPS
957 m_listbox->Enable( event.GetInt() == 0 );
958 m_lbSelectThis->Enable( event.GetInt() == 0 );
959 m_lbSelectNum->Enable( event.GetInt() == 0 );
960 m_listboxSorted->Enable( event.GetInt() == 0 );
961 FindWindow(ID_CHANGE_COLOUR)->Enable( event.GetInt() == 0 );
962 break;
963 }
964 case ID_LISTBOX_SEL_NUM:
965 {
966 m_listbox->SetSelection( 2 );
967 m_listboxSorted->SetSelection( 2 );
968 m_lbSelectThis->WarpPointer( 40, 14 );
969 break;
970 }
971 case ID_LISTBOX_SEL_STR:
972 {
973 m_listbox->SetStringSelection( "This" );
974 m_listboxSorted->SetStringSelection( "This" );
975 m_lbSelectNum->WarpPointer( 40, 14 );
976 break;
977 }
978 case ID_LISTBOX_CLEAR:
979 {
980 m_listbox->Clear();
981 m_listboxSorted->Clear();
982 break;
983 }
984 case ID_LISTBOX_APPEND:
985 {
986 m_listbox->Append( "Hi!" );
987 m_listboxSorted->Append( "Hi!" );
988 break;
989 }
990 case ID_LISTBOX_DELETE:
991 {
992 int idx;
993 idx = m_listbox->GetSelection();
994 if ( idx != wxNOT_FOUND )
995 m_listbox->Delete( idx );
996 idx = m_listboxSorted->GetSelection();
997 if ( idx != wxNOT_FOUND )
998 m_listboxSorted->Delete( idx );
999 break;
1000 }
1001 case ID_LISTBOX_FONT:
1002 {
1003 m_listbox->SetFont( *wxITALIC_FONT );
1004 m_listboxSorted->SetFont( *wxITALIC_FONT );
1005 m_checkbox->SetFont( *wxITALIC_FONT );
1006 break;
1007 }
1008 }
1009 }
1010
1011 #if wxUSE_CHOICE
1012 void MyPanel::OnChoice( wxCommandEvent &event )
1013 {
1014 wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice
1015 : m_choiceSorted;
1016
1017 m_text->AppendText( "Choice event selection string is: '" );
1018 m_text->AppendText( event.GetString() );
1019 m_text->AppendText( "'\n" );
1020 m_text->AppendText( "Choice control selection string is: '" );
1021 m_text->AppendText( choice->GetStringSelection() );
1022 m_text->AppendText( "'\n" );
1023
1024 wxStringClientData *obj = ((wxStringClientData *)event.GetClientObject());
1025 m_text->AppendText( "Choice event client data string is: '" );
1026
1027 if (obj)
1028 m_text->AppendText( obj->GetData() );
1029 else
1030 m_text->AppendText( wxString("none") );
1031
1032 m_text->AppendText( "'\n" );
1033 m_text->AppendText( "Choice control client data string is: '" );
1034 obj = (wxStringClientData *)choice->GetClientObject(choice->GetSelection());
1035
1036 if (obj)
1037 m_text->AppendText( obj->GetData() );
1038 else
1039 m_text->AppendText( wxString("none") );
1040 m_text->AppendText( "'\n" );
1041 }
1042
1043 void MyPanel::OnChoiceButtons( wxCommandEvent &event )
1044 {
1045 switch (event.GetId())
1046 {
1047 case ID_CHOICE_ENABLE:
1048 {
1049 m_choice->Enable( event.GetInt() == 0 );
1050 m_choiceSorted->Enable( event.GetInt() == 0 );
1051 break;
1052 }
1053 case ID_CHOICE_SEL_NUM:
1054 {
1055 m_choice->SetSelection( 2 );
1056 m_choiceSorted->SetSelection( 2 );
1057 break;
1058 }
1059 case ID_CHOICE_SEL_STR:
1060 {
1061 m_choice->SetStringSelection( "This" );
1062 m_choiceSorted->SetStringSelection( "This" );
1063 break;
1064 }
1065 case ID_CHOICE_CLEAR:
1066 {
1067 m_choice->Clear();
1068 m_choiceSorted->Clear();
1069 break;
1070 }
1071 case ID_CHOICE_APPEND:
1072 {
1073 m_choice->Append( "Hi!" );
1074 m_choiceSorted->Append( "Hi!" );
1075 break;
1076 }
1077 case ID_CHOICE_DELETE:
1078 {
1079 int idx = m_choice->GetSelection();
1080 if ( idx != wxNOT_FOUND )
1081 m_choice->Delete( idx );
1082 idx = m_choiceSorted->GetSelection();
1083 if ( idx != wxNOT_FOUND )
1084 m_choiceSorted->Delete( idx );
1085 break;
1086 }
1087 case ID_CHOICE_FONT:
1088 {
1089 m_choice->SetFont( *wxITALIC_FONT );
1090 m_choiceSorted->SetFont( *wxITALIC_FONT );
1091 break;
1092 }
1093 }
1094 }
1095 #endif // wxUSE_CHOICE
1096
1097 void MyPanel::OnCombo( wxCommandEvent &event )
1098 {
1099 m_text->AppendText( "ComboBox event selection string is: " );
1100 m_text->AppendText( event.GetString() );
1101 m_text->AppendText( "\n" );
1102 m_text->AppendText( "ComboBox control selection string is: " );
1103 m_text->AppendText( m_combo->GetStringSelection() );
1104 m_text->AppendText( "\n" );
1105 }
1106
1107 void MyPanel::OnComboTextChanged(wxCommandEvent& WXUNUSED(event))
1108 {
1109 wxLogMessage(_T("Text in the combobox changed: now is '%s'."),
1110 m_combo->GetValue().c_str());
1111 }
1112
1113 void MyPanel::OnComboTextEnter(wxCommandEvent& WXUNUSED(event))
1114 {
1115 wxLogMessage(_T("Enter pressed in the combobox: value is '%s'."),
1116 m_combo->GetValue().c_str());
1117 }
1118
1119 void MyPanel::OnComboButtons( wxCommandEvent &event )
1120 {
1121 switch (event.GetId())
1122 {
1123 case ID_COMBO_ENABLE:
1124 {
1125 m_combo->Enable( event.GetInt() == 0 );
1126 break;
1127 }
1128 case ID_COMBO_SEL_NUM:
1129 {
1130 m_combo->SetSelection( 2 );
1131 break;
1132 }
1133 case ID_COMBO_SEL_STR:
1134 {
1135 m_combo->SetStringSelection( "This" );
1136 break;
1137 }
1138 case ID_COMBO_CLEAR:
1139 {
1140 m_combo->Clear();
1141 break;
1142 }
1143 case ID_COMBO_APPEND:
1144 {
1145 m_combo->Append( "Hi!" );
1146 break;
1147 }
1148 case ID_COMBO_DELETE:
1149 {
1150 int idx = m_combo->GetSelection();
1151 m_combo->Delete( idx );
1152 break;
1153 }
1154 case ID_COMBO_FONT:
1155 {
1156 m_combo->SetFont( *wxITALIC_FONT );
1157 break;
1158 }
1159 }
1160 }
1161
1162 void MyPanel::OnRadio( wxCommandEvent &event )
1163 {
1164 m_text->AppendText( "RadioBox selection string is: " );
1165 m_text->AppendText( event.GetString() );
1166 m_text->AppendText( "\n" );
1167 }
1168
1169 void MyPanel::OnRadioButtons( wxCommandEvent &event )
1170 {
1171 switch (event.GetId())
1172 {
1173 case ID_RADIOBOX_ENABLE:
1174 {
1175 m_radio->Enable( event.GetInt() == 0 );
1176 break;
1177 }
1178 case ID_RADIOBOX_SEL_NUM:
1179 {
1180 m_radio->SetSelection( 2 );
1181 break;
1182 }
1183 case ID_RADIOBOX_SEL_STR:
1184 {
1185 m_radio->SetStringSelection( "This" );
1186 break;
1187 }
1188 case ID_RADIOBOX_FONT:
1189 {
1190 m_radio->SetFont( *wxITALIC_FONT );
1191 break;
1192 }
1193 }
1194 }
1195
1196 void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) )
1197 {
1198 m_fontButton->SetFont( *wxITALIC_FONT );
1199 m_text->SetFont( *wxITALIC_FONT );
1200 }
1201
1202 void MyPanel::OnUpdateLabel( wxCommandEvent &event )
1203 {
1204 m_label->SetLabel(event.GetInt() ? "Very very very very very long text."
1205 : "Shorter text.");
1206 }
1207
1208 void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
1209 {
1210 m_gauge->SetValue( m_slider->GetValue() );
1211 m_gaugeVert->SetValue( m_slider->GetValue() / 2 );
1212 }
1213
1214 #if wxUSE_SPINCTRL
1215
1216 void MyPanel::OnSpinCtrl(wxSpinEvent& event)
1217 {
1218 wxString s;
1219 s.Printf(_T("Spin ctrl changed: now %d (from event: %d)\n"),
1220 m_spinctrl->GetValue(), event.GetInt());
1221 m_text->AppendText(s);
1222 }
1223
1224 #endif // wxUSE_SPINCTRL
1225
1226 #if wxUSE_SPINBTN
1227 void MyPanel::OnSpinUp( wxSpinEvent &event )
1228 {
1229 wxString value;
1230 value.Printf( _T("Spin control up: current = %d\n"),
1231 m_spinbutton->GetValue());
1232
1233 if ( m_spinbutton->GetValue() > 17 )
1234 {
1235 value += _T("Preventing the spin button from going above 17.\n");
1236
1237 event.Veto();
1238 }
1239
1240 m_text->AppendText(value);
1241 }
1242
1243 void MyPanel::OnSpinDown( wxSpinEvent &event )
1244 {
1245 wxString value;
1246 value.Printf( _T("Spin control down: current = %d\n"),
1247 m_spinbutton->GetValue());
1248
1249 if ( m_spinbutton->GetValue() < -17 )
1250 {
1251 value += _T("Preventing the spin button from going below -17.\n");
1252
1253 event.Veto();
1254 }
1255
1256 m_text->AppendText(value);
1257 }
1258
1259 void MyPanel::OnSpinUpdate( wxSpinEvent &event )
1260 {
1261 wxString value;
1262 value.Printf( _T("%d"), event.GetPosition() );
1263 m_spintext->SetValue( value );
1264
1265 value.Printf( _T("Spin control range: (%d, %d), current = %d\n"),
1266 m_spinbutton->GetMin(), m_spinbutton->GetMax(),
1267 m_spinbutton->GetValue());
1268
1269 m_text->AppendText(value);
1270 }
1271
1272 void MyPanel::OnUpdateShowProgress( wxUpdateUIEvent& event )
1273 {
1274 event.Enable( m_spinbutton->GetValue() > 0 );
1275 }
1276
1277 void MyPanel::OnShowProgress( wxCommandEvent& WXUNUSED(event) )
1278 {
1279 int max = m_spinbutton->GetValue();
1280
1281 if ( max <= 0 )
1282 {
1283 wxLogError(_T("You must set positive range!"));
1284 return;
1285 }
1286
1287 wxProgressDialog dialog("Progress dialog example",
1288 "An informative message",
1289 max, // range
1290 this, // parent
1291 wxPD_CAN_ABORT |
1292 wxPD_AUTO_HIDE |
1293 wxPD_APP_MODAL |
1294 wxPD_ELAPSED_TIME |
1295 wxPD_ESTIMATED_TIME |
1296 wxPD_REMAINING_TIME);
1297
1298
1299 bool cont = TRUE;
1300 for ( int i = 0; i <= max && cont; i++ )
1301 {
1302 wxSleep(1);
1303 if ( i == max )
1304 {
1305 cont = dialog.Update(i, "That's all, folks!");
1306 }
1307 else if ( i == max / 2 )
1308 {
1309 cont = dialog.Update(i, "Only a half left (very long message)!");
1310 }
1311 else
1312 {
1313 cont = dialog.Update(i);
1314 }
1315 }
1316
1317 if ( !cont )
1318 {
1319 *m_text << "Progress dialog aborted!\n";
1320 }
1321 else
1322 {
1323 *m_text << "Countdown from " << max << " finished.\n";
1324 }
1325 }
1326
1327 #endif // wxUSE_SPINBTN
1328
1329 MyPanel::~MyPanel()
1330 {
1331 //wxLog::RemoveTraceMask(_T("focus"));
1332 delete wxLog::SetActiveTarget(m_logTargetOld);
1333
1334 delete m_notebook->GetImageList();
1335 }
1336
1337 //----------------------------------------------------------------------
1338 // MyFrame
1339 //----------------------------------------------------------------------
1340
1341 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1342 EVT_MENU(CONTROLS_QUIT, MyFrame::OnQuit)
1343 EVT_MENU(CONTROLS_ABOUT, MyFrame::OnAbout)
1344 EVT_MENU(CONTROLS_CLEAR_LOG, MyFrame::OnClearLog)
1345 #if wxUSE_TOOLTIPS
1346 EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1347 EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
1348 #endif // wxUSE_TOOLTIPS
1349
1350 EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
1351
1352 EVT_SIZE(MyFrame::OnSize)
1353 EVT_MOVE(MyFrame::OnMove)
1354
1355 EVT_IDLE(MyFrame::OnIdle)
1356 END_EVENT_TABLE()
1357
1358 MyFrame::MyFrame(const char *title, int x, int y)
1359 : wxFrame(NULL, -1, title, wxPoint(x, y), wxSize(500, 430))
1360 {
1361 // Give it an icon
1362 // The wxICON() macros loads an icon from a resource under Windows
1363 // and uses an #included XPM image under GTK+ and Motif
1364
1365 SetIcon( wxICON(mondrian) );
1366
1367 wxMenu *file_menu = new wxMenu;
1368
1369 file_menu->Append(CONTROLS_CLEAR_LOG, "&Clear log\tCtrl-L");
1370 file_menu->AppendSeparator();
1371 file_menu->Append(CONTROLS_ABOUT, "&About\tF1");
1372 file_menu->AppendSeparator();
1373 file_menu->Append(CONTROLS_QUIT, "E&xit\tAlt-X", "Quit controls sample");
1374
1375 wxMenuBar *menu_bar = new wxMenuBar;
1376 menu_bar->Append(file_menu, "&File");
1377
1378 #if wxUSE_TOOLTIPS
1379 wxMenu *tooltip_menu = new wxMenu;
1380 tooltip_menu->Append(CONTROLS_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D");
1381 tooltip_menu->AppendSeparator();
1382 tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, "&Toggle tooltips\tCtrl-T",
1383 "enable/disable tooltips", TRUE);
1384 tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, TRUE);
1385 menu_bar->Append(tooltip_menu, "&Tooltips");
1386 #endif // wxUSE_TOOLTIPS
1387
1388 wxMenu *panel_menu = new wxMenu;
1389 panel_menu->Append(CONTROLS_ENABLE_ALL, "&Disable all\tCtrl-E",
1390 "Enable/disable all panel controls", TRUE);
1391 menu_bar->Append(panel_menu, "&Panel");
1392
1393 SetMenuBar(menu_bar);
1394
1395 CreateStatusBar(2);
1396
1397 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1398
1399 SetSizeHints( 500, 425 );
1400 }
1401
1402 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1403 {
1404 Close(TRUE);
1405 }
1406
1407 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1408 {
1409 wxBusyCursor bc;
1410
1411 wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
1412 dialog.ShowModal();
1413 }
1414
1415 void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
1416 {
1417 m_panel->m_text->Clear();
1418 }
1419
1420 #if wxUSE_TOOLTIPS
1421 void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1422 {
1423 static long s_delay = 5000;
1424
1425 wxString delay;
1426 delay.Printf( _T("%ld"), s_delay);
1427
1428 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
1429 "Set tooltip delay",
1430 delay,
1431 this);
1432 if ( !delay )
1433 return; // cancelled
1434
1435 wxSscanf(delay, _T("%ld"), &s_delay);
1436
1437 wxToolTip::SetDelay(s_delay);
1438
1439 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
1440 }
1441
1442 void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1443 {
1444 static bool s_enabled = TRUE;
1445
1446 s_enabled = !s_enabled;
1447
1448 wxToolTip::Enable(s_enabled);
1449
1450 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
1451 }
1452 #endif // tooltips
1453
1454 void MyFrame::OnEnableAll(wxCommandEvent& WXUNUSED(event))
1455 {
1456 static bool s_enable = TRUE;
1457
1458 s_enable = !s_enable;
1459 m_panel->Enable(s_enable);
1460 }
1461
1462 void MyFrame::OnMove( wxMoveEvent& event )
1463 {
1464 UpdateStatusBar(event.GetPosition(), GetSize());
1465
1466 event.Skip();
1467 }
1468
1469 void MyFrame::OnSize( wxSizeEvent& event )
1470 {
1471 UpdateStatusBar(GetPosition(), event.GetSize());
1472
1473 event.Skip();
1474 }
1475
1476 void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
1477 {
1478 // track the window which has the focus in the status bar
1479 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1480 wxWindow *focus = wxWindow::FindFocus();
1481 if ( focus && (focus != s_windowFocus) )
1482 {
1483 s_windowFocus = focus;
1484
1485 wxString msg;
1486 msg.Printf(
1487 #ifdef __WXMSW__
1488 _T("Focus: %s, HWND = %08x"),
1489 #else
1490 _T("Focus: %s"),
1491 #endif
1492 s_windowFocus->GetClassInfo()->GetClassName()
1493 #ifdef __WXMSW__
1494 , s_windowFocus->GetHWND()
1495 #endif
1496 );
1497
1498 SetStatusText(msg);
1499 }
1500 }
1501
1502 void MyComboBox::OnChar(wxKeyEvent& event)
1503 {
1504 wxLogMessage(_T("MyComboBox::OnChar"));
1505
1506 if ( event.KeyCode() == 'w' )
1507 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1508 else
1509 event.Skip();
1510 }
1511
1512 void MyComboBox::OnKeyDown(wxKeyEvent& event)
1513 {
1514 wxLogMessage(_T("MyComboBox::OnKeyDown"));
1515
1516 if ( event.KeyCode() == 'w' )
1517 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1518 else
1519 event.Skip();
1520 }
1521
1522 void MyComboBox::OnKeyUp(wxKeyEvent& event)
1523 {
1524 wxLogMessage(_T("MyComboBox::OnKeyUp"));
1525
1526 event.Skip();
1527 }
1528
1529 static void SetListboxClientData(const wxChar *name, wxListBox *control)
1530 {
1531 size_t count = control->GetCount();
1532 for ( size_t n = 0; n < count; n++ )
1533 {
1534 wxString s;
1535 s.Printf(wxT("%s client data for '%s'"),
1536 name, control->GetString(n).c_str());
1537
1538 control->SetClientObject(n, new wxStringClientData(s));
1539 }
1540 }
1541
1542 static void SetChoiceClientData(const wxChar *name, wxChoice *control)
1543 {
1544 size_t count = control->GetCount();
1545 for ( size_t n = 0; n < count; n++ )
1546 {
1547 wxString s;
1548 s.Printf(wxT("%s client data for '%s'"),
1549 name, control->GetString(n).c_str());
1550
1551 control->SetClientObject(n, new wxStringClientData(s));
1552 }
1553 }