1 /////////////////////////////////////////////////////////////////////////////
2 // Program: wxWidgets Widgets Sample
4 // Purpose: Part of the widgets sample showing wxComboBox
5 // Author: Vadim Zeitlin
8 // Copyright: (c) 2001 Vadim Zeitlin
9 // License: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // for compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
29 // for all others, include the necessary headers
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"
46 #include "icons/combobox.xpm"
48 // ----------------------------------------------------------------------------
50 // ----------------------------------------------------------------------------
55 ComboPage_Reset
= wxID_HIGHEST
,
58 ComboPage_InsertionPointText
,
74 // kinds of comboboxes
82 // ----------------------------------------------------------------------------
83 // ComboboxWidgetsPage
84 // ----------------------------------------------------------------------------
86 class ComboboxWidgetsPage
: public WidgetsPage
89 ComboboxWidgetsPage(WidgetsBookCtrl
*book
, wxImageList
*imaglist
);
91 virtual wxControl
*GetWidget() const { return m_combobox
; }
92 virtual void RecreateWidget() { CreateCombo(); }
94 // lazy creation of the content
95 virtual void CreateContent();
99 void OnButtonReset(wxCommandEvent
& event
);
100 void OnButtonChange(wxCommandEvent
& event
);
101 void OnButtonDelete(wxCommandEvent
& event
);
102 void OnButtonDeleteSel(wxCommandEvent
& event
);
103 void OnButtonClear(wxCommandEvent
& event
);
104 void OnButtonInsert(wxCommandEvent
&event
);
105 void OnButtonAdd(wxCommandEvent
& event
);
106 void OnButtonAddSeveral(wxCommandEvent
& event
);
107 void OnButtonAddMany(wxCommandEvent
& event
);
108 void OnButtonSetCurrent(wxCommandEvent
& event
);
110 void OnComboBox(wxCommandEvent
& event
);
111 void OnComboText(wxCommandEvent
& event
);
113 void OnCheckOrRadioBox(wxCommandEvent
& event
);
115 void OnUpdateUIInsertionPointText(wxUpdateUIEvent
& event
);
117 void OnUpdateUIInsert(wxUpdateUIEvent
& event
);
118 void OnUpdateUIAddSeveral(wxUpdateUIEvent
& event
);
119 void OnUpdateUIClearButton(wxUpdateUIEvent
& event
);
120 void OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
);
121 void OnUpdateUIDeleteSelButton(wxUpdateUIEvent
& event
);
122 void OnUpdateUIResetButton(wxUpdateUIEvent
& event
);
123 void OnUpdateUISetCurrent(wxUpdateUIEvent
& event
);
125 // reset the combobox parameters
128 // (re)create the combobox
134 // the sel mode radiobox
135 wxRadioBox
*m_radioKind
;
137 // the checkboxes for styles
138 wxCheckBox
*m_chkSort
,
142 // the combobox itself and the sizer it is in
143 wxComboBox
*m_combobox
;
144 wxSizer
*m_sizerCombo
;
146 // the text entries for "Add/change string" and "Delete" buttons
147 wxTextCtrl
*m_textInsert
,
154 DECLARE_EVENT_TABLE()
155 DECLARE_WIDGETS_PAGE(ComboboxWidgetsPage
)
158 // ----------------------------------------------------------------------------
160 // ----------------------------------------------------------------------------
162 BEGIN_EVENT_TABLE(ComboboxWidgetsPage
, WidgetsPage
)
163 EVT_BUTTON(ComboPage_Reset
, ComboboxWidgetsPage::OnButtonReset
)
164 EVT_BUTTON(ComboPage_Change
, ComboboxWidgetsPage::OnButtonChange
)
165 EVT_BUTTON(ComboPage_Delete
, ComboboxWidgetsPage::OnButtonDelete
)
166 EVT_BUTTON(ComboPage_DeleteSel
, ComboboxWidgetsPage::OnButtonDeleteSel
)
167 EVT_BUTTON(ComboPage_Clear
, ComboboxWidgetsPage::OnButtonClear
)
168 EVT_BUTTON(ComboPage_Insert
, ComboboxWidgetsPage::OnButtonInsert
)
169 EVT_BUTTON(ComboPage_Add
, ComboboxWidgetsPage::OnButtonAdd
)
170 EVT_BUTTON(ComboPage_AddSeveral
, ComboboxWidgetsPage::OnButtonAddSeveral
)
171 EVT_BUTTON(ComboPage_AddMany
, ComboboxWidgetsPage::OnButtonAddMany
)
172 EVT_BUTTON(ComboPage_SetCurrent
, ComboboxWidgetsPage::OnButtonSetCurrent
)
174 EVT_TEXT_ENTER(ComboPage_InsertText
, ComboboxWidgetsPage::OnButtonInsert
)
175 EVT_TEXT_ENTER(ComboPage_AddText
, ComboboxWidgetsPage::OnButtonAdd
)
176 EVT_TEXT_ENTER(ComboPage_DeleteText
, ComboboxWidgetsPage::OnButtonDelete
)
178 EVT_UPDATE_UI(ComboPage_InsertionPointText
, ComboboxWidgetsPage::OnUpdateUIInsertionPointText
)
180 EVT_UPDATE_UI(ComboPage_Reset
, ComboboxWidgetsPage::OnUpdateUIResetButton
)
181 EVT_UPDATE_UI(ComboPage_Insert
, ComboboxWidgetsPage::OnUpdateUIInsert
)
182 EVT_UPDATE_UI(ComboPage_AddSeveral
, ComboboxWidgetsPage::OnUpdateUIAddSeveral
)
183 EVT_UPDATE_UI(ComboPage_Clear
, ComboboxWidgetsPage::OnUpdateUIClearButton
)
184 EVT_UPDATE_UI(ComboPage_DeleteText
, ComboboxWidgetsPage::OnUpdateUIClearButton
)
185 EVT_UPDATE_UI(ComboPage_Delete
, ComboboxWidgetsPage::OnUpdateUIDeleteButton
)
186 EVT_UPDATE_UI(ComboPage_Change
, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton
)
187 EVT_UPDATE_UI(ComboPage_ChangeText
, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton
)
188 EVT_UPDATE_UI(ComboPage_DeleteSel
, ComboboxWidgetsPage::OnUpdateUIDeleteSelButton
)
189 EVT_UPDATE_UI(ComboPage_SetCurrent
, ComboboxWidgetsPage::OnUpdateUISetCurrent
)
191 EVT_COMBOBOX(ComboPage_Combo
, ComboboxWidgetsPage::OnComboBox
)
192 EVT_TEXT(ComboPage_Combo
, ComboboxWidgetsPage::OnComboText
)
193 EVT_TEXT_ENTER(ComboPage_Combo
, ComboboxWidgetsPage::OnComboText
)
195 EVT_CHECKBOX(wxID_ANY
, ComboboxWidgetsPage::OnCheckOrRadioBox
)
196 EVT_RADIOBOX(wxID_ANY
, ComboboxWidgetsPage::OnCheckOrRadioBox
)
199 // ============================================================================
201 // ============================================================================
203 #if defined(__WXUNIVERSAL__)
204 #define FAMILY_CTRLS UNIVERSAL_CTRLS
206 #define FAMILY_CTRLS NATIVE_CTRLS
209 IMPLEMENT_WIDGETS_PAGE(ComboboxWidgetsPage
, _T("Combobox"),
210 FAMILY_CTRLS
| WITH_ITEMS_CTRLS
| COMBO_CTRLS
213 ComboboxWidgetsPage::ComboboxWidgetsPage(WidgetsBookCtrl
*book
,
214 wxImageList
*imaglist
)
215 : WidgetsPage(book
, imaglist
, combobox_xpm
)
220 m_chkFilename
= (wxCheckBox
*)NULL
;
222 m_combobox
= (wxComboBox
*)NULL
;
223 m_sizerCombo
= (wxSizer
*)NULL
;
226 void ComboboxWidgetsPage::CreateContent()
229 What we create here is a frame having 3 panes: style pane is the
230 leftmost one, in the middle the pane with buttons allowing to perform
231 miscellaneous combobox operations and the pane containing the combobox
234 wxSizer
*sizerTop
= new wxBoxSizer(wxHORIZONTAL
);
237 wxStaticBox
*box
= new wxStaticBox(this, wxID_ANY
, _T("&Set style"));
239 // should be in sync with ComboKind_XXX values
240 static const wxString kinds
[] =
247 m_radioKind
= new wxRadioBox(this, wxID_ANY
, _T("Combobox &kind:"),
248 wxDefaultPosition
, wxDefaultSize
,
249 WXSIZEOF(kinds
), kinds
,
250 1, wxRA_SPECIFY_COLS
);
252 wxSizer
*sizerLeft
= new wxStaticBoxSizer(box
, wxVERTICAL
);
254 m_chkSort
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&Sort items"));
255 m_chkReadonly
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&Read only"));
256 m_chkFilename
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&File name"));
257 m_chkFilename
->Disable(); // not implemented yet
259 sizerLeft
->Add(5, 5, 0, wxGROW
| wxALL
, 5); // spacer
260 sizerLeft
->Add(m_radioKind
, 0, wxGROW
| wxALL
, 5);
262 wxButton
*btn
= new wxButton(this, ComboPage_Reset
, _T("&Reset"));
263 sizerLeft
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL
| wxALL
, 15);
266 wxStaticBox
*box2
= new wxStaticBox(this, wxID_ANY
,
267 _T("&Change combobox contents"));
268 wxSizer
*sizerMiddle
= new wxStaticBoxSizer(box2
, wxVERTICAL
);
272 sizerRow
= CreateSizerWithTextAndButton(ComboPage_SetCurrent
,
273 _T("Current &selection"),
277 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
280 sizerRow
= CreateSizerWithTextAndLabel(_T("Insertion Point"),
281 ComboPage_InsertionPointText
,
283 text
->SetEditable(false);
285 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
287 sizerRow
= CreateSizerWithTextAndButton(ComboPage_Insert
,
288 _T("&Insert this string"),
289 ComboPage_InsertText
,
291 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
293 sizerRow
= CreateSizerWithTextAndButton(ComboPage_Add
,
294 _T("&Add this string"),
297 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
299 btn
= new wxButton(this, ComboPage_AddSeveral
, _T("&Append a few strings"));
300 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
302 btn
= new wxButton(this, ComboPage_AddMany
, _T("Append &many strings"));
303 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
305 sizerRow
= CreateSizerWithTextAndButton(ComboPage_Change
,
306 _T("C&hange current"),
307 ComboPage_ChangeText
,
309 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
311 sizerRow
= CreateSizerWithTextAndButton(ComboPage_Delete
,
312 _T("&Delete this item"),
313 ComboPage_DeleteText
,
315 sizerMiddle
->Add(sizerRow
, 0, wxALL
| wxGROW
, 5);
317 btn
= new wxButton(this, ComboPage_DeleteSel
, _T("Delete &selection"));
318 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
320 btn
= new wxButton(this, ComboPage_Clear
, _T("&Clear"));
321 sizerMiddle
->Add(btn
, 0, wxALL
| wxGROW
, 5);
324 wxSizer
*sizerRight
= new wxBoxSizer(wxVERTICAL
);
325 m_combobox
= new wxComboBox(this, ComboPage_Combo
, wxEmptyString
,
326 wxDefaultPosition
, wxDefaultSize
,
329 sizerRight
->Add(m_combobox
, 0, wxGROW
| wxALL
, 5);
330 sizerRight
->SetMinSize(150, 0);
331 m_sizerCombo
= sizerRight
; // save it to modify it later
333 // the 3 panes panes compose the window
334 sizerTop
->Add(sizerLeft
, 0, wxGROW
| (wxALL
& ~wxLEFT
), 10);
335 sizerTop
->Add(sizerMiddle
, 1, wxGROW
| wxALL
, 10);
336 sizerTop
->Add(sizerRight
, 1, wxGROW
| (wxALL
& ~wxRIGHT
), 10);
338 // final initializations
344 // ----------------------------------------------------------------------------
346 // ----------------------------------------------------------------------------
348 void ComboboxWidgetsPage::Reset()
350 m_chkSort
->SetValue(false);
351 m_chkReadonly
->SetValue(false);
352 m_chkFilename
->SetValue(false);
355 void ComboboxWidgetsPage::CreateCombo()
357 int flags
= ms_defaultFlags
;
359 if ( m_chkSort
->GetValue() )
361 if ( m_chkReadonly
->GetValue() )
362 flags
|= wxCB_READONLY
;
364 switch ( m_radioKind
->GetSelection() )
367 wxFAIL_MSG( _T("unknown combo kind") );
370 case ComboKind_Default
:
373 case ComboKind_Simple
:
374 flags
|= wxCB_SIMPLE
;
377 case ComboKind_DropDown
:
378 flags
= wxCB_DROPDOWN
;
385 unsigned int count
= m_combobox
->GetCount();
386 for ( unsigned int n
= 0; n
< count
; n
++ )
388 items
.Add(m_combobox
->GetString(n
));
391 m_sizerCombo
->Detach( m_combobox
);
395 m_combobox
= new wxComboBox(this, ComboPage_Combo
, wxEmptyString
,
396 wxDefaultPosition
, wxDefaultSize
,
401 if ( m_chkFilename
->GetValue() )
405 unsigned int count
= items
.GetCount();
406 for ( unsigned int n
= 0; n
< count
; n
++ )
408 m_combobox
->Append(items
[n
]);
411 m_sizerCombo
->Add(m_combobox
, 1, wxGROW
| wxALL
, 5);
412 m_sizerCombo
->Layout();
415 // ----------------------------------------------------------------------------
417 // ----------------------------------------------------------------------------
419 void ComboboxWidgetsPage::OnButtonReset(wxCommandEvent
& WXUNUSED(event
))
426 void ComboboxWidgetsPage::OnButtonChange(wxCommandEvent
& WXUNUSED(event
))
428 int sel
= m_combobox
->GetSelection();
429 if ( sel
!= wxNOT_FOUND
)
432 m_combobox
->SetString(sel
, m_textChange
->GetValue());
434 wxLogMessage(_T("Not implemented in wxGTK"));
439 void ComboboxWidgetsPage::OnButtonDelete(wxCommandEvent
& WXUNUSED(event
))
442 if ( !m_textDelete
->GetValue().ToULong(&n
) ||
443 (n
>= m_combobox
->GetCount()) )
448 m_combobox
->Delete(n
);
451 void ComboboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent
& WXUNUSED(event
))
453 int sel
= m_combobox
->GetSelection();
454 if ( sel
!= wxNOT_FOUND
)
456 m_combobox
->Delete(sel
);
460 void ComboboxWidgetsPage::OnButtonClear(wxCommandEvent
& WXUNUSED(event
))
465 void ComboboxWidgetsPage::OnButtonInsert(wxCommandEvent
& WXUNUSED(event
))
467 static unsigned int s_item
= 0;
469 wxString s
= m_textInsert
->GetValue();
470 if ( !m_textInsert
->IsModified() )
472 // update the default string
473 m_textInsert
->SetValue(wxString::Format(_T("test item %u"), ++s_item
));
476 if (m_combobox
->GetSelection() >= 0)
477 m_combobox
->Insert(s
, m_combobox
->GetSelection());
480 void ComboboxWidgetsPage::OnButtonAdd(wxCommandEvent
& WXUNUSED(event
))
482 static unsigned int s_item
= 0;
484 wxString s
= m_textAdd
->GetValue();
485 if ( !m_textAdd
->IsModified() )
487 // update the default string
488 m_textAdd
->SetValue(wxString::Format(_T("test item %u"), ++s_item
));
491 m_combobox
->Append(s
);
494 void ComboboxWidgetsPage::OnButtonAddMany(wxCommandEvent
& WXUNUSED(event
))
496 // "many" means 1000 here
497 for ( unsigned int n
= 0; n
< 1000; n
++ )
499 m_combobox
->Append(wxString::Format(_T("item #%u"), n
));
503 void ComboboxWidgetsPage::OnButtonSetCurrent(wxCommandEvent
& WXUNUSED(event
))
506 if ( !m_textCur
->GetValue().ToLong(&n
) )
509 m_combobox
->SetSelection(n
);
512 void ComboboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent
& WXUNUSED(event
))
514 m_combobox
->Append(_T("First"));
515 m_combobox
->Append(_T("another one"));
516 m_combobox
->Append(_T("and the last (very very very very very very very very very very long) one"));
519 void ComboboxWidgetsPage::OnUpdateUIInsertionPointText(wxUpdateUIEvent
& event
)
522 event
.SetText( wxString::Format(_T("%ld"), m_combobox
->GetInsertionPoint()) );
525 void ComboboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent
& event
)
527 event
.Enable( m_chkSort
->GetValue() ||
528 m_chkReadonly
->GetValue() ||
529 m_chkFilename
->GetValue() );
532 void ComboboxWidgetsPage::OnUpdateUIInsert(wxUpdateUIEvent
& event
)
536 bool enable
= !(m_combobox
->GetWindowStyle() & wxCB_SORT
) &&
537 (m_combobox
->GetSelection() >= 0);
539 event
.Enable(enable
);
543 void ComboboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent
& event
)
548 event
.Enable(m_textDelete
->GetValue().ToULong(&n
) &&
549 (n
< (unsigned)m_combobox
->GetCount()));
553 void ComboboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent
& event
)
556 event
.Enable(m_combobox
->GetSelection() != wxNOT_FOUND
);
559 void ComboboxWidgetsPage::OnUpdateUIClearButton(wxUpdateUIEvent
& event
)
562 event
.Enable(m_combobox
->GetCount() != 0);
565 void ComboboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent
& event
)
568 event
.Enable(!(m_combobox
->GetWindowStyle() & wxCB_SORT
));
571 void ComboboxWidgetsPage::OnUpdateUISetCurrent(wxUpdateUIEvent
& event
)
574 event
.Enable( m_textCur
->GetValue().ToLong(&n
) &&
576 (n
>= 0 && (unsigned)n
< m_combobox
->GetCount())) );
579 void ComboboxWidgetsPage::OnComboText(wxCommandEvent
& event
)
584 wxString s
= event
.GetString();
586 wxASSERT_MSG( s
== m_combobox
->GetValue(),
587 _T("event and combobox values should be the same") );
589 if (event
.GetEventType() == wxEVT_COMMAND_TEXT_ENTER
)
590 wxLogMessage(_T("Combobox enter pressed (now '%s')"), s
.c_str());
592 wxLogMessage(_T("Combobox text changed (now '%s')"), s
.c_str());
595 void ComboboxWidgetsPage::OnComboBox(wxCommandEvent
& event
)
597 long sel
= event
.GetInt();
598 const wxString selstr
= wxString::Format(_T("%ld"), sel
);
599 m_textDelete
->SetValue(selstr
);
600 m_textCur
->SetValue(selstr
);
602 wxLogMessage(_T("Combobox item %ld selected"), sel
);
604 wxLogMessage(_T("Combobox GetValue(): %s"), m_combobox
->GetValue().c_str() );
607 void ComboboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
))
612 #endif //wxUSE_COMBOBOX