]> git.saurik.com Git - wxWidgets.git/blame - samples/controls/controls.cpp
moved MGL initialization to earlier stage (crashes otherwise...) and implemented...
[wxWidgets.git] / samples / controls / controls.cpp
CommitLineData
1c005ff7 1/////////////////////////////////////////////////////////////////////////////
dfad0599 2// Name: controls.cpp
1c005ff7
RR
3// Purpose: Controls wxWindows sample
4// Author: Robert Roebling
5// Modified by:
6// RCS-ID: $Id$
c67d8618 7// Copyright: (c) Robert Roebling, Julian Smart
655822f3 8// Licence: wxWindows license
1c005ff7
RR
9/////////////////////////////////////////////////////////////////////////////
10
11#ifdef __GNUG__
9f3362c4 12 #pragma implementation "controls.h"
1c005ff7
RR
13#endif
14
15// For compilers that support precompilation, includes "wx/wx.h".
16#include "wx/wxprec.h"
17
18#ifdef __BORLANDC__
9f3362c4 19 #pragma hdrstop
1c005ff7
RR
20#endif
21
22#ifndef WX_PRECOMP
9f3362c4 23 #include "wx/wx.h"
1c005ff7
RR
24#endif
25
3372145d 26#if !defined( __WXMSW__ ) || defined( __WIN95__ )
4fabb575 27#include "wx/spinbutt.h"
3372145d 28#endif
1db8dc4a 29#include "wx/tglbtn.h"
53b28675 30#include "wx/notebook.h"
2cb21a45 31#include "wx/imaglist.h"
b8653fbf
VZ
32
33#if wxUSE_TOOLTIPS
34 #include "wx/tooltip.h"
35#endif
1c005ff7 36
83661a13 37#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__)
73c700fd 38 #define USE_XPM
4fabb575
JS
39#endif
40
41#ifdef USE_XPM
73c700fd
VZ
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"
47908e25
RR
49#endif
50
9726da4f
VZ
51#ifdef __WIN16__
52 // Win16 doesn't have them
ad556aa9 53 #ifdef wxUSE_SPINBTN
0e528b99 54 #undef wxUSE_SPINBTN
ad556aa9 55 #endif
0e528b99 56 #define wxUSE_SPINBTN 0
b782f2e0 57#else
ad556aa9
JS
58 #ifndef wxUSE_SPINBTN
59 #define wxUSE_SPINBTN 1
b782f2e0 60 #endif
9726da4f
VZ
61#endif // __WIN16__
62
63#include "wx/progdlg.h"
64
b782f2e0
VZ
65#if wxUSE_SPINCTRL
66 #include "wx/spinctrl.h"
67#endif // wxUSE_SPINCTRL
68
1c005ff7
RR
69//----------------------------------------------------------------------
70// class definitions
71//----------------------------------------------------------------------
72
73class MyApp: public wxApp
655822f3 74{
b8653fbf
VZ
75public:
76 bool OnInit();
1c005ff7
RR
77};
78
79class MyPanel: public wxPanel
80{
b8653fbf 81public:
1c005ff7 82 MyPanel(wxFrame *frame, int x, int y, int w, int h);
2cb21a45 83 virtual ~MyPanel();
16f6dfd8 84
1c005ff7
RR
85 void OnSize( wxSizeEvent& event );
86 void OnListBox( wxCommandEvent &event );
5b077d48 87 void OnListBoxDoubleClick( wxCommandEvent &event );
1c005ff7 88 void OnListBoxButtons( wxCommandEvent &event );
47908e25
RR
89 void OnChoice( wxCommandEvent &event );
90 void OnChoiceButtons( wxCommandEvent &event );
91 void OnCombo( wxCommandEvent &event );
f6bcfd97
BP
92 void OnComboTextChanged( wxCommandEvent &event );
93 void OnComboTextEnter( wxCommandEvent &event );
47908e25
RR
94 void OnComboButtons( wxCommandEvent &event );
95 void OnRadio( wxCommandEvent &event );
96 void OnRadioButtons( wxCommandEvent &event );
868a2826 97 void OnSetFont( wxCommandEvent &event );
cb43b372 98 void OnPageChanged( wxNotebookEvent &event );
4d0f3cd6 99 void OnPageChanging( wxNotebookEvent &event );
7bce6aec 100 void OnSliderUpdate( wxCommandEvent &event );
185fa6bf 101 void OnUpdateLabel( wxCommandEvent &event );
0e528b99 102#if wxUSE_SPINBTN
8c3c31d4
VZ
103 void OnSpinUp( wxSpinEvent &event );
104 void OnSpinDown( wxSpinEvent &event );
e380f72b 105 void OnSpinUpdate( wxSpinEvent &event );
9726da4f
VZ
106 void OnUpdateShowProgress( wxUpdateUIEvent& event );
107 void OnShowProgress( wxCommandEvent &event );
0e528b99 108#endif // wxUSE_SPINBTN
16f6dfd8 109
baccb514 110#if wxUSE_SPINCTRL
457e6c54 111 void OnSpinCtrl(wxSpinEvent& event);
baccb514
VZ
112#endif // wxUSE_SPINCTRL
113
87a1e308
VZ
114 void OnEnableAll(wxCommandEvent& event);
115 void OnChangeColour(wxCommandEvent& event);
3e2dd3db 116 void OnTestButton(wxCommandEvent& event);
9121bed2 117 void OnBmpButton(wxCommandEvent& event);
87a1e308 118
6c8a980f
VZ
119 wxListBox *m_listbox,
120 *m_listboxSorted;
b56c2246
VZ
121 wxChoice *m_choice,
122 *m_choiceSorted;
e380f72b
RR
123 wxComboBox *m_combo;
124 wxRadioBox *m_radio;
37ed3ae3
VZ
125 wxGauge *m_gauge,
126 *m_gaugeVert;
e380f72b
RR
127 wxSlider *m_slider;
128 wxButton *m_fontButton;
85eb36c2
RR
129 wxButton *m_lbSelectNum;
130 wxButton *m_lbSelectThis;
0e528b99 131#if wxUSE_SPINBTN
e380f72b 132 wxSpinButton *m_spinbutton;
9726da4f 133 wxButton *m_btnProgress;
0e528b99 134#endif // wxUSE_SPINBTN
b782f2e0
VZ
135
136#if wxUSE_SPINCTRL
137 wxSpinCtrl *m_spinctrl;
138#endif // wxUSE_SPINCTRL
139
e380f72b 140 wxTextCtrl *m_spintext;
ae0bdb01 141 wxCheckBox *m_checkbox;
16f6dfd8 142
e380f72b 143 wxTextCtrl *m_text;
655822f3
VZ
144 wxNotebook *m_notebook;
145
185fa6bf
VZ
146 wxStaticText *m_label;
147
b8653fbf 148private:
29e7e51a
VZ
149 wxLog *m_logTargetOld;
150
b8653fbf 151 DECLARE_EVENT_TABLE()
1c005ff7
RR
152};
153
154class MyFrame: public wxFrame
155{
b8653fbf 156public:
1c005ff7 157 MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h);
655822f3 158
1c005ff7
RR
159 void OnQuit(wxCommandEvent& event);
160 void OnAbout(wxCommandEvent& event);
3e2dd3db 161 void OnClearLog(wxCommandEvent& event);
87a1e308 162
16f6dfd8
VZ
163#if wxUSE_TOOLTIPS
164 void OnSetTooltipDelay(wxCommandEvent& event);
165 void OnToggleTooltips(wxCommandEvent& event);
166#endif // wxUSE_TOOLTIPS
87a1e308
VZ
167
168 void OnEnableAll(wxCommandEvent& event);
169
9f3362c4 170 void OnIdle( wxIdleEvent& event );
5fb9fcfc 171 void OnSize( wxSizeEvent& event );
97206645 172 void OnMove( wxMoveEvent& event );
655822f3 173
f048e32f
VZ
174 MyPanel *GetPanel() const { return m_panel; }
175
b8653fbf 176private:
97206645
VZ
177 void UpdateStatusBar(const wxPoint& pos, const wxSize& size)
178 {
179 wxString msg;
a1f79c1e
VZ
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);
97206645
VZ
185 SetStatusText(msg, 1);
186 }
187
f048e32f 188 MyPanel *m_panel;
87a1e308 189
b8653fbf 190 DECLARE_EVENT_TABLE()
1c005ff7
RR
191};
192
f6bcfd97
BP
193// a button which intercepts double clicks (for testing...)
194class MyButton : public wxButton
195{
196public:
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
213private:
214 DECLARE_EVENT_TABLE()
215};
216
217// a combo which intercepts chars (to test Windows behaviour)
218class MyComboBox : public wxComboBox
219{
220public:
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
232protected:
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
243private:
244 DECLARE_EVENT_TABLE()
245};
246
247// a radiobox which handles focus set/kill (for testing)
248class MyRadioBox : public wxRadioBox
249{
250public:
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,
0bb62421 260 const wxString& name = wxRadioBoxNameStr)
f6bcfd97
BP
261 : wxRadioBox(parent, id, title, pos, size, n, choices, majorDim,
262 style, validator, name) { }
263
264protected:
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
279private:
280 DECLARE_EVENT_TABLE()
281};
282
1c005ff7 283//----------------------------------------------------------------------
6c8a980f 284// other
1c005ff7
RR
285//----------------------------------------------------------------------
286
4acb6ca6 287static void SetControlClientData(const wxChar *name,
6c8a980f
VZ
288 wxControlWithItems *control);
289
d59051dd 290IMPLEMENT_APP(MyApp)
1c005ff7
RR
291
292//----------------------------------------------------------------------
293// MyApp
294//----------------------------------------------------------------------
295
16f6dfd8
VZ
296enum
297{
3e2dd3db
VZ
298 CONTROLS_QUIT = 100,
299 CONTROLS_TEXT,
300 CONTROLS_ABOUT,
301 CONTROLS_CLEAR_LOG,
16f6dfd8
VZ
302
303 // tooltip menu
3e2dd3db
VZ
304 CONTROLS_SET_TOOLTIP_DELAY = 200,
305 CONTROLS_ENABLE_TOOLTIPS,
87a1e308
VZ
306
307 // panel menu
3e2dd3db 308 CONTROLS_ENABLE_ALL
16f6dfd8 309};
1c005ff7 310
b8653fbf 311bool MyApp::OnInit()
1c005ff7 312{
e66ad5c6
VZ
313 // parse the cmd line
314 int x = 50,
315 y = 50;
3ca6a5f0 316 if ( argc == 3 )
e66ad5c6 317 {
4acb6ca6
VZ
318 //wxSscanf(argv[1], "%d", &x);
319 //wxSscanf(argv[2], "%d", &y);
e66ad5c6
VZ
320 }
321
ec9f7884
VZ
322 // Create the main frame window
323 MyFrame *frame = new MyFrame((wxFrame *) NULL,
324 "Controls wxWindows App",
fb5dc8a2 325 x, y, 540, 430);
29e7e51a 326
fb5dc8a2 327 frame->SetSizeHints( 500, 425 );
655822f3 328
ec9f7884
VZ
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
655822f3 332
ec9f7884 333 frame->SetIcon( wxICON(mondrian) );
1c005ff7 334
6adaedf0
JS
335 wxMenu *file_menu = new wxMenu("", wxMENU_TEAROFF);
336
3e2dd3db 337 file_menu->Append(CONTROLS_CLEAR_LOG, "&Clear log\tCtrl-L");
87a1e308 338 file_menu->AppendSeparator();
3e2dd3db
VZ
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");
16f6dfd8 342
33caefb3 343 wxMenuBar *menu_bar = new wxMenuBar;
ec9f7884 344 menu_bar->Append(file_menu, "&File");
16f6dfd8
VZ
345
346#if wxUSE_TOOLTIPS
ec9f7884 347 wxMenu *tooltip_menu = new wxMenu;
3e2dd3db 348 tooltip_menu->Append(CONTROLS_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D");
ec9f7884 349 tooltip_menu->AppendSeparator();
3e2dd3db 350 tooltip_menu->Append(CONTROLS_ENABLE_TOOLTIPS, "&Toggle tooltips\tCtrl-T",
ec9f7884 351 "enable/disable tooltips", TRUE);
3e2dd3db 352 tooltip_menu->Check(CONTROLS_ENABLE_TOOLTIPS, TRUE);
ec9f7884 353 menu_bar->Append(tooltip_menu, "&Tooltips");
16f6dfd8
VZ
354#endif // wxUSE_TOOLTIPS
355
87a1e308 356 wxMenu *panel_menu = new wxMenu;
3e2dd3db 357 panel_menu->Append(CONTROLS_ENABLE_ALL, "&Disable all\tCtrl-E",
87a1e308
VZ
358 "Enable/disable all panel controls", TRUE);
359 menu_bar->Append(panel_menu, "&Panel");
360
ec9f7884 361 frame->SetMenuBar(menu_bar);
1c005ff7 362
ec9f7884 363 frame->Show(TRUE);
655822f3 364
ee6e1b1d 365 //frame->GetPanel()->m_notebook->SetSelection(6);
f048e32f 366
ec9f7884 367 SetTopWindow(frame);
1c005ff7 368
ec9f7884 369 return TRUE;
1c005ff7
RR
370}
371
372//----------------------------------------------------------------------
373// MyPanel
374//----------------------------------------------------------------------
375
4fabb575 376const int ID_NOTEBOOK = 1000;
1c005ff7 377
4fabb575
JS
378const int ID_LISTBOX = 130;
379const int ID_LISTBOX_SEL_NUM = 131;
380const int ID_LISTBOX_SEL_STR = 132;
381const int ID_LISTBOX_CLEAR = 133;
382const int ID_LISTBOX_APPEND = 134;
383const int ID_LISTBOX_DELETE = 135;
384const int ID_LISTBOX_FONT = 136;
385const int ID_LISTBOX_ENABLE = 137;
6c8a980f 386const int ID_LISTBOX_SORTED = 138;
1c005ff7 387
4fabb575
JS
388const int ID_CHOICE = 120;
389const int ID_CHOICE_SEL_NUM = 121;
390const int ID_CHOICE_SEL_STR = 122;
391const int ID_CHOICE_CLEAR = 123;
392const int ID_CHOICE_APPEND = 124;
393const int ID_CHOICE_DELETE = 125;
394const int ID_CHOICE_FONT = 126;
395const int ID_CHOICE_ENABLE = 127;
b56c2246 396const int ID_CHOICE_SORTED = 128;
53010e52 397
4fabb575
JS
398const int ID_COMBO = 140;
399const int ID_COMBO_SEL_NUM = 141;
400const int ID_COMBO_SEL_STR = 142;
401const int ID_COMBO_CLEAR = 143;
402const int ID_COMBO_APPEND = 144;
403const int ID_COMBO_DELETE = 145;
404const int ID_COMBO_FONT = 146;
405const int ID_COMBO_ENABLE = 147;
53010e52 406
4fabb575
JS
407const int ID_RADIOBOX = 160;
408const int ID_RADIOBOX_SEL_NUM = 161;
409const int ID_RADIOBOX_SEL_STR = 162;
410const int ID_RADIOBOX_FONT = 163;
411const int ID_RADIOBOX_ENABLE = 164;
868a2826 412
f5d29b39
RR
413const int ID_RADIOBUTTON_1 = 166;
414const int ID_RADIOBUTTON_2 = 167;
415
4fabb575 416const int ID_SET_FONT = 170;
47908e25 417
4fabb575
JS
418const int ID_GAUGE = 180;
419const int ID_SLIDER = 181;
58614078 420
4fabb575 421const int ID_SPIN = 182;
9726da4f 422const int ID_BTNPROGRESS = 183;
185fa6bf 423const int ID_BUTTON_LABEL = 184;
baccb514 424const int ID_SPINCTRL = 185;
e380f72b 425
3e2dd3db
VZ
426const int ID_BUTTON_TEST1 = 190;
427const int ID_BUTTON_TEST2 = 191;
9121bed2 428const int ID_BITMAP_BTN = 192;
3e2dd3db 429
87a1e308
VZ
430const int ID_CHANGE_COLOUR = 200;
431
1c005ff7 432BEGIN_EVENT_TABLE(MyPanel, wxPanel)
ec9f7884 433EVT_SIZE ( MyPanel::OnSize)
4d0f3cd6 434EVT_NOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK, MyPanel::OnPageChanging)
ec9f7884
VZ
435EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, MyPanel::OnPageChanged)
436EVT_LISTBOX (ID_LISTBOX, MyPanel::OnListBox)
6c8a980f 437EVT_LISTBOX (ID_LISTBOX_SORTED, MyPanel::OnListBox)
ec9f7884
VZ
438EVT_LISTBOX_DCLICK(ID_LISTBOX, MyPanel::OnListBoxDoubleClick)
439EVT_BUTTON (ID_LISTBOX_SEL_NUM, MyPanel::OnListBoxButtons)
440EVT_BUTTON (ID_LISTBOX_SEL_STR, MyPanel::OnListBoxButtons)
441EVT_BUTTON (ID_LISTBOX_CLEAR, MyPanel::OnListBoxButtons)
442EVT_BUTTON (ID_LISTBOX_APPEND, MyPanel::OnListBoxButtons)
443EVT_BUTTON (ID_LISTBOX_DELETE, MyPanel::OnListBoxButtons)
444EVT_BUTTON (ID_LISTBOX_FONT, MyPanel::OnListBoxButtons)
445EVT_CHECKBOX (ID_LISTBOX_ENABLE, MyPanel::OnListBoxButtons)
446EVT_CHOICE (ID_CHOICE, MyPanel::OnChoice)
b56c2246 447EVT_CHOICE (ID_CHOICE_SORTED, MyPanel::OnChoice)
ec9f7884
VZ
448EVT_BUTTON (ID_CHOICE_SEL_NUM, MyPanel::OnChoiceButtons)
449EVT_BUTTON (ID_CHOICE_SEL_STR, MyPanel::OnChoiceButtons)
450EVT_BUTTON (ID_CHOICE_CLEAR, MyPanel::OnChoiceButtons)
451EVT_BUTTON (ID_CHOICE_APPEND, MyPanel::OnChoiceButtons)
452EVT_BUTTON (ID_CHOICE_DELETE, MyPanel::OnChoiceButtons)
453EVT_BUTTON (ID_CHOICE_FONT, MyPanel::OnChoiceButtons)
454EVT_CHECKBOX (ID_CHOICE_ENABLE, MyPanel::OnChoiceButtons)
455EVT_COMBOBOX (ID_COMBO, MyPanel::OnCombo)
f6bcfd97
BP
456EVT_TEXT (ID_COMBO, MyPanel::OnComboTextChanged)
457EVT_TEXT_ENTER(ID_COMBO, MyPanel::OnComboTextEnter)
ec9f7884
VZ
458EVT_BUTTON (ID_COMBO_SEL_NUM, MyPanel::OnComboButtons)
459EVT_BUTTON (ID_COMBO_SEL_STR, MyPanel::OnComboButtons)
460EVT_BUTTON (ID_COMBO_CLEAR, MyPanel::OnComboButtons)
461EVT_BUTTON (ID_COMBO_APPEND, MyPanel::OnComboButtons)
462EVT_BUTTON (ID_COMBO_DELETE, MyPanel::OnComboButtons)
463EVT_BUTTON (ID_COMBO_FONT, MyPanel::OnComboButtons)
464EVT_CHECKBOX (ID_COMBO_ENABLE, MyPanel::OnComboButtons)
465EVT_RADIOBOX (ID_RADIOBOX, MyPanel::OnRadio)
466EVT_BUTTON (ID_RADIOBOX_SEL_NUM, MyPanel::OnRadioButtons)
467EVT_BUTTON (ID_RADIOBOX_SEL_STR, MyPanel::OnRadioButtons)
468EVT_BUTTON (ID_RADIOBOX_FONT, MyPanel::OnRadioButtons)
469EVT_CHECKBOX (ID_RADIOBOX_ENABLE, MyPanel::OnRadioButtons)
470EVT_BUTTON (ID_SET_FONT, MyPanel::OnSetFont)
471EVT_SLIDER (ID_SLIDER, MyPanel::OnSliderUpdate)
0e528b99 472#if wxUSE_SPINBTN
ec9f7884 473EVT_SPIN (ID_SPIN, MyPanel::OnSpinUpdate)
8c3c31d4
VZ
474EVT_SPIN_UP (ID_SPIN, MyPanel::OnSpinUp)
475EVT_SPIN_DOWN (ID_SPIN, MyPanel::OnSpinDown)
9726da4f
VZ
476EVT_UPDATE_UI (ID_BTNPROGRESS, MyPanel::OnUpdateShowProgress)
477EVT_BUTTON (ID_BTNPROGRESS, MyPanel::OnShowProgress)
0e528b99 478#endif // wxUSE_SPINBTN
baccb514 479#if wxUSE_SPINCTRL
57160afe 480EVT_SPINCTRL (ID_SPINCTRL, MyPanel::OnSpinCtrl)
baccb514 481#endif // wxUSE_SPINCTRL
4c36ca57 482#if wxUSE_TOGGLEBTN
1db8dc4a 483EVT_TOGGLEBUTTON(ID_BUTTON_LABEL, MyPanel::OnUpdateLabel)
4c36ca57 484#endif // wxUSE_TOGGLEBTN
87a1e308 485EVT_CHECKBOX (ID_CHANGE_COLOUR, MyPanel::OnChangeColour)
3e2dd3db
VZ
486EVT_BUTTON (ID_BUTTON_TEST1, MyPanel::OnTestButton)
487EVT_BUTTON (ID_BUTTON_TEST2, MyPanel::OnTestButton)
9121bed2 488EVT_BUTTON (ID_BITMAP_BTN, MyPanel::OnBmpButton)
1c005ff7
RR
489END_EVENT_TABLE()
490
f6bcfd97
BP
491BEGIN_EVENT_TABLE(MyButton, wxButton)
492 EVT_LEFT_DCLICK(MyButton::OnDClick)
493END_EVENT_TABLE()
494
495BEGIN_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)
501END_EVENT_TABLE()
502
503BEGIN_EVENT_TABLE(MyRadioBox, wxRadioBox)
504 EVT_SET_FOCUS(MyRadioBox::OnFocusGot)
505 EVT_KILL_FOCUS(MyRadioBox::OnFocusLost)
506END_EVENT_TABLE()
507
508// ============================================================================
509// implementation
510// ============================================================================
511
5fb9fcfc 512MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
0a772322
VZ
513 : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) ),
514 m_text(NULL), m_notebook(NULL)
1c005ff7 515{
9d9b7755
VZ
516 wxLayoutConstraints *c;
517
3e2dd3db
VZ
518 m_text = new wxTextCtrl(this, -1, "This is the log window.\n",
519 wxPoint(0, 250), wxSize(100, 50), wxTE_MULTILINE);
103aab26 520 m_text->SetBackgroundColour("wheat");
655822f3 521
abceee76
VZ
522 if ( 0 )
523 wxLog::AddTraceMask(_T("focus"));
29e7e51a 524 m_logTargetOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_text));
0a772322 525
3e2dd3db 526 m_notebook = new wxNotebook(this, ID_NOTEBOOK);
655822f3 527
ec9f7884
VZ
528 wxString choices[] =
529 {
530 "This",
531 "is one of my",
532 "really",
533 "wonderful",
534 "examples."
535 };
655822f3 536
4fabb575 537#ifdef USE_XPM
ec9f7884
VZ
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);
73c700fd 554#elif defined(__WXMSW__)
ec9f7884
VZ
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 {
4acb6ca6 572 wxLogWarning(wxT("Couldn't load the image '%s' for the notebook page %d."),
ec9f7884
VZ
573 s_iconNames[n], n);
574 }
575 }
576
577 m_notebook->SetImageList(imagelist);
4fabb575
JS
578#else
579
ec9f7884 580 // No images for now
4fabb575
JS
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
fc54776e 589#endif
2cb21a45 590
6c8a980f
VZ
591 wxPanel *panel = new wxPanel(m_notebook);
592 m_listbox = new wxListBox( panel, ID_LISTBOX,
593 wxPoint(10,10), wxSize(120,70),
354aa1e3 594 5, choices, wxLB_ALWAYS_SB );
6c8a980f
VZ
595 m_listboxSorted = new wxListBox( panel, ID_LISTBOX_SORTED,
596 wxPoint(10,90), wxSize(120,70),
354aa1e3 597 5, choices, wxLB_SORT );
6c8a980f 598
4acb6ca6
VZ
599 SetControlClientData(wxT("listbox"), m_listbox);
600 SetControlClientData(wxT("listbox"), m_listboxSorted);
9838df2c 601
ec9f7884 602 m_listbox->SetCursor(*wxCROSS_CURSOR);
b8653fbf 603#if wxUSE_TOOLTIPS
ec9f7884 604 m_listbox->SetToolTip( "This is a list box" );
16f6dfd8 605#endif // wxUSE_TOOLTIPS
9f3362c4 606
3e2dd3db
VZ
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) );
f6bcfd97 610 (void)new MyButton( panel, ID_LISTBOX_APPEND, "&Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
3e2dd3db 611 (void)new wxButton( panel, ID_LISTBOX_DELETE, "D&elete selected item", wxPoint(180,130), wxSize(140,30) );
f6bcfd97 612 wxButton *button = new MyButton( panel, ID_LISTBOX_FONT, "Set &Italic font", wxPoint(340,130), wxSize(140,30) );
57160afe
VZ
613
614 button->SetDefault();
615
616 button->SetForegroundColour(*wxBLUE);
617
b8653fbf 618#if wxUSE_TOOLTIPS
ec9f7884 619 button->SetToolTip( "Press here to set italic font" );
16f6dfd8 620#endif // wxUSE_TOOLTIPS
b1170810 621
6c8a980f 622 m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, "&Disable", wxPoint(20,170) );
ec9f7884 623 m_checkbox->SetValue(FALSE);
b8653fbf 624#if wxUSE_TOOLTIPS
ec9f7884 625 m_checkbox->SetToolTip( "Click here to disable the listbox" );
16f6dfd8 626#endif // wxUSE_TOOLTIPS
87a1e308
VZ
627 (void)new wxCheckBox( panel, ID_CHANGE_COLOUR, "&Toggle colour",
628 wxPoint(110,170) );
9121bed2 629 panel->SetCursor(wxCursor(wxCURSOR_HAND));
ec9f7884
VZ
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 );
b56c2246
VZ
634 m_choiceSorted = new wxChoice( panel, ID_CHOICE_SORTED, wxPoint(10,70), wxSize(120,-1),
635 5, choices, wxCB_SORT );
6c8a980f 636
4acb6ca6
VZ
637 SetControlClientData(wxT("choice"), m_choice);
638 SetControlClientData(wxT("choice"), m_choiceSorted);
6c8a980f 639
ddc8c2e3 640 m_choice->SetSelection(2);
2b07d713 641 m_choice->SetBackgroundColour( "red" );
3e2dd3db
VZ
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) );
1fad4c3e 649
ec9f7884
VZ
650 m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
651
652 panel = new wxPanel(m_notebook);
3e2dd3db 653 (void)new wxStaticBox( panel, -1, "&Box around combobox",
f048e32f 654 wxPoint(5, 5), wxSize(150, 100));
f6bcfd97
BP
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
3e2dd3db
VZ
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) );
ec9f7884
VZ
667 m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo);
668
ec9f7884
VZ
669 wxString choices2[] =
670 {
17867d61 671 "First", "Second",
0a772322 672 /* "Third",
17867d61
RR
673 "Fourth", "Fifth", "Sixth",
674 "Seventh", "Eighth", "Nineth", "Tenth" */
ec9f7884
VZ
675 };
676
677 panel = new wxPanel(m_notebook);
f6bcfd97 678 (void)new MyRadioBox( panel, ID_RADIOBOX, "&That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
3e2dd3db 679 m_radio = new wxRadioBox( panel, ID_RADIOBOX, "T&his", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
f048e32f
VZ
680
681#if wxUSE_TOOLTIPS
3e2dd3db 682 m_combo->SetToolTip("This is a natural\ncombobox - can you believe me?");
f048e32f
VZ
683 m_radio->SetToolTip("Ever seen a radiobox?");
684#endif // wxUSE_TOOLTIPS
685
3e2dd3db
VZ
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 );
7e2b55cd 691 wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxDefaultSize, wxRB_GROUP );
ec9f7884 692 rb->SetValue( FALSE );
3e2dd3db 693 (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "&Radiobutton2", wxPoint(340,170), wxDefaultSize );
ec9f7884
VZ
694 m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
695
696 panel = new wxPanel(m_notebook);
0bb62421 697 (void)new wxStaticBox( panel, -1, "&wxGauge and wxSlider", wxPoint(10,10), wxSize(222,130) );
f6bcfd97
BP
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);
37ed3ae3 701 m_gaugeVert = new wxGauge( panel, -1, 100,
0bb62421 702 wxPoint(195,35), wxSize(30, 90),
1724ca8b 703 wxGA_VERTICAL | wxGA_SMOOTH | wxNO_BORDER );
7ba4fbeb
VZ
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);
0bb62421 707 (void)new wxStaticBox( panel, -1, "&Explanation", wxPoint(230,10), wxSize(270,130) );
9838df2c 708#ifdef __WXMOTIF__
ec9f7884
VZ
709 // No wrapping text in wxStaticText yet :-(
710 (void)new wxStaticText( panel, -1,
711 "Drag the slider!",
37ed3ae3 712 wxPoint(250,30),
e65cc56a 713 wxSize(240, -1)
ec9f7884 714 );
9838df2c 715#else
ec9f7884
VZ
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",
37ed3ae3 723 wxPoint(250,25),
8c3c31d4 724 wxSize(240, 110)
ec9f7884 725 );
9838df2c 726#endif
8c3c31d4
VZ
727 int initialSpinValue = -5;
728 wxString s;
729 s << initialSpinValue;
730 m_spintext = new wxTextCtrl( panel, -1, s, wxPoint(20,160), wxSize(80,-1) );
0e528b99 731#if wxUSE_SPINBTN
738f9e5a 732 m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,160), wxSize(80, -1) );
6380910c 733 m_spinbutton->SetRange(-10,30);
8c3c31d4 734 m_spinbutton->SetValue(initialSpinValue);
9726da4f 735
3e2dd3db 736 m_btnProgress = new wxButton( panel, ID_BTNPROGRESS, "&Show progress dialog",
738f9e5a 737 wxPoint(300, 160) );
0e528b99 738#endif // wxUSE_SPINBTN
b782f2e0
VZ
739
740#if wxUSE_SPINCTRL
678cd6de 741 m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, "", wxPoint(200, 160), wxSize(80, -1) );
b782f2e0
VZ
742 m_spinctrl->SetRange(10,30);
743 m_spinctrl->SetValue(15);
744#endif // wxUSE_SPINCTRL
745
ec9f7884 746 m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
45e41c05
VZ
747
748 panel = new wxPanel(m_notebook);
b782f2e0 749
3dec57ad 750#if !defined(__WXMOTIF__) && !defined(__WIN16__) // wxStaticBitmap not working under Motif yet; and icons not allowed under WIN16.
45e41c05 751 wxIcon icon = wxTheApp->GetStdIcon(wxICON_INFORMATION);
f048e32f
VZ
752 wxStaticBitmap *bmpStatic = new wxStaticBitmap(panel, -1, icon,
753 wxPoint(10, 10));
45e41c05
VZ
754
755 bmpStatic = new wxStaticBitmap(panel, -1, wxNullIcon, wxPoint(50, 10));
756 bmpStatic->SetIcon(wxTheApp->GetStdIcon(wxICON_QUESTION));
b782f2e0
VZ
757#endif // !Motif
758
45e41c05
VZ
759 wxBitmap bitmap( 100, 100 );
760 wxMemoryDC dc;
761 dc.SelectObject( bitmap );
762 dc.SetPen(*wxGREEN_PEN);
f048e32f 763 dc.Clear();
45e41c05 764 dc.DrawEllipse(5, 5, 90, 90);
f048e32f 765 dc.DrawText("Bitmap", 30, 40);
45e41c05
VZ
766 dc.SelectObject( wxNullBitmap );
767
9121bed2 768 (void)new wxBitmapButton(panel, ID_BITMAP_BTN, bitmap, wxPoint(100, 20));
f048e32f 769
80a58c99 770#ifdef __WXMSW__
3e2dd3db
VZ
771 // test for masked bitmap display
772 bitmap = wxBitmap("test2.bmp", wxBITMAP_TYPE_BMP);
9bb3479c
JS
773 if (bitmap.Ok())
774 {
775 bitmap.SetMask(new wxMask(bitmap, *wxBLUE));
669f7a11 776
9bb3479c
JS
777 (void)new wxStaticBitmap /* wxBitmapButton */ (panel, -1, bitmap, wxPoint(300, 120));
778 }
57160afe 779#endif
5ef2e633 780
f048e32f
VZ
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,
1db8dc4a 788 wxPoint(30, 70)
f048e32f 789 );
76fcf0f2 790
f048e32f
VZ
791 bmpBtn->SetBitmapSelected(bmp2);
792 bmpBtn->SetBitmapFocus(bmp3);
793
4c36ca57 794#if wxUSE_TOGGLEBTN
1db8dc4a
VZ
795 (void)new wxToggleButton(panel, ID_BUTTON_LABEL,
796 "&Toggle label", wxPoint(250, 20));
4c36ca57 797#endif // wxUSE_TOGGLEBTN
bedaf53e 798
185fa6bf
VZ
799 m_label = new wxStaticText(panel, -1, "Label with some long text",
800 wxPoint(250, 60), wxDefaultSize,
f6bcfd97 801 wxALIGN_RIGHT /*| wxST_NO_AUTORESIZE*/);
103aab26 802 m_label->SetForegroundColour( *wxBLUE );
2ac1b69a 803
45e41c05 804 m_notebook->AddPage(panel, "wxBitmapXXX");
dcc71398 805
9d9b7755 806 // layout constraints
dcc71398 807
9d9b7755
VZ
808 panel = new wxPanel(m_notebook);
809 panel->SetAutoLayout( TRUE );
d7928388 810
9d9b7755
VZ
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 );
d7928388 816
3e2dd3db 817 wxButton *pMyButton = new wxButton(panel, ID_BUTTON_TEST1, "Test Button &1" );
9d9b7755 818 pMyButton->SetConstraints( c );
d7928388 819
9d9b7755
VZ
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 );
185fa6bf 825
3e2dd3db 826 wxButton *pMyButton2 = new wxButton(panel, ID_BUTTON_TEST2, "Test Button &2" );
9d9b7755 827 pMyButton2->SetConstraints( c );
185fa6bf 828
9d9b7755 829 m_notebook->AddPage(panel, "wxLayoutConstraint");
d7928388 830
9d9b7755 831 // sizer
dcc71398 832
9d9b7755
VZ
833 panel = new wxPanel(m_notebook);
834 panel->SetAutoLayout( TRUE );
dcc71398 835
9d9b7755
VZ
836 wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
837
3e2dd3db 838 sizer->Add( new wxButton(panel, -1, "Test Button &1" ), 3, wxALL, 10 );
9d9b7755 839 sizer->Add( 20,20, 1 );
3e2dd3db 840 sizer->Add( new wxButton(panel, -1, "Test Button &2" ), 3, wxGROW|wxALL, 10 );
9d9b7755
VZ
841
842 panel->SetSizer( sizer );
843
844 m_notebook->AddPage(panel, "wxSizer");
1c005ff7
RR
845}
846
847void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
848{
ec9f7884
VZ
849 int x = 0;
850 int y = 0;
851 GetClientSize( &x, &y );
655822f3 852
ec9f7884
VZ
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 );
1c005ff7
RR
855}
856
4d0f3cd6
VZ
857void MyPanel::OnPageChanging( wxNotebookEvent &event )
858{
45e41c05
VZ
859 int selOld = event.GetOldSelection();
860 if ( selOld == 2 )
4d0f3cd6 861 {
65045edd
RR
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",
8c3c31d4 865 "Control sample",
f6bcfd97 866 wxICON_QUESTION | wxYES_NO, this) != wxYES )
8c3c31d4
VZ
867 {
868 event.Veto();
45e41c05 869
8c3c31d4
VZ
870 return;
871 }
4d0f3cd6 872 }
45e41c05 873
36202885
VZ
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";
4d0f3cd6
VZ
878}
879
cb43b372
RR
880void MyPanel::OnPageChanged( wxNotebookEvent &event )
881{
36202885
VZ
882 *m_text << "Notebook selection is now " << event.GetSelection()
883 << " (from notebook: " << m_notebook->GetSelection() << ")\n";
cb43b372
RR
884}
885
3e2dd3db
VZ
886void MyPanel::OnTestButton(wxCommandEvent& event)
887{
888 wxLogMessage(_T("Button %c clicked."),
889 event.GetId() == ID_BUTTON_TEST1 ? _T('1') : _T('2'));
890}
891
9121bed2
VZ
892void MyPanel::OnBmpButton(wxCommandEvent& event)
893{
894 wxLogMessage(_T("Bitmap button clicked."));
895}
896
87a1e308
VZ
897void 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
103aab26
RR
907 m_lbSelectThis->SetForegroundColour("red");
908 m_lbSelectThis->SetBackgroundColour("white");
87a1e308
VZ
909 }
910 else
911 {
103aab26
RR
912 s_colOld = wxColour("red");
913 SetBackgroundColour("white");
87a1e308 914
57160afe 915 m_lbSelectThis->SetForegroundColour("white");
87a1e308
VZ
916 m_lbSelectThis->SetBackgroundColour("red");
917 }
918
919 m_lbSelectThis->Refresh();
920 Refresh();
921}
922
1c005ff7
RR
923void MyPanel::OnListBox( wxCommandEvent &event )
924{
2e0e025e 925// GetParent()->Move(100, 100);
e66ad5c6 926
846e1424
RR
927 if (event.GetInt() == -1)
928 {
929 m_text->AppendText( "ListBox has no selections anymore\n" );
930 return;
931 }
932
6c8a980f
VZ
933 wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
934 : m_listboxSorted;
935
936 m_text->AppendText( "ListBox event selection string is: '" );
ec9f7884 937 m_text->AppendText( event.GetString() );
6c8a980f
VZ
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: '" );
6e47faf1 945 if (obj) // BC++ doesn't like use of '? .. : .. ' in this context
74a533f7 946 m_text->AppendText( obj->GetData() );
6e47faf1 947 else
74a533f7 948 m_text->AppendText( wxString("none") );
6e47faf1 949
6c8a980f
VZ
950 m_text->AppendText( "'\n" );
951 m_text->AppendText( "ListBox control client data string is: '" );
952 obj = (wxStringClientData *)listbox->GetClientObject(listbox->GetSelection());
6e47faf1 953 if (obj)
74a533f7 954 m_text->AppendText( obj->GetData() );
6e47faf1 955 else
74a533f7 956 m_text->AppendText( wxString("none") );
6c8a980f 957 m_text->AppendText( "'\n" );
1c005ff7
RR
958}
959
5b077d48
RR
960void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
961{
ec9f7884
VZ
962 m_text->AppendText( "ListBox double click string is: " );
963 m_text->AppendText( event.GetString() );
964 m_text->AppendText( "\n" );
5b077d48
RR
965}
966
47908e25
RR
967void MyPanel::OnListBoxButtons( wxCommandEvent &event )
968{
ec9f7884 969 switch (event.GetId())
d3904ceb 970 {
ec9f7884
VZ
971 case ID_LISTBOX_ENABLE:
972 {
973 m_text->AppendText("Checkbox clicked.\n");
974 wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
b8653fbf 975#if wxUSE_TOOLTIPS
ec9f7884
VZ
976 if (event.GetInt())
977 cb->SetToolTip( "Click to enable listbox" );
978 else
979 cb->SetToolTip( "Click to disable listbox" );
16f6dfd8 980#endif // wxUSE_TOOLTIPS
ec9f7884 981 m_listbox->Enable( event.GetInt() == 0 );
57160afe
VZ
982 m_lbSelectThis->Enable( event.GetInt() == 0 );
983 m_lbSelectNum->Enable( event.GetInt() == 0 );
6c8a980f 984 m_listboxSorted->Enable( event.GetInt() == 0 );
ee6e1b1d 985 FindWindow(ID_CHANGE_COLOUR)->Enable( event.GetInt() == 0 );
ec9f7884
VZ
986 break;
987 }
988 case ID_LISTBOX_SEL_NUM:
989 {
990 m_listbox->SetSelection( 2 );
6c8a980f 991 m_listboxSorted->SetSelection( 2 );
8c3c31d4 992 m_lbSelectThis->WarpPointer( 40, 14 );
ec9f7884
VZ
993 break;
994 }
995 case ID_LISTBOX_SEL_STR:
996 {
997 m_listbox->SetStringSelection( "This" );
6c8a980f 998 m_listboxSorted->SetStringSelection( "This" );
8c3c31d4 999 m_lbSelectNum->WarpPointer( 40, 14 );
ec9f7884
VZ
1000 break;
1001 }
1002 case ID_LISTBOX_CLEAR:
1003 {
1004 m_listbox->Clear();
6c8a980f 1005 m_listboxSorted->Clear();
ec9f7884
VZ
1006 break;
1007 }
1008 case ID_LISTBOX_APPEND:
1009 {
1010 m_listbox->Append( "Hi!" );
6c8a980f 1011 m_listboxSorted->Append( "Hi!" );
ec9f7884
VZ
1012 break;
1013 }
1014 case ID_LISTBOX_DELETE:
1015 {
6c8a980f
VZ
1016 int idx;
1017 idx = m_listbox->GetSelection();
f6bcfd97
BP
1018 if ( idx != wxNOT_FOUND )
1019 m_listbox->Delete( idx );
6c8a980f 1020 idx = m_listboxSorted->GetSelection();
f6bcfd97
BP
1021 if ( idx != wxNOT_FOUND )
1022 m_listboxSorted->Delete( idx );
ec9f7884
VZ
1023 break;
1024 }
1025 case ID_LISTBOX_FONT:
1026 {
1027 m_listbox->SetFont( *wxITALIC_FONT );
6c8a980f 1028 m_listboxSorted->SetFont( *wxITALIC_FONT );
ec9f7884
VZ
1029 m_checkbox->SetFont( *wxITALIC_FONT );
1030 break;
1031 }
868a2826 1032 }
47908e25
RR
1033}
1034
1035void MyPanel::OnChoice( wxCommandEvent &event )
1036{
6c8a980f
VZ
1037 wxChoice *choice = event.GetId() == ID_CHOICE ? m_choice
1038 : m_choiceSorted;
1039
1040 m_text->AppendText( "Choice event selection string is: '" );
ec9f7884 1041 m_text->AppendText( event.GetString() );
6c8a980f 1042 m_text->AppendText( "'\n" );
b56c2246 1043 m_text->AppendText( "Choice control selection string is: '" );
6c8a980f
VZ
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: '" );
6e47faf1
JS
1049
1050 if (obj)
1051 m_text->AppendText( obj->GetData() );
1052 else
1053 m_text->AppendText( wxString("none") );
1054
6c8a980f
VZ
1055 m_text->AppendText( "'\n" );
1056 m_text->AppendText( "Choice control client data string is: '" );
1057 obj = (wxStringClientData *)choice->GetClientObject(choice->GetSelection());
6e47faf1
JS
1058
1059 if (obj)
1060 m_text->AppendText( obj->GetData() );
1061 else
1062 m_text->AppendText( wxString("none") );
6c8a980f 1063 m_text->AppendText( "'\n" );
47908e25
RR
1064}
1065
1066void MyPanel::OnChoiceButtons( wxCommandEvent &event )
1067{
ec9f7884 1068 switch (event.GetId())
47908e25 1069 {
ec9f7884
VZ
1070 case ID_CHOICE_ENABLE:
1071 {
1072 m_choice->Enable( event.GetInt() == 0 );
b56c2246 1073 m_choiceSorted->Enable( event.GetInt() == 0 );
ec9f7884
VZ
1074 break;
1075 }
1076 case ID_CHOICE_SEL_NUM:
1077 {
1078 m_choice->SetSelection( 2 );
b56c2246 1079 m_choiceSorted->SetSelection( 2 );
ec9f7884
VZ
1080 break;
1081 }
1082 case ID_CHOICE_SEL_STR:
1083 {
1084 m_choice->SetStringSelection( "This" );
b56c2246 1085 m_choiceSorted->SetStringSelection( "This" );
ec9f7884
VZ
1086 break;
1087 }
1088 case ID_CHOICE_CLEAR:
1089 {
1090 m_choice->Clear();
b56c2246 1091 m_choiceSorted->Clear();
ec9f7884
VZ
1092 break;
1093 }
1094 case ID_CHOICE_APPEND:
1095 {
1096 m_choice->Append( "Hi!" );
b56c2246 1097 m_choiceSorted->Append( "Hi!" );
ec9f7884
VZ
1098 break;
1099 }
1100 case ID_CHOICE_DELETE:
1101 {
1102 int idx = m_choice->GetSelection();
f6bcfd97
BP
1103 if ( idx != wxNOT_FOUND )
1104 m_choice->Delete( idx );
b56c2246 1105 idx = m_choiceSorted->GetSelection();
f6bcfd97
BP
1106 if ( idx != wxNOT_FOUND )
1107 m_choiceSorted->Delete( idx );
ec9f7884
VZ
1108 break;
1109 }
1110 case ID_CHOICE_FONT:
1111 {
1112 m_choice->SetFont( *wxITALIC_FONT );
b56c2246 1113 m_choiceSorted->SetFont( *wxITALIC_FONT );
ec9f7884
VZ
1114 break;
1115 }
868a2826 1116 }
47908e25
RR
1117}
1118
1119void MyPanel::OnCombo( wxCommandEvent &event )
1120{
19da4326 1121 m_text->AppendText( "ComboBox event selection string is: " );
ec9f7884
VZ
1122 m_text->AppendText( event.GetString() );
1123 m_text->AppendText( "\n" );
19da4326
RR
1124 m_text->AppendText( "ComboBox control selection string is: " );
1125 m_text->AppendText( m_combo->GetStringSelection() );
1126 m_text->AppendText( "\n" );
47908e25
RR
1127}
1128
f6bcfd97
BP
1129void 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
1135void 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
47908e25 1141void MyPanel::OnComboButtons( wxCommandEvent &event )
1c005ff7 1142{
ec9f7884 1143 switch (event.GetId())
2f6407b9 1144 {
ec9f7884
VZ
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 }
868a2826 1181 }
47908e25
RR
1182}
1183
1184void MyPanel::OnRadio( wxCommandEvent &event )
1185{
ec9f7884
VZ
1186 m_text->AppendText( "RadioBox selection string is: " );
1187 m_text->AppendText( event.GetString() );
1188 m_text->AppendText( "\n" );
47908e25
RR
1189}
1190
1191void MyPanel::OnRadioButtons( wxCommandEvent &event )
1192{
ec9f7884 1193 switch (event.GetId())
d3904ceb 1194 {
ec9f7884
VZ
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 }
868a2826 1215 }
1c005ff7
RR
1216}
1217
868a2826
RR
1218void MyPanel::OnSetFont( wxCommandEvent &WXUNUSED(event) )
1219{
ec9f7884
VZ
1220 m_fontButton->SetFont( *wxITALIC_FONT );
1221 m_text->SetFont( *wxITALIC_FONT );
868a2826
RR
1222}
1223
1db8dc4a 1224void MyPanel::OnUpdateLabel( wxCommandEvent &event )
185fa6bf 1225{
1db8dc4a
VZ
1226 m_label->SetLabel(event.GetInt() ? "Very very very very very long text."
1227 : "Shorter text.");
185fa6bf
VZ
1228}
1229
7bce6aec
RR
1230void MyPanel::OnSliderUpdate( wxCommandEvent &WXUNUSED(event) )
1231{
ec9f7884 1232 m_gauge->SetValue( m_slider->GetValue() );
37ed3ae3 1233 m_gaugeVert->SetValue( m_slider->GetValue() / 2 );
7bce6aec
RR
1234}
1235
baccb514
VZ
1236#if wxUSE_SPINCTRL
1237
457e6c54 1238void MyPanel::OnSpinCtrl(wxSpinEvent& event)
baccb514
VZ
1239{
1240 wxString s;
57160afe
VZ
1241 s.Printf(_T("Spin ctrl changed: now %d (from event: %d)\n"),
1242 m_spinctrl->GetValue(), event.GetInt());
baccb514
VZ
1243 m_text->AppendText(s);
1244}
1245
1246#endif // wxUSE_SPINCTRL
1247
0e528b99 1248#if wxUSE_SPINBTN
8c3c31d4
VZ
1249void 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
1265void 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
e380f72b
RR
1281void MyPanel::OnSpinUpdate( wxSpinEvent &event )
1282{
ec9f7884 1283 wxString value;
f70d5829 1284 value.Printf( _T("%d"), event.GetPosition() );
ec9f7884 1285 m_spintext->SetValue( value );
6380910c 1286
f70d5829 1287 value.Printf( _T("Spin control range: (%d, %d), current = %d\n"),
6380910c
VZ
1288 m_spinbutton->GetMin(), m_spinbutton->GetMax(),
1289 m_spinbutton->GetValue());
1290
1291 m_text->AppendText(value);
e380f72b 1292}
9726da4f
VZ
1293
1294void MyPanel::OnUpdateShowProgress( wxUpdateUIEvent& event )
1295{
1296 event.Enable( m_spinbutton->GetValue() > 0 );
1297}
1298
1299void 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
8c3c31d4 1306 wxPD_CAN_ABORT |
2c8e4738 1307 wxPD_AUTO_HIDE |
8c3c31d4
VZ
1308 wxPD_APP_MODAL |
1309 wxPD_ELAPSED_TIME |
1310 wxPD_ESTIMATED_TIME |
1311 wxPD_REMAINING_TIME);
2ac1b69a 1312
9726da4f
VZ
1313
1314 bool cont = TRUE;
abceee76 1315 for ( int i = 0; i <= max && cont; i++ )
9726da4f
VZ
1316 {
1317 wxSleep(1);
abceee76 1318 if ( i == max )
be9abe3f
VZ
1319 {
1320 cont = dialog.Update(i, "That's all, folks!");
1321 }
1322 else if ( i == max / 2 )
9726da4f 1323 {
abceee76 1324 cont = dialog.Update(i, "Only a half left (very long message)!");
9726da4f
VZ
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
0e528b99 1342#endif // wxUSE_SPINBTN
e380f72b 1343
2cb21a45
VZ
1344MyPanel::~MyPanel()
1345{
29e7e51a
VZ
1346 //wxLog::RemoveTraceMask(_T("focus"));
1347 delete wxLog::SetActiveTarget(m_logTargetOld);
1348
ec9f7884 1349 delete m_notebook->GetImageList();
2cb21a45
VZ
1350}
1351
1c005ff7
RR
1352//----------------------------------------------------------------------
1353// MyFrame
1354//----------------------------------------------------------------------
1355
1356BEGIN_EVENT_TABLE(MyFrame, wxFrame)
3e2dd3db
VZ
1357 EVT_MENU(CONTROLS_QUIT, MyFrame::OnQuit)
1358 EVT_MENU(CONTROLS_ABOUT, MyFrame::OnAbout)
1359 EVT_MENU(CONTROLS_CLEAR_LOG, MyFrame::OnClearLog)
16f6dfd8 1360#if wxUSE_TOOLTIPS
3e2dd3db
VZ
1361 EVT_MENU(CONTROLS_SET_TOOLTIP_DELAY, MyFrame::OnSetTooltipDelay)
1362 EVT_MENU(CONTROLS_ENABLE_TOOLTIPS, MyFrame::OnToggleTooltips)
16f6dfd8 1363#endif // wxUSE_TOOLTIPS
87a1e308 1364
3e2dd3db 1365 EVT_MENU(CONTROLS_ENABLE_ALL, MyFrame::OnEnableAll)
87a1e308
VZ
1366
1367 EVT_SIZE(MyFrame::OnSize)
97206645
VZ
1368 EVT_MOVE(MyFrame::OnMove)
1369
87a1e308 1370 EVT_IDLE(MyFrame::OnIdle)
1c005ff7
RR
1371END_EVENT_TABLE()
1372
9f3362c4 1373MyFrame::MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h)
ec9f7884 1374: wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
1c005ff7 1375{
5fb9fcfc 1376 CreateStatusBar(2);
9f3362c4 1377
87a1e308 1378 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1c005ff7
RR
1379}
1380
1381void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1382{
ec9f7884 1383 Close(TRUE);
1c005ff7
RR
1384}
1385
1386void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1387{
abceee76
VZ
1388 wxBusyCursor bc;
1389
ec9f7884
VZ
1390 wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
1391 dialog.ShowModal();
1c005ff7 1392}
9f3362c4 1393
3e2dd3db
VZ
1394void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
1395{
1396 m_panel->m_text->Clear();
1397}
1398
16f6dfd8
VZ
1399#if wxUSE_TOOLTIPS
1400void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1401{
1402 static long s_delay = 5000;
1403
1404 wxString delay;
f70d5829 1405 delay.Printf( _T("%ld"), s_delay);
16f6dfd8
VZ
1406
1407 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
ec9f7884
VZ
1408 "Set tooltip delay",
1409 delay,
1410 this);
16f6dfd8
VZ
1411 if ( !delay )
1412 return; // cancelled
1413
f70d5829 1414 wxSscanf(delay, _T("%ld"), &s_delay);
16f6dfd8
VZ
1415
1416 wxToolTip::SetDelay(s_delay);
1417
f70d5829 1418 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
16f6dfd8
VZ
1419}
1420
1421void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1422{
1423 static bool s_enabled = TRUE;
1424
1425 s_enabled = !s_enabled;
1426
1427 wxToolTip::Enable(s_enabled);
1428
f70d5829 1429 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
16f6dfd8
VZ
1430}
1431#endif // tooltips
1432
87a1e308
VZ
1433void 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
97206645
VZ
1441void MyFrame::OnMove( wxMoveEvent& event )
1442{
1443 UpdateStatusBar(event.GetPosition(), GetSize());
1444
1445 event.Skip();
1446}
1447
5fb9fcfc
VZ
1448void MyFrame::OnSize( wxSizeEvent& event )
1449{
97206645 1450 UpdateStatusBar(GetPosition(), event.GetSize());
5fb9fcfc
VZ
1451
1452 event.Skip();
1453}
1454
9f3362c4
VZ
1455void 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;
f70d5829 1465 msg.Printf(
9f3362c4 1466#ifdef __WXMSW__
29e7e51a 1467 _T("Focus: %s, HWND = %08x"),
f70d5829 1468#else
29e7e51a 1469 _T("Focus: %s"),
f70d5829 1470#endif
29e7e51a 1471 s_windowFocus->GetClassInfo()->GetClassName()
9f3362c4 1472#ifdef __WXMSW__
ec9f7884 1473 , s_windowFocus->GetHWND()
f70d5829 1474#endif
9f3362c4
VZ
1475 );
1476
1477 SetStatusText(msg);
1478 }
341c92a8 1479}
6c8a980f 1480
f6bcfd97
BP
1481void 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
1491void 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
1501void MyComboBox::OnKeyUp(wxKeyEvent& event)
1502{
1503 wxLogMessage(_T("MyComboBox::OnKeyUp"));
1504
1505 event.Skip();
1506}
1507
4acb6ca6 1508static void SetControlClientData(const wxChar *name,
6c8a980f
VZ
1509 wxControlWithItems *control)
1510{
1511 size_t count = control->GetCount();
1512 for ( size_t n = 0; n < count; n++ )
1513 {
1514 wxString s;
4acb6ca6 1515 s.Printf(wxT("%s client data for '%s'"),
6c8a980f
VZ
1516 name, control->GetString(n).c_str());
1517
1518 control->SetClientObject(n, new wxStringClientData(s));
1519 }
1520}