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 // Copyright: (c) 2001 Vadim Zeitlin
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // ============================================================================
12 // declarations
13 // ============================================================================
14
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18
19 // for compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
21
22
23 #if wxUSE_COMBOBOX
24
25 // for all others, include the necessary headers
26 #ifndef WX_PRECOMP
27 #include "wx/log.h"
28
29 #include "wx/bitmap.h"
30 #include "wx/button.h"
31 #include "wx/checkbox.h"
32 #include "wx/combobox.h"
33 #include "wx/radiobox.h"
34 #include "wx/statbox.h"
35 #include "wx/textctrl.h"
36 #endif
37
38 #include "wx/sizer.h"
39
40 #include "itemcontainer.h"
41 #include "widgets.h"
42 #include "icons/combobox.xpm"
43
44 // ----------------------------------------------------------------------------
45 // constants
46 // ----------------------------------------------------------------------------
47
48 // control ids
49 enum
50 {
51 ComboPage_Reset = wxID_HIGHEST,
52 ComboPage_Popup,
53 ComboPage_Dismiss,
54 ComboPage_SetCurrent,
55 ComboPage_CurText,
56 ComboPage_InsertionPointText,
57 ComboPage_Insert,
58 ComboPage_InsertText,
59 ComboPage_Add,
60 ComboPage_AddText,
61 ComboPage_SetFirst,
62 ComboPage_SetFirstText,
63 ComboPage_AddSeveral,
64 ComboPage_AddMany,
65 ComboPage_Clear,
66 ComboPage_Change,
67 ComboPage_ChangeText,
68 ComboPage_Delete,
69 ComboPage_DeleteText,
70 ComboPage_DeleteSel,
71 ComboPage_SetValue,
72 ComboPage_SetValueText,
73 ComboPage_Combo,
74 ComboPage_ContainerTests,
75 ComboPage_Dynamic
76 };
77
78 // kinds of comboboxes
79 enum
80 {
81 ComboKind_Default,
82 ComboKind_Simple,
83 ComboKind_DropDown
84 };
85
86 // ----------------------------------------------------------------------------
87 // ComboboxWidgetsPage
88 // ----------------------------------------------------------------------------
89
90 class ComboboxWidgetsPage : public ItemContainerWidgetsPage
91 {
92 public:
93 ComboboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist);
94
GetWidget() const95 virtual wxWindow *GetWidget() const wxOVERRIDE { return m_combobox; }
GetTextEntry() const96 virtual wxTextEntryBase *GetTextEntry() const wxOVERRIDE { return m_combobox; }
GetContainer() const97 virtual wxItemContainer* GetContainer() const wxOVERRIDE { return m_combobox; }
RecreateWidget()98 virtual void RecreateWidget() wxOVERRIDE { CreateCombo(); }
99
100 // lazy creation of the content
101 virtual void CreateContent() wxOVERRIDE;
102
103 protected:
104 // event handlers
105 void OnButtonReset(wxCommandEvent& event);
OnButtonPopup(wxCommandEvent &)106 void OnButtonPopup(wxCommandEvent&) { m_combobox->Popup(); }
OnButtonDismiss(wxCommandEvent &)107 void OnButtonDismiss(wxCommandEvent&) { m_combobox->Dismiss(); }
108 void OnButtonChange(wxCommandEvent& event);
109 void OnButtonDelete(wxCommandEvent& event);
110 void OnButtonDeleteSel(wxCommandEvent& event);
111 void OnButtonClear(wxCommandEvent& event);
112 void OnButtonInsert(wxCommandEvent &event);
113 void OnButtonAdd(wxCommandEvent& event);
114 void OnButtonSetFirst(wxCommandEvent& event);
115 void OnButtonAddSeveral(wxCommandEvent& event);
116 void OnButtonAddMany(wxCommandEvent& event);
117 void OnButtonSetValue(wxCommandEvent& event);
118 void OnButtonSetCurrent(wxCommandEvent& event);
119
120 void OnDropdown(wxCommandEvent& event);
121 void OnCloseup(wxCommandEvent& event);
122 void OnPopup(wxCommandEvent &event);
123 void OnDismiss(wxCommandEvent &event);
124 void OnComboBox(wxCommandEvent& event);
125 void OnComboText(wxCommandEvent& event);
126 void OnComboTextPasted(wxClipboardTextEvent& event);
127
128 void OnCheckOrRadioBox(wxCommandEvent& event);
129
130 void OnUpdateUIInsertionPointText(wxUpdateUIEvent& event);
131
132 void OnUpdateUIInsert(wxUpdateUIEvent& event);
133 void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
134 void OnUpdateUIClearButton(wxUpdateUIEvent& event);
135 void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
136 void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
137 void OnUpdateUIResetButton(wxUpdateUIEvent& event);
138 void OnUpdateUISetCurrent(wxUpdateUIEvent& event);
139
140 // reset the combobox parameters
141 void Reset();
142
143 // (re)create the combobox
144 void CreateCombo();
145
146 // the controls
147 // ------------
148
149 // the sel mode radiobox
150 wxRadioBox *m_radioKind;
151
152 // the checkboxes for styles
153 wxCheckBox *m_chkSort,
154 *m_chkReadonly,
155 *m_chkProcessEnter;
156
157 // the combobox itself and the sizer it is in
158 wxComboBox *m_combobox, *m_combobox1;
159 wxSizer *m_sizerCombo;
160
161 // the text entries for "Add/change string" and "Delete" buttons
162 wxTextCtrl *m_textInsert,
163 *m_textAdd,
164 *m_textSetFirst,
165 *m_textChange,
166 *m_textSetValue,
167 *m_textDelete,
168 *m_textCur;
169
170 private:
171 wxDECLARE_EVENT_TABLE();
172 DECLARE_WIDGETS_PAGE(ComboboxWidgetsPage)
173 };
174
175 // ----------------------------------------------------------------------------
176 // event tables
177 // ----------------------------------------------------------------------------
178
179 wxBEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage)
180 EVT_BUTTON(ComboPage_Reset, ComboboxWidgetsPage::OnButtonReset)
181 EVT_BUTTON(ComboPage_Popup, ComboboxWidgetsPage::OnButtonPopup)
182 EVT_BUTTON(ComboPage_Dismiss, ComboboxWidgetsPage::OnButtonDismiss)
183 EVT_BUTTON(ComboPage_Change, ComboboxWidgetsPage::OnButtonChange)
184 EVT_BUTTON(ComboPage_Delete, ComboboxWidgetsPage::OnButtonDelete)
185 EVT_BUTTON(ComboPage_DeleteSel, ComboboxWidgetsPage::OnButtonDeleteSel)
186 EVT_BUTTON(ComboPage_Clear, ComboboxWidgetsPage::OnButtonClear)
187 EVT_BUTTON(ComboPage_Insert, ComboboxWidgetsPage::OnButtonInsert)
188 EVT_BUTTON(ComboPage_Add, ComboboxWidgetsPage::OnButtonAdd)
189 EVT_BUTTON(ComboPage_SetFirst, ComboboxWidgetsPage::OnButtonSetFirst)
190 EVT_BUTTON(ComboPage_AddSeveral, ComboboxWidgetsPage::OnButtonAddSeveral)
191 EVT_BUTTON(ComboPage_AddMany, ComboboxWidgetsPage::OnButtonAddMany)
192 EVT_BUTTON(ComboPage_SetValue, ComboboxWidgetsPage::OnButtonSetValue)
193 EVT_BUTTON(ComboPage_SetCurrent, ComboboxWidgetsPage::OnButtonSetCurrent)
194 EVT_BUTTON(ComboPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer)
195
196 EVT_TEXT_ENTER(ComboPage_InsertText, ComboboxWidgetsPage::OnButtonInsert)
197 EVT_TEXT_ENTER(ComboPage_AddText, ComboboxWidgetsPage::OnButtonAdd)
198 EVT_TEXT_ENTER(ComboPage_DeleteText, ComboboxWidgetsPage::OnButtonDelete)
199
200 EVT_UPDATE_UI(ComboPage_InsertionPointText, ComboboxWidgetsPage::OnUpdateUIInsertionPointText)
201
202 EVT_UPDATE_UI(ComboPage_Reset, ComboboxWidgetsPage::OnUpdateUIResetButton)
203 EVT_UPDATE_UI(ComboPage_Insert, ComboboxWidgetsPage::OnUpdateUIInsert)
204 EVT_UPDATE_UI(ComboPage_AddSeveral, ComboboxWidgetsPage::OnUpdateUIAddSeveral)
205 EVT_UPDATE_UI(ComboPage_Clear, ComboboxWidgetsPage::OnUpdateUIClearButton)
206 EVT_UPDATE_UI(ComboPage_DeleteText, ComboboxWidgetsPage::OnUpdateUIClearButton)
207 EVT_UPDATE_UI(ComboPage_Delete, ComboboxWidgetsPage::OnUpdateUIDeleteButton)
208 EVT_UPDATE_UI(ComboPage_Change, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
209 EVT_UPDATE_UI(ComboPage_ChangeText, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
210 EVT_UPDATE_UI(ComboPage_DeleteSel, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton)
211 EVT_UPDATE_UI(ComboPage_SetCurrent, ComboboxWidgetsPage::OnUpdateUISetCurrent)
212
213 EVT_COMBOBOX(ComboPage_Combo, ComboboxWidgetsPage::OnComboBox)
214 EVT_COMBOBOX_DROPDOWN(ComboPage_Combo, ComboboxWidgetsPage::OnDropdown)
215 EVT_COMBOBOX_CLOSEUP(ComboPage_Combo, ComboboxWidgetsPage::OnCloseup)
216 EVT_TEXT(ComboPage_Combo, ComboboxWidgetsPage::OnComboText)
217 EVT_TEXT_ENTER(ComboPage_Combo, ComboboxWidgetsPage::OnComboText)
218 EVT_TEXT_PASTE(ComboPage_Combo, ComboboxWidgetsPage::OnComboTextPasted)
219
220 EVT_CHECKBOX(wxID_ANY, ComboboxWidgetsPage::OnCheckOrRadioBox)
221 EVT_RADIOBOX(wxID_ANY, ComboboxWidgetsPage::OnCheckOrRadioBox)
222 wxEND_EVENT_TABLE()
223
224 // ============================================================================
225 // implementation
226 // ============================================================================
227
228 #if defined(__WXUNIVERSAL__)
229 #define FAMILY_CTRLS UNIVERSAL_CTRLS
230 #else
231 #define FAMILY_CTRLS NATIVE_CTRLS
232 #endif
233
234 IMPLEMENT_WIDGETS_PAGE(ComboboxWidgetsPage, "Combobox",
235 FAMILY_CTRLS | WITH_ITEMS_CTRLS | COMBO_CTRLS
236 );
237
ComboboxWidgetsPage(WidgetsBookCtrl * book,wxImageList * imaglist)238 ComboboxWidgetsPage::ComboboxWidgetsPage(WidgetsBookCtrl *book,
239 wxImageList *imaglist)
240 : ItemContainerWidgetsPage(book, imaglist, combobox_xpm)
241 {
242 // init everything
243 m_chkSort =
244 m_chkReadonly =
245 m_chkProcessEnter = (wxCheckBox *)NULL;
246
247 m_combobox = (wxComboBox *)NULL;
248 m_sizerCombo = (wxSizer *)NULL;
249 }
250
CreateContent()251 void ComboboxWidgetsPage::CreateContent()
252 {
253 /*
254 What we create here is a frame having 3 panes: style pane is the
255 leftmost one, in the middle the pane with buttons allowing to perform
256 miscellaneous combobox operations and the pane containing the combobox
257 itself to the right
258 */
259 wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
260
261 // upper left pane
262
263 // should be in sync with ComboKind_XXX values
264 static const wxString kinds[] =
265 {
266 "default",
267 "simple",
268 "drop down",
269 };
270
271 m_radioKind = new wxRadioBox(this, wxID_ANY, "Combobox &kind:",
272 wxDefaultPosition, wxDefaultSize,
273 WXSIZEOF(kinds), kinds,
274 1, wxRA_SPECIFY_COLS);
275
276 wxSizer *sizerLeftTop = new wxStaticBoxSizer(wxVERTICAL, this, "&Set style");
277
278 m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeftTop, "&Sort items");
279 m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeftTop, "&Read only");
280 m_chkProcessEnter = CreateCheckBoxAndAddToSizer(sizerLeftTop, "Process &Enter");
281
282 sizerLeftTop->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
283 sizerLeftTop->Add(m_radioKind, 0, wxGROW | wxALL, 5);
284
285 wxButton *btn = new wxButton(this, ComboPage_Reset, "&Reset");
286 sizerLeftTop->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
287
288 // lower left pane
289 wxSizer *sizerLeftBottom = new wxStaticBoxSizer(wxVERTICAL, this, "&Popup");
290 sizerLeftBottom->Add(new wxButton(this, ComboPage_Popup, "&Show"),
291 wxSizerFlags().Border().Centre());
292 sizerLeftBottom->Add(new wxButton(this, ComboPage_Dismiss, "&Hide"),
293 wxSizerFlags().Border().Centre());
294
295
296 wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
297 sizerLeft->Add(sizerLeftTop);
298 sizerLeft->AddSpacer(10);
299 sizerLeft->Add(sizerLeftBottom, wxSizerFlags().Expand());
300
301 // middle pane
302 wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,
303 "&Change combobox contents");
304 wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL);
305
306 wxSizer *sizerRow;
307
308 sizerRow = CreateSizerWithTextAndButton(ComboPage_SetCurrent,
309 "Current &selection",
310 ComboPage_CurText,
311 &m_textCur);
312
313 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
314
315 wxTextCtrl *text;
316 sizerRow = CreateSizerWithTextAndLabel("Insertion Point",
317 ComboPage_InsertionPointText,
318 &text);
319 text->SetEditable(false);
320
321 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
322
323 sizerRow = CreateSizerWithTextAndButton(ComboPage_Insert,
324 "&Insert this string",
325 ComboPage_InsertText,
326 &m_textInsert);
327 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
328
329 sizerRow = CreateSizerWithTextAndButton(ComboPage_Add,
330 "&Add this string",
331 ComboPage_AddText,
332 &m_textAdd);
333 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
334
335 sizerRow = CreateSizerWithTextAndButton(ComboPage_SetFirst,
336 "Change &1st string",
337 ComboPage_SetFirstText,
338 &m_textSetFirst);
339 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
340
341 btn = new wxButton(this, ComboPage_AddSeveral, "&Append a few strings");
342 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
343
344 btn = new wxButton(this, ComboPage_AddMany, "Append &many strings");
345 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
346
347 sizerRow = CreateSizerWithTextAndButton(ComboPage_Change,
348 "C&hange current",
349 ComboPage_ChangeText,
350 &m_textChange);
351 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
352
353 sizerRow = CreateSizerWithTextAndButton(ComboPage_Delete,
354 "&Delete this item",
355 ComboPage_DeleteText,
356 &m_textDelete);
357 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
358
359 btn = new wxButton(this, ComboPage_DeleteSel, "Delete &selection");
360 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
361
362 btn = new wxButton(this, ComboPage_Clear, "&Clear");
363 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
364
365 sizerRow = CreateSizerWithTextAndButton(ComboPage_SetValue,
366 "SetValue",
367 ComboPage_SetValueText,
368 &m_textSetValue);
369 sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
370
371 btn = new wxButton(this, ComboPage_ContainerTests, "Run &tests");
372 sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5);
373
374
375
376 // right pane
377 wxSizer *sizerRight = new wxBoxSizer(wxVERTICAL);
378 m_combobox = new wxComboBox(this, ComboPage_Combo, wxEmptyString,
379 wxDefaultPosition, wxDefaultSize,
380 0, NULL,
381 0);
382 sizerRight->Add(m_combobox, 0, wxGROW | wxALL, 5);
383 m_combobox1 = new wxComboBox( this, ComboPage_Dynamic );
384 m_combobox1->Append( "Dynamic ComboBox Test - Click me!" );
385 m_combobox1->SetSelection( 0 );
386 sizerRight->Add( 20, 20, 0, wxEXPAND, 0 );
387 sizerRight->Add( m_combobox1, 0, wxGROW | wxALL, 5 );
388 m_combobox1->Bind( wxEVT_COMBOBOX_DROPDOWN, &ComboboxWidgetsPage::OnPopup, this );
389 m_combobox1->Bind( wxEVT_COMBOBOX_CLOSEUP, &ComboboxWidgetsPage::OnDismiss, this );
390 sizerRight->SetMinSize(150, 0);
391 m_sizerCombo = sizerRight; // save it to modify it later
392
393 // the 3 panes panes compose the window
394 sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10);
395 sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10);
396 sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10);
397
398 // final initializations
399 Reset();
400
401 SetSizer(sizerTop);
402 }
403
404 // ----------------------------------------------------------------------------
405 // operations
406 // ----------------------------------------------------------------------------
407
Reset()408 void ComboboxWidgetsPage::Reset()
409 {
410 m_chkSort->SetValue(false);
411 m_chkReadonly->SetValue(false);
412 m_chkProcessEnter->SetValue(false);
413 }
414
CreateCombo()415 void ComboboxWidgetsPage::CreateCombo()
416 {
417 wxCHECK_RET( m_combobox, "No combo box exists" );
418
419 int flags = GetAttrs().m_defaultFlags;
420
421 if ( m_chkSort->GetValue() )
422 flags |= wxCB_SORT;
423 if ( m_chkReadonly->GetValue() )
424 flags |= wxCB_READONLY;
425 if ( m_chkProcessEnter->GetValue() )
426 flags |= wxTE_PROCESS_ENTER;
427
428
429 switch ( m_radioKind->GetSelection() )
430 {
431 default:
432 wxFAIL_MSG( "unknown combo kind" );
433 wxFALLTHROUGH;
434
435 case ComboKind_Default:
436 break;
437
438 case ComboKind_Simple:
439 flags |= wxCB_SIMPLE;
440 break;
441
442 case ComboKind_DropDown:
443 flags |= wxCB_DROPDOWN;
444 break;
445 }
446
447 wxArrayString items;
448 unsigned int count = m_combobox->GetCount();
449 for ( unsigned int n = 0; n < count; n++ )
450 {
451 items.Add(m_combobox->GetString(n));
452 }
453 int selItem = m_combobox->GetSelection();
454
455 wxComboBox* newCb = new wxComboBox(this, wxID_ANY, wxEmptyString,
456 wxDefaultPosition, wxDefaultSize,
457 items,
458 flags);
459
460 if ( selItem != wxNOT_FOUND )
461 newCb->SetSelection(selItem);
462
463 m_sizerCombo->Replace(m_combobox, newCb);
464 m_sizerCombo->Layout();
465
466 delete m_combobox;
467 m_combobox = newCb;
468 m_combobox->SetId(ComboPage_Combo);
469 }
470
471 // ----------------------------------------------------------------------------
472 // event handlers
473 // ----------------------------------------------------------------------------
474
OnButtonReset(wxCommandEvent & WXUNUSED (event))475 void ComboboxWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event))
476 {
477 Reset();
478
479 CreateCombo();
480 }
481
OnButtonChange(wxCommandEvent & WXUNUSED (event))482 void ComboboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
483 {
484 int sel = m_combobox->GetSelection();
485 if ( sel != wxNOT_FOUND )
486 {
487 m_combobox->SetString(sel, m_textChange->GetValue());
488 }
489 }
490
OnButtonDelete(wxCommandEvent & WXUNUSED (event))491 void ComboboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
492 {
493 unsigned long n;
494 if ( !m_textDelete->GetValue().ToULong(&n) ||
495 (n >= m_combobox->GetCount()) )
496 {
497 return;
498 }
499
500 m_combobox->Delete(n);
501 }
502
OnButtonDeleteSel(wxCommandEvent & WXUNUSED (event))503 void ComboboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event))
504 {
505 int sel = m_combobox->GetSelection();
506 if ( sel != wxNOT_FOUND )
507 {
508 m_combobox->Delete(sel);
509 }
510 }
511
OnButtonSetValue(wxCommandEvent & WXUNUSED (event))512 void ComboboxWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event))
513 {
514 wxString value = m_textSetValue->GetValue();
515 m_combobox->SetValue( value );
516 }
517
OnButtonClear(wxCommandEvent & WXUNUSED (event))518 void ComboboxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event))
519 {
520 m_combobox->Clear();
521 }
522
OnButtonInsert(wxCommandEvent & WXUNUSED (event))523 void ComboboxWidgetsPage::OnButtonInsert(wxCommandEvent& WXUNUSED(event))
524 {
525 static unsigned int s_item = 0;
526
527 wxString s = m_textInsert->GetValue();
528 if ( !m_textInsert->IsModified() )
529 {
530 // update the default string
531 m_textInsert->SetValue(wxString::Format("test item %u", ++s_item));
532 }
533
534 if (m_combobox->GetSelection() >= 0)
535 m_combobox->Insert(s, m_combobox->GetSelection());
536 }
537
OnButtonAdd(wxCommandEvent & WXUNUSED (event))538 void ComboboxWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event))
539 {
540 static unsigned int s_item = 0;
541
542 wxString s = m_textAdd->GetValue();
543 if ( !m_textAdd->IsModified() )
544 {
545 // update the default string
546 m_textAdd->SetValue(wxString::Format("test item %u", ++s_item));
547 }
548
549 m_combobox->Append(s);
550 }
551
OnButtonSetFirst(wxCommandEvent & WXUNUSED (event))552 void ComboboxWidgetsPage::OnButtonSetFirst(wxCommandEvent& WXUNUSED(event))
553 {
554 if ( m_combobox->IsListEmpty() )
555 {
556 wxLogWarning("No string to change.");
557 return;
558 }
559
560 m_combobox->SetString(0, m_textSetFirst->GetValue());
561 }
562
OnButtonAddMany(wxCommandEvent & WXUNUSED (event))563 void ComboboxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event))
564 {
565 // "many" means 1000 here
566 for ( unsigned int n = 0; n < 1000; n++ )
567 {
568 m_combobox->Append(wxString::Format("item #%u", n));
569 }
570 }
571
OnButtonSetCurrent(wxCommandEvent & WXUNUSED (event))572 void ComboboxWidgetsPage::OnButtonSetCurrent(wxCommandEvent& WXUNUSED(event))
573 {
574 long n;
575 if ( !m_textCur->GetValue().ToLong(&n) )
576 return;
577
578 m_combobox->SetSelection(n);
579 }
580
OnButtonAddSeveral(wxCommandEvent & WXUNUSED (event))581 void ComboboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event))
582 {
583 m_combobox->Append("First");
584 m_combobox->Append("another one");
585 m_combobox->Append("and the last (very very very very very very very very very very long) one");
586 }
587
OnUpdateUIInsertionPointText(wxUpdateUIEvent & event)588 void ComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent& event)
589 {
590 if (m_combobox)
591 event.SetText( wxString::Format("%ld", m_combobox->GetInsertionPoint()) );
592 }
593
OnUpdateUIResetButton(wxUpdateUIEvent & event)594 void ComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
595 {
596 event.Enable( m_chkSort->GetValue() ||
597 m_chkReadonly->GetValue() ||
598 m_chkProcessEnter->GetValue() );
599 }
600
OnUpdateUIInsert(wxUpdateUIEvent & event)601 void ComboboxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent& event)
602 {
603 if (m_combobox)
604 {
605 bool enable = !(m_combobox->GetWindowStyle() & wxCB_SORT) &&
606 (m_combobox->GetSelection() >= 0);
607
608 event.Enable(enable);
609 }
610 }
611
OnUpdateUIDeleteButton(wxUpdateUIEvent & event)612 void ComboboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
613 {
614 if (m_combobox)
615 {
616 unsigned long n;
617 event.Enable(m_textDelete->GetValue().ToULong(&n) &&
618 (n < (unsigned)m_combobox->GetCount()));
619 }
620 }
621
OnUpdateUIDeleteSelButton(wxUpdateUIEvent & event)622 void ComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
623 {
624 if (m_combobox)
625 event.Enable(m_combobox->GetSelection() != wxNOT_FOUND);
626 }
627
OnUpdateUIClearButton(wxUpdateUIEvent & event)628 void ComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent& event)
629 {
630 if (m_combobox)
631 event.Enable(m_combobox->GetCount() != 0);
632 }
633
OnUpdateUIAddSeveral(wxUpdateUIEvent & event)634 void ComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event)
635 {
636 if (m_combobox)
637 event.Enable(!(m_combobox->GetWindowStyle() & wxCB_SORT));
638 }
639
OnUpdateUISetCurrent(wxUpdateUIEvent & event)640 void ComboboxWidgetsPage::OnUpdateUISetCurrent(wxUpdateUIEvent& event)
641 {
642 long n;
643 event.Enable( m_textCur->GetValue().ToLong(&n) &&
644 (n == wxNOT_FOUND ||
645 (n >= 0 && (unsigned)n < m_combobox->GetCount())) );
646 }
647
OnComboText(wxCommandEvent & event)648 void ComboboxWidgetsPage::OnComboText(wxCommandEvent& event)
649 {
650 if (!m_combobox)
651 return;
652
653 wxString s = event.GetString();
654
655 wxASSERT_MSG( s == m_combobox->GetValue(),
656 "event and combobox values should be the same" );
657
658 if (event.GetEventType() == wxEVT_TEXT_ENTER)
659 {
660 wxLogMessage("Combobox enter pressed (now '%s')", s);
661 }
662 else
663 {
664 wxLogMessage("Combobox text changed (now '%s')", s);
665 }
666 }
667
OnComboTextPasted(wxClipboardTextEvent & event)668 void ComboboxWidgetsPage::OnComboTextPasted(wxClipboardTextEvent& event)
669 {
670 wxLogMessage("Text pasted from clipboard.");
671 event.Skip();
672 }
673
OnComboBox(wxCommandEvent & event)674 void ComboboxWidgetsPage::OnComboBox(wxCommandEvent& event)
675 {
676 long sel = event.GetInt();
677 const wxString selstr = wxString::Format("%ld", sel);
678 m_textDelete->SetValue(selstr);
679 m_textCur->SetValue(selstr);
680
681 wxLogMessage("Combobox item %ld selected", sel);
682
683 wxLogMessage("Combobox GetValue(): %s", m_combobox->GetValue() );
684
685 if ( event.GetString() != m_combobox->GetValue() )
686 {
687 wxLogMessage("ERROR: Event has different string \"%s\"",
688 event.GetString());
689 }
690 }
691
OnCheckOrRadioBox(wxCommandEvent & WXUNUSED (event))692 void ComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event))
693 {
694 CreateCombo();
695 }
696
OnDropdown(wxCommandEvent & WXUNUSED (event))697 void ComboboxWidgetsPage::OnDropdown(wxCommandEvent& WXUNUSED(event))
698 {
699 wxLogMessage("Combobox dropped down");
700 }
701
OnCloseup(wxCommandEvent & WXUNUSED (event))702 void ComboboxWidgetsPage::OnCloseup(wxCommandEvent& WXUNUSED(event))
703 {
704 wxLogMessage("Combobox closed up");
705 }
706
OnPopup(wxCommandEvent & WXUNUSED (event))707 void ComboboxWidgetsPage::OnPopup(wxCommandEvent &WXUNUSED(event))
708 {
709 m_combobox1->Clear();
710 m_combobox1->Append( "Selection 1" );
711 m_combobox1->Append( "Selection 2" );
712 m_combobox1->Append( "Selection 3" );
713 wxLogMessage("The number of items is %d", m_combobox1->GetCount());
714 }
715
OnDismiss(wxCommandEvent & WXUNUSED (event))716 void ComboboxWidgetsPage::OnDismiss(wxCommandEvent &WXUNUSED(event))
717 {
718 if ( m_combobox1->GetSelection() == wxNOT_FOUND )
719 {
720 m_combobox1->Clear();
721 m_combobox1->Append( "Dynamic ComboBox Test - Click me!" );
722 m_combobox1->SetSelection( 0 );
723 }
724 wxLogMessage("The number of items is %d", m_combobox1->GetCount());
725 }
726
727 #endif // wxUSE_COMBOBOX
728