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