added support for wxALIGN_XXX in wxStaticBox
[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 wxProgressDialog dialog("Progress dialog example",
1280 "An informative message",
1281 max, // range
1282 this, // parent
1283 wxPD_CAN_ABORT |
1284 wxPD_AUTO_HIDE |
1285 wxPD_APP_MODAL |
1286 wxPD_ELAPSED_TIME |
1287 wxPD_ESTIMATED_TIME |
1288 wxPD_REMAINING_TIME);
1289
1290
1291 bool cont = TRUE;
1292 for ( int i = 0; i <= max && cont; i++ )
1293 {
1294 wxSleep(1);
1295 if ( i == max )
1296 {
1297 cont = dialog.Update(i, "That's all, folks!");
1298 }
1299 else if ( i == max / 2 )
1300 {
1301 cont = dialog.Update(i, "Only a half left (very long message)!");
1302 }
1303 else
1304 {
1305 cont = dialog.Update(i);
1306 }
1307 }
1308
1309 if ( !cont )
1310 {
1311 *m_text << "Progress dialog aborted!\n";
1312 }
1313 else
1314 {
1315 *m_text << "Countdown from " << max << " finished.\n";
1316 }
1317 }
1318
1319 #endif // wxUSE_SPINBTN
1320
1321 MyPanel::~MyPanel()
1322 {
1323 //wxLog::RemoveTraceMask(_T("focus"));
1324 delete wxLog::SetActiveTarget(m_logTargetOld);
1325
1326 delete m_notebook->GetImageList();
1327 }
1328
1329 //----------------------------------------------------------------------
1330 // MyFrame
1331 //----------------------------------------------------------------------
1332
1333 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1334 EVT_MENU(CONTROLS_QUIT, MyFrame::OnQuit)
1335 EVT_MENU(CONTROLS_ABOUT, MyFrame::OnAbout)
1336 EVT_MENU(CONTROLS_CLEAR_LOG, MyFrame::OnClearLog)
1337 #if wxUSE_TOOLTIPS
1338 EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1339 EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
1340 #endif // wxUSE_TOOLTIPS
1341
1342 EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
1343
1344 EVT_SIZE(MyFrame::OnSize)
1345 EVT_MOVE(MyFrame::OnMove)
1346
1347 EVT_IDLE(MyFrame::OnIdle)
1348 END_EVENT_TABLE()
1349
1350 MyFrame::MyFrame(const char *title, int x, int y)
1351 : wxFrame(NULL, -1, title, wxPoint(x, y), wxSize(500, 430))
1352 {
1353 // Give it an icon
1354 // The wxICON() macros loads an icon from a resource under Windows
1355 // and uses an #included XPM image under GTK+ and Motif
1356
1357 SetIcon( wxICON(mondrian) );
1358
1359 wxMenu *file_menu = new wxMenu;
1360
1361 file_menu->Append(CONTROLS_CLEAR_LOG, "&Clear log\tCtrl-L");
1362 file_menu->AppendSeparator();
1363 file_menu->Append(CONTROLS_ABOUT, "&About\tF1");
1364 file_menu->AppendSeparator();
1365 file_menu->Append(CONTROLS_QUIT, "E&xit\tAlt-X", "Quit controls sample");
1366
1367 wxMenuBar *menu_bar = new wxMenuBar;
1368 menu_bar->Append(file_menu, "&File");
1369
1370 #if wxUSE_TOOLTIPS
1371 wxMenu *tooltip_menu = new wxMenu;
1372 tooltip_menu->Append(CONTROLS_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D");
1373 tooltip_menu->AppendSeparator();
1374 tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, "&Toggle tooltips\tCtrl-T",
1375 "enable/disable tooltips", TRUE);
1376 tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, TRUE);
1377 menu_bar->Append(tooltip_menu, "&Tooltips");
1378 #endif // wxUSE_TOOLTIPS
1379
1380 wxMenu *panel_menu = new wxMenu;
1381 panel_menu->Append(CONTROLS_ENABLE_ALL, "&Disable all\tCtrl-E",
1382 "Enable/disable all panel controls", TRUE);
1383 menu_bar->Append(panel_menu, "&Panel");
1384
1385 SetMenuBar(menu_bar);
1386
1387 CreateStatusBar(2);
1388
1389 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1390
1391 SetSizeHints( 500, 425 );
1392 }
1393
1394 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1395 {
1396 Close(TRUE);
1397 }
1398
1399 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1400 {
1401 wxBusyCursor bc;
1402
1403 wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
1404 dialog.ShowModal();
1405 }
1406
1407 void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
1408 {
1409 m_panel->m_text->Clear();
1410 }
1411
1412 #if wxUSE_TOOLTIPS
1413 void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1414 {
1415 static long s_delay = 5000;
1416
1417 wxString delay;
1418 delay.Printf( _T("%ld"), s_delay);
1419
1420 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
1421 "Set tooltip delay",
1422 delay,
1423 this);
1424 if ( !delay )
1425 return; // cancelled
1426
1427 wxSscanf(delay, _T("%ld"), &s_delay);
1428
1429 wxToolTip::SetDelay(s_delay);
1430
1431 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
1432 }
1433
1434 void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1435 {
1436 static bool s_enabled = TRUE;
1437
1438 s_enabled = !s_enabled;
1439
1440 wxToolTip::Enable(s_enabled);
1441
1442 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
1443 }
1444 #endif // tooltips
1445
1446 void MyFrame::OnEnableAll(wxCommandEvent& WXUNUSED(event))
1447 {
1448 static bool s_enable = TRUE;
1449
1450 s_enable = !s_enable;
1451 m_panel->Enable(s_enable);
1452 }
1453
1454 void MyFrame::OnMove( wxMoveEvent& event )
1455 {
1456 UpdateStatusBar(event.GetPosition(), GetSize());
1457
1458 event.Skip();
1459 }
1460
1461 void MyFrame::OnSize( wxSizeEvent& event )
1462 {
1463 UpdateStatusBar(GetPosition(), event.GetSize());
1464
1465 event.Skip();
1466 }
1467
1468 void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
1469 {
1470 // track the window which has the focus in the status bar
1471 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1472 wxWindow *focus = wxWindow::FindFocus();
1473 if ( focus && (focus != s_windowFocus) )
1474 {
1475 s_windowFocus = focus;
1476
1477 wxString msg;
1478 msg.Printf(
1479 #ifdef __WXMSW__
1480 _T("Focus: %s, HWND = %08x"),
1481 #else
1482 _T("Focus: %s"),
1483 #endif
1484 s_windowFocus->GetClassInfo()->GetClassName()
1485 #ifdef __WXMSW__
1486 , s_windowFocus->GetHWND()
1487 #endif
1488 );
1489
1490 SetStatusText(msg);
1491 }
1492 }
1493
1494 void MyComboBox::OnChar(wxKeyEvent& event)
1495 {
1496 wxLogMessage(_T("MyComboBox::OnChar"));
1497
1498 if ( event.KeyCode() == 'w' )
1499 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1500 else
1501 event.Skip();
1502 }
1503
1504 void MyComboBox::OnKeyDown(wxKeyEvent& event)
1505 {
1506 wxLogMessage(_T("MyComboBox::OnKeyDown"));
1507
1508 if ( event.KeyCode() == 'w' )
1509 wxLogMessage(_T("MyComboBox: 'w' will be ignored."));
1510 else
1511 event.Skip();
1512 }
1513
1514 void MyComboBox::OnKeyUp(wxKeyEvent& event)
1515 {
1516 wxLogMessage(_T("MyComboBox::OnKeyUp"));
1517
1518 event.Skip();
1519 }
1520
1521 static void SetListboxClientData(const wxChar *name, wxListBox *control)
1522 {
1523 size_t count = control->GetCount();
1524 for ( size_t n = 0; n < count; n++ )
1525 {
1526 wxString s;
1527 s.Printf(wxT("%s client data for '%s'"),
1528 name, control->GetString(n).c_str());
1529
1530 control->SetClientObject(n, new wxStringClientData(s));
1531 }
1532 }
1533
1534 static void SetChoiceClientData(const wxChar *name, wxChoice *control)
1535 {
1536 size_t count = control->GetCount();
1537 for ( size_t n = 0; n < count; n++ )
1538 {
1539 wxString s;
1540 s.Printf(wxT("%s client data for '%s'"),
1541 name, control->GetString(n).c_str());
1542
1543 control->SetClientObject(n, new wxStringClientData(s));
1544 }
1545 }