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