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