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