]> git.saurik.com Git - wxWidgets.git/blob - samples/widgets/combobox.cpp
more wxFD_XXX renamings (patch 1488371)
[wxWidgets.git] / samples / widgets / combobox.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets Widgets Sample
3 // Name: combobox.cpp
4 // Purpose: Part of the widgets sample showing wxComboBox
5 // Author: Vadim Zeitlin
6 // Created: 27.03.01
7 // Id: $Id$
8 // Copyright: (c) 2001 Vadim Zeitlin
9 // License: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 // for compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
22
23 #ifdef __BORLANDC__
24 #pragma hdrstop
25 #endif
26
27 #if wxUSE_COMBOBOX
28
29 // for all others, include the necessary headers
30 #ifndef WX_PRECOMP
31 #include "wx/log.h"
32
33 #include "wx/bitmap.h"
34 #include "wx/button.h"
35 #include "wx/checkbox.h"
36 #include "wx/combobox.h"
37 #include "wx/radiobox.h"
38 #include "wx/statbox.h"
39 #include "wx/textctrl.h"
40 #endif
41
42 #include "wx/sizer.h"
43
44 #include "widgets.h"
45 #if 1
46 #include "icons/combobox.xpm"
47
48 // ----------------------------------------------------------------------------
49 // constants
50 // ----------------------------------------------------------------------------
51
52 // control ids
53 enum
54 {
55 ComboPage_Reset = wxID_HIGHEST,
56 ComboPage_CurText,
57 ComboPage_InsertionPointText,
58 ComboPage_Insert,
59 ComboPage_InsertText,
60 ComboPage_Add,
61 ComboPage_AddText,
62 ComboPage_AddSeveral,
63 ComboPage_AddMany,
64 ComboPage_Clear,
65 ComboPage_Change,
66 ComboPage_ChangeText,
67 ComboPage_Delete,
68 ComboPage_DeleteText,
69 ComboPage_DeleteSel,
70 ComboPage_Combo
71 };
72
73 // kinds of comboboxes
74 enum
75 {
76 ComboKind_Default,
77 ComboKind_Simple,
78 ComboKind_DropDown
79 };
80
81 // ----------------------------------------------------------------------------
82 // ComboboxWidgetsPage
83 // ----------------------------------------------------------------------------
84
85 class ComboboxWidgetsPage : public WidgetsPage
86 {
87 public:
88 ComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
89
90 virtual wxControl *GetWidget() const { return m_combobox; }
91 virtual void RecreateWidget() { CreateCombo(); }
92
93 protected:
94 // event handlers
95 void OnButtonReset(wxCommandEvent& event);
96 void OnButtonChange(wxCommandEvent& event);
97 void OnButtonDelete(wxCommandEvent& event);
98 void OnButtonDeleteSel(wxCommandEvent& event);
99 void OnButtonClear(wxCommandEvent& event);
100 void OnButtonInsert(wxCommandEvent &event);
101 void OnButtonAdd(wxCommandEvent& event);
102 void OnButtonAddSeveral(wxCommandEvent& event);
103 void OnButtonAddMany(wxCommandEvent& event);
104
105 void OnComboBox(wxCommandEvent& event);
106 void OnComboText(wxCommandEvent& event);
107
108 void OnCheckOrRadioBox(wxCommandEvent& event);
109
110 void OnUpdateUICurText(wxUpdateUIEvent& event);
111 void OnUpdateUIInsertionPointText(wxUpdateUIEvent& event);
112
113 void OnUpdateUIInsert(wxUpdateUIEvent& event);
114 void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
115 void OnUpdateUIClearButton(wxUpdateUIEvent& event);
116 void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
117 void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
118 void OnUpdateUIResetButton(wxUpdateUIEvent& event);
119
120 // reset the combobox parameters
121 void Reset();
122
123 // (re)create the combobox
124 void CreateCombo();
125
126 // the controls
127 // ------------
128
129 // the sel mode radiobox
130 wxRadioBox *m_radioKind;
131
132 // the checkboxes for styles
133 wxCheckBox *m_chkSort,
134 *m_chkReadonly;
135
136 // the combobox itself and the sizer it is in
137 wxComboBox *m_combobox;
138 wxSizer *m_sizerCombo;
139
140 // the text entries for "Add/change string" and "Delete" buttons
141 wxTextCtrl *m_textInsert,
142 *m_textAdd,
143 *m_textChange,
144 *m_textDelete;
145
146 private:
147 DECLARE_EVENT_TABLE()
148 DECLARE_WIDGETS_PAGE(ComboboxWidgetsPage)
149 };
150
151 // ----------------------------------------------------------------------------
152 // event tables
153 // ----------------------------------------------------------------------------
154
155 BEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage)
156 EVT_BUTTON(ComboPage_Reset, ComboboxWidgetsPage::OnButtonReset)
157 EVT_BUTTON(ComboPage_Change, ComboboxWidgetsPage::OnButtonChange)
158 EVT_BUTTON(ComboPage_Delete, ComboboxWidgetsPage::OnButtonDelete)
159 EVT_BUTTON(ComboPage_DeleteSel, ComboboxWidgetsPage::OnButtonDeleteSel)
160 EVT_BUTTON(ComboPage_Clear, ComboboxWidgetsPage::OnButtonClear)
161 EVT_BUTTON(ComboPage_Insert, ComboboxWidgetsPage::OnButtonInsert)
162 EVT_BUTTON(ComboPage_Add, ComboboxWidgetsPage::OnButtonAdd)
163 EVT_BUTTON(ComboPage_AddSeveral, ComboboxWidgetsPage::OnButtonAddSeveral)
164 EVT_BUTTON(ComboPage_AddMany, ComboboxWidgetsPage::OnButtonAddMany)
165
166 EVT_TEXT_ENTER(ComboPage_InsertText, ComboboxWidgetsPage::OnButtonInsert)
167 EVT_TEXT_ENTER(ComboPage_AddText, ComboboxWidgetsPage::OnButtonAdd)
168 EVT_TEXT_ENTER(ComboPage_DeleteText, ComboboxWidgetsPage::OnButtonDelete)
169
170 EVT_UPDATE_UI(ComboPage_CurText, ComboboxWidgetsPage::OnUpdateUICurText)
171 EVT_UPDATE_UI(ComboPage_InsertionPointText, ComboboxWidgetsPage::OnUpdateUIInsertionPointText)
172
173 EVT_UPDATE_UI(ComboPage_Reset, ComboboxWidgetsPage::OnUpdateUIResetButton)
174 EVT_UPDATE_UI(ComboPage_Insert, ComboboxWidgetsPage::OnUpdateUIInsert)
175 EVT_UPDATE_UI(ComboPage_AddSeveral, ComboboxWidgetsPage::OnUpdateUIAddSeveral)
176 EVT_UPDATE_UI(ComboPage_Clear, ComboboxWidgetsPage::OnUpdateUIClearButton)
177 EVT_UPDATE_UI(ComboPage_DeleteText, ComboboxWidgetsPage::OnUpdateUIClearButton)
178 EVT_UPDATE_UI(ComboPage_Delete, ComboboxWidgetsPage::OnUpdateUIDeleteButton)
179 EVT_UPDATE_UI(ComboPage_Change, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
180 EVT_UPDATE_UI(ComboPage_ChangeText, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
181 EVT_UPDATE_UI(ComboPage_DeleteSel, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
182
183 EVT_COMBOBOX(ComboPage_Combo, ComboboxWidgetsPage::OnComboBox)
184 EVT_TEXT(ComboPage_Combo, ComboboxWidgetsPage::OnComboText)
185 EVT_TEXT_ENTER(ComboPage_Combo, ComboboxWidgetsPage::OnComboText)
186
187 EVT_CHECKBOX(wxID_ANY, ComboboxWidgetsPage::OnCheckOrRadioBox)
188 EVT_RADIOBOX(wxID_ANY, ComboboxWidgetsPage::OnCheckOrRadioBox)
189 END_EVENT_TABLE()
190
191 // ============================================================================
192 // implementation
193 // ============================================================================
194
195 #if defined(__WXUNIVERSAL__)
196 #define FAMILY_CTRLS UNIVERSAL_CTRLS
197 #else
198 #define FAMILY_CTRLS NATIVE_CTRLS
199 #endif
200
201 IMPLEMENT_WIDGETS_PAGE(ComboboxWidgetsPage, _T("Combobox"),
202 FAMILY_CTRLS | WITH_ITEMS_CTRLS | COMBO_CTRLS
203 );
204
205 ComboboxWidgetsPage::ComboboxWidgetsPage(WidgetsBookCtrl *book,
206 wxImageList *imaglist)
207 : WidgetsPage(book, imaglist, combobox_xpm)
208 {
209 // init everything
210 m_chkSort =
211 m_chkReadonly = (wxCheckBox *)NULL;
212
213 m_combobox = (wxComboBox *)NULL;
214 m_sizerCombo = (wxSizer *)NULL;
215
216 /*
217 What we create here is a frame having 3 panes: style pane is the
218 leftmost one, in the middle the pane with buttons allowing to perform
219 miscellaneous combobox operations and the pane containing the combobox
220 itself to the right
221 */
222 wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
223
224 // left pane
225 wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style"));
226
227 // should be in sync with ComboKind_XXX values
228 static const wxString kinds[] =
229 {
230 _T("default"),
231 _T("simple"),
232 _T("drop down"),
233 };
234
235 m_radioKind = new wxRadioBox(this, wxID_ANY, _T("Combobox &kind:"),
236 wxDefaultPosition, wxDefaultSize,
237 WXSIZEOF(kinds), kinds,
238 1, wxRA_SPECIFY_COLS);
239
240 wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
241
242 m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Sort items"));
243 m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Read only"));
244
245 sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
246 sizerLeft->Add(m_radioKind, 0, wxGROW | wxALL, 5);
247
248 wxButton *btn = new wxButton(this, ComboPage_Reset, _T("&Reset"));
249 sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
250
251 // middle pane
252 wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,
253 _T("&Change combobox contents"));
254 wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
255
256 wxSizer *sizerRow;
257
258 wxTextCtrl *text;
259 sizerRow = CreateSizerWithTextAndLabel(_T("Current selection"),
260 ComboPage_CurText,
261 &text);
262 text->SetEditable(false);
263
264 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
265
266 sizerRow = CreateSizerWithTextAndLabel(_T("Insertion Point"),
267 ComboPage_InsertionPointText,
268 &text);
269 text->SetEditable(false);
270
271 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
272
273 sizerRow = CreateSizerWithTextAndButton(ComboPage_Insert,
274 _T("&Insert this string"),
275 ComboPage_InsertText,
276 &m_textInsert);
277 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
278
279 sizerRow = CreateSizerWithTextAndButton(ComboPage_Add,
280 _T("&Add this string"),
281 ComboPage_AddText,
282 &m_textAdd);
283 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
284
285 btn = new wxButton(this, ComboPage_AddSeveral, _T("&Append a few strings"));
286 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
287
288 btn = new wxButton(this, ComboPage_AddMany, _T("Append &many strings"));
289 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
290
291 sizerRow = CreateSizerWithTextAndButton(ComboPage_Change,
292 _T("C&hange current"),
293 ComboPage_ChangeText,
294 &m_textChange);
295 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
296
297 sizerRow = CreateSizerWithTextAndButton(ComboPage_Delete,
298 _T("&Delete this item"),
299 ComboPage_DeleteText,
300 &m_textDelete);
301 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
302
303 btn = new wxButton(this, ComboPage_DeleteSel, _T("Delete &selection"));
304 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
305
306 btn = new wxButton(this, ComboPage_Clear, _T("&Clear"));
307 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
308
309 // right pane
310 wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
311 m_combobox = new wxComboBox(this, ComboPage_Combo, wxEmptyString,
312 wxDefaultPosition, wxDefaultSize,
313 0, NULL,
314 0);
315 sizerRight->Add(m_combobox, 1, wxGROW | wxALL, 5);
316 sizerRight->SetMinSize(150, 0);
317 m_sizerCombo = sizerRight; // save it to modify it later
318
319 // the 3 panes panes compose the window
320 sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
321 sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
322 sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
323
324 // final initializations
325 Reset();
326
327 SetSizer(sizerTop);
328
329 sizerTop->Fit(this);
330 }
331
332 // ----------------------------------------------------------------------------
333 // operations
334 // ----------------------------------------------------------------------------
335
336 void ComboboxWidgetsPage::Reset()
337 {
338 m_chkSort->SetValue(false);
339 m_chkReadonly->SetValue(false);
340 }
341
342 void ComboboxWidgetsPage::CreateCombo()
343 {
344 int flags = ms_defaultFlags;
345
346 if ( m_chkSort->GetValue() )
347 flags |= wxCB_SORT;
348 if ( m_chkReadonly->GetValue() )
349 flags |= wxCB_READONLY;
350
351 switch ( m_radioKind->GetSelection() )
352 {
353 default:
354 wxFAIL_MSG( _T("unknown combo kind") );
355 // fall through
356
357 case ComboKind_Default:
358 break;
359
360 case ComboKind_Simple:
361 flags |= wxCB_SIMPLE;
362 break;
363
364 case ComboKind_DropDown:
365 flags = wxCB_DROPDOWN;
366 break;
367 }
368
369 wxArrayString items;
370 if ( m_combobox )
371 {
372 unsigned int count = m_combobox->GetCount();
373 for ( unsigned int n = 0; n < count; n++ )
374 {
375 items.Add(m_combobox->GetString(n));
376 }
377
378 m_sizerCombo->Detach( m_combobox );
379 delete m_combobox;
380 }
381
382 m_combobox = new wxComboBox(this, ComboPage_Combo, wxEmptyString,
383 wxDefaultPosition, wxDefaultSize,
384 0, NULL,
385 flags);
386
387 unsigned int count = items.GetCount();
388 for ( unsigned int n = 0; n < count; n++ )
389 {
390 m_combobox->Append(items[n]);
391 }
392
393 m_sizerCombo->Add(m_combobox, 1, wxGROW | wxALL, 5);
394 m_sizerCombo->Layout();
395 }
396
397 // ----------------------------------------------------------------------------
398 // event handlers
399 // ----------------------------------------------------------------------------
400
401 void ComboboxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
402 {
403 Reset();
404
405 CreateCombo();
406 }
407
408 void ComboboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
409 {
410 int sel = m_combobox->GetSelection();
411 if ( sel != -1 )
412 {
413 #ifndef __WXGTK__
414 m_combobox->SetString(sel, m_textChange->GetValue());
415 #else
416 wxLogMessage(_T("Not implemented in wxGTK"));
417 #endif
418 }
419 }
420
421 void ComboboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
422 {
423 unsigned long n;
424 if ( !m_textDelete->GetValue().ToULong(&n) ||
425 (n >= m_combobox->GetCount()) )
426 {
427 return;
428 }
429
430 m_combobox->Delete(n);
431 }
432
433 void ComboboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
434 {
435 int sel = m_combobox->GetSelection();
436 if ( sel != wxNOT_FOUND )
437 {
438 m_combobox->Delete(sel);
439 }
440 }
441
442 void ComboboxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
443 {
444 m_combobox->Clear();
445 }
446
447 void ComboboxWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event))
448 {
449 static unsigned int s_item = 0;
450
451 wxString s = m_textInsert->GetValue();
452 if ( !m_textInsert->IsModified() )
453 {
454 // update the default string
455 m_textInsert->SetValue(wxString::Format(_T("test item %u"), ++s_item));
456 }
457
458 if (m_combobox->GetSelection() >= 0)
459 m_combobox->Insert(s, m_combobox->GetSelection());
460 }
461
462 void ComboboxWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
463 {
464 static unsigned int s_item = 0;
465
466 wxString s = m_textAdd->GetValue();
467 if ( !m_textAdd->IsModified() )
468 {
469 // update the default string
470 m_textAdd->SetValue(wxString::Format(_T("test item %u"), ++s_item));
471 }
472
473 m_combobox->Append(s);
474 }
475
476 void ComboboxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
477 {
478 // "many" means 1000 here
479 for ( unsigned int n = 0; n < 1000; n++ )
480 {
481 m_combobox->Append(wxString::Format(_T("item #%u"), n));
482 }
483 }
484
485 void ComboboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
486 {
487 m_combobox->Append(_T("First"));
488 m_combobox->Append(_T("another one"));
489 m_combobox->Append(_T("and the last (very very very very very very very very very very long) one"));
490 }
491
492 void ComboboxWidgetsPage::OnUpdateUICurText(wxUpdateUIEvent& event)
493 {
494 if (m_combobox)
495 event.SetText( wxString::Format(_T("%d"), m_combobox->GetSelection()) );
496 }
497
498 void ComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent& event)
499 {
500 if (m_combobox)
501 event.SetText( wxString::Format(_T("%ld"), m_combobox->GetInsertionPoint()) );
502 }
503
504 void ComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
505 {
506 if (m_combobox)
507 event.Enable( m_chkSort->GetValue() || m_chkReadonly->GetValue() );
508 }
509
510 void ComboboxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent& event)
511 {
512 if (m_combobox)
513 {
514 bool enable = !(m_combobox->GetWindowStyle() & wxCB_SORT) &&
515 (m_combobox->GetSelection() >= 0);
516
517 event.Enable(enable);
518 }
519 }
520
521 void ComboboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
522 {
523 if (m_combobox)
524 {
525 unsigned long n;
526 event.Enable(m_textDelete->GetValue().ToULong(&n) &&
527 (n < (unsigned)m_combobox->GetCount()));
528 }
529 }
530
531 void ComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
532 {
533 if (m_combobox)
534 event.Enable(m_combobox->GetSelection() != -1);
535 }
536
537 void ComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
538 {
539 if (m_combobox)
540 event.Enable(m_combobox->GetCount() != 0);
541 }
542
543 void ComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
544 {
545 if (m_combobox)
546 event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
547 }
548
549 void ComboboxWidgetsPage::OnComboText(wxCommandEvent& event)
550 {
551 if (!m_combobox)
552 return;
553
554 wxString s = event.GetString();
555
556 wxASSERT_MSG( s == m_combobox->GetValue(),
557 _T("event and combobox values should be the same") );
558
559 if (event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER)
560 wxLogMessage(_T("Combobox enter pressed (now '%s')"), s.c_str());
561 else
562 wxLogMessage(_T("Combobox text changed (now '%s')"), s.c_str());
563 }
564
565 void ComboboxWidgetsPage::OnComboBox(wxCommandEvent& event)
566 {
567 long sel = event.GetInt();
568 m_textDelete->SetValue(wxString::Format(_T("%ld"), sel));
569
570 wxLogMessage(_T("Combobox item %ld selected"), sel);
571
572 wxLogMessage(_T("Combobox GetValue(): %s"), m_combobox->GetValue().c_str() );
573 }
574
575 void ComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
576 {
577 CreateCombo();
578 }
579
580 #endif //wxUSE_COMBOBOX
581
582 #endif