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