X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aec18ff785687e1d0830da8cd287903128a994c6..e0dec8753abaf97e006ea1185bfb6775b28df0a8:/samples/widgets/listbox.cpp?ds=sidebyside diff --git a/samples/widgets/listbox.cpp b/samples/widgets/listbox.cpp index ca2773d805..9278c6306b 100644 --- a/samples/widgets/listbox.cpp +++ b/samples/widgets/listbox.cpp @@ -1,12 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Program: wxWindows Widgets Sample +// Program: wxWidgets Widgets Sample // Name: listbox.cpp // Purpose: Part of the widgets sample showing wxListbox // Author: Vadim Zeitlin // Created: 27.03.01 // Id: $Id$ // Copyright: (c) 2001 Vadim Zeitlin -// License: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -24,10 +24,13 @@ #pragma hdrstop #endif +#if wxUSE_LISTBOX + // for all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/log.h" + #include "wx/bitmap.h" #include "wx/button.h" #include "wx/checkbox.h" #include "wx/combobox.h" @@ -41,8 +44,9 @@ #include "wx/checklst.h" +#include "itemcontainer.h" #include "widgets.h" -#if 1 + #include "icons/listbox.xpm" // ---------------------------------------------------------------------------- @@ -52,7 +56,7 @@ // control ids enum { - ListboxPage_Reset = 100, + ListboxPage_Reset = wxID_HIGHEST, ListboxPage_Add, ListboxPage_AddText, ListboxPage_AddSeveral, @@ -63,22 +67,33 @@ enum ListboxPage_Delete, ListboxPage_DeleteText, ListboxPage_DeleteSel, - ListboxPage_Listbox + ListboxPage_Listbox, + ListboxPage_EnsureVisible, + ListboxPage_EnsureVisibleText, + ListboxPage_ContainerTests }; // ---------------------------------------------------------------------------- // ListboxWidgetsPage // ---------------------------------------------------------------------------- -class ListboxWidgetsPage : public WidgetsPage +class ListboxWidgetsPage : public ItemContainerWidgetsPage { public: - ListboxWidgetsPage(wxNotebook *notebook, wxImageList *imaglist); + ListboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist); + + virtual wxControl *GetWidget() const { return m_lbox; } + virtual wxItemContainer* GetContainer() const { return m_lbox; } + virtual void RecreateWidget() { CreateLbox(); } + + // lazy creation of the content + virtual void CreateContent(); protected: // event handlers void OnButtonReset(wxCommandEvent& event); void OnButtonChange(wxCommandEvent& event); + void OnButtonEnsureVisible(wxCommandEvent& event); void OnButtonDelete(wxCommandEvent& event); void OnButtonDeleteSel(wxCommandEvent& event); void OnButtonClear(wxCommandEvent& event); @@ -94,6 +109,7 @@ protected: void OnUpdateUIAddSeveral(wxUpdateUIEvent& event); void OnUpdateUIClearButton(wxUpdateUIEvent& event); + void OnUpdateUIEnsureVisibleButton(wxUpdateUIEvent& event); void OnUpdateUIDeleteButton(wxUpdateUIEvent& event); void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event); void OnUpdateUIResetButton(wxUpdateUIEvent& event); @@ -104,6 +120,11 @@ protected: // (re)create the listbox void CreateLbox(); + // read the value of a listbox item index from the given control, return + // false if it's invalid + bool GetValidIndexFromText(const wxTextCtrl *text, int *n = NULL) const; + + // listbox parameters // ------------------ @@ -129,18 +150,26 @@ protected: wxRadioBox *m_radioSelMode; // the checkboxes - wxCheckBox *m_chkSort, - *m_chkCheck, + wxCheckBox *m_chkVScroll, *m_chkHScroll, - *m_chkVScroll; + *m_chkCheck, + *m_chkSort, + *m_chkOwnerDraw; // the listbox itself and the sizer it is in - wxListBox *m_lbox; +#ifdef __WXWINCE__ + wxListBoxBase +#else + wxListBox +#endif + *m_lbox; + wxSizer *m_sizerLbox; // the text entries for "Add/change string" and "Delete" buttons wxTextCtrl *m_textAdd, *m_textChange, + *m_textEnsureVisible, *m_textDelete; private: @@ -157,13 +186,16 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage) EVT_BUTTON(ListboxPage_Change, ListboxWidgetsPage::OnButtonChange) EVT_BUTTON(ListboxPage_Delete, ListboxWidgetsPage::OnButtonDelete) EVT_BUTTON(ListboxPage_DeleteSel, ListboxWidgetsPage::OnButtonDeleteSel) + EVT_BUTTON(ListboxPage_EnsureVisible, ListboxWidgetsPage::OnButtonEnsureVisible) EVT_BUTTON(ListboxPage_Clear, ListboxWidgetsPage::OnButtonClear) EVT_BUTTON(ListboxPage_Add, ListboxWidgetsPage::OnButtonAdd) EVT_BUTTON(ListboxPage_AddSeveral, ListboxWidgetsPage::OnButtonAddSeveral) EVT_BUTTON(ListboxPage_AddMany, ListboxWidgetsPage::OnButtonAddMany) + EVT_BUTTON(ListboxPage_ContainerTests, ItemContainerWidgetsPage::OnButtonTestItemContainer) EVT_TEXT_ENTER(ListboxPage_AddText, ListboxWidgetsPage::OnButtonAdd) EVT_TEXT_ENTER(ListboxPage_DeleteText, ListboxWidgetsPage::OnButtonDelete) + EVT_TEXT_ENTER(ListboxPage_EnsureVisibleText, ListboxWidgetsPage::OnButtonEnsureVisible) EVT_UPDATE_UI(ListboxPage_Reset, ListboxWidgetsPage::OnUpdateUIResetButton) EVT_UPDATE_UI(ListboxPage_AddSeveral, ListboxWidgetsPage::OnUpdateUIAddSeveral) @@ -173,38 +205,50 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage) EVT_UPDATE_UI(ListboxPage_Change, ListboxWidgetsPage::OnUpdateUIDeleteSelButton) EVT_UPDATE_UI(ListboxPage_ChangeText, ListboxWidgetsPage::OnUpdateUIDeleteSelButton) EVT_UPDATE_UI(ListboxPage_DeleteSel, ListboxWidgetsPage::OnUpdateUIDeleteSelButton) + EVT_UPDATE_UI(ListboxPage_EnsureVisible, ListboxWidgetsPage::OnUpdateUIEnsureVisibleButton) EVT_LISTBOX(ListboxPage_Listbox, ListboxWidgetsPage::OnListbox) EVT_LISTBOX_DCLICK(ListboxPage_Listbox, ListboxWidgetsPage::OnListboxDClick) EVT_CHECKLISTBOX(ListboxPage_Listbox, ListboxWidgetsPage::OnCheckListbox) - EVT_CHECKBOX(-1, ListboxWidgetsPage::OnCheckOrRadioBox) - EVT_RADIOBOX(-1, ListboxWidgetsPage::OnCheckOrRadioBox) + EVT_CHECKBOX(wxID_ANY, ListboxWidgetsPage::OnCheckOrRadioBox) + EVT_RADIOBOX(wxID_ANY, ListboxWidgetsPage::OnCheckOrRadioBox) END_EVENT_TABLE() // ============================================================================ // implementation // ============================================================================ -IMPLEMENT_WIDGETS_PAGE(ListboxWidgetsPage, _T("Listbox")); +#if defined(__WXUNIVERSAL__) + #define FAMILY_CTRLS UNIVERSAL_CTRLS +#else + #define FAMILY_CTRLS NATIVE_CTRLS +#endif + +IMPLEMENT_WIDGETS_PAGE(ListboxWidgetsPage, wxT("Listbox"), + FAMILY_CTRLS | WITH_ITEMS_CTRLS + ); -ListboxWidgetsPage::ListboxWidgetsPage(wxNotebook *notebook, +ListboxWidgetsPage::ListboxWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist) - : WidgetsPage(notebook) + : ItemContainerWidgetsPage(book, imaglist, listbox_xpm) { - imaglist->Add(wxBitmap(listbox_xpm)); - // init everything m_radioSelMode = (wxRadioBox *)NULL; m_chkVScroll = m_chkHScroll = m_chkCheck = - m_chkSort = (wxCheckBox *)NULL; + m_chkSort = + m_chkOwnerDraw = (wxCheckBox *)NULL; - m_lbox = (wxListBox *)NULL; + m_lbox = NULL; m_sizerLbox = (wxSizer *)NULL; +} + +void ListboxWidgetsPage::CreateContent() +{ /* What we create here is a frame having 3 panes: style pane is the leftmost one, in the middle the pane with buttons allowing to perform @@ -214,17 +258,18 @@ ListboxWidgetsPage::ListboxWidgetsPage(wxNotebook *notebook, wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); // left pane - wxStaticBox *box = new wxStaticBox(this, -1, _T("&Set listbox parameters")); + wxStaticBox *box = new wxStaticBox(this, wxID_ANY, + wxT("&Set listbox parameters")); wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); static const wxString modes[] = { - _T("single"), - _T("extended"), - _T("multiple"), + wxT("single"), + wxT("extended"), + wxT("multiple"), }; - m_radioSelMode = new wxRadioBox(this, -1, _T("Selection &mode:"), + m_radioSelMode = new wxRadioBox(this, wxID_ANY, wxT("Selection &mode:"), wxDefaultPosition, wxDefaultSize, WXSIZEOF(modes), modes, 1, wxRA_SPECIFY_COLS); @@ -232,57 +277,69 @@ ListboxWidgetsPage::ListboxWidgetsPage(wxNotebook *notebook, m_chkVScroll = CreateCheckBoxAndAddToSizer ( sizerLeft, - _T("Always show &vertical scrollbar") + wxT("Always show &vertical scrollbar") ); m_chkHScroll = CreateCheckBoxAndAddToSizer ( sizerLeft, - _T("Show &horizontal scrollbar") + wxT("Show &horizontal scrollbar") ); - m_chkCheck = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Check list box")); - m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Sort items")); + m_chkCheck = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Check list box")); + m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Sort items")); + m_chkOwnerDraw = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Owner drawn")); sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer sizerLeft->Add(m_radioSelMode, 0, wxGROW | wxALL, 5); - wxButton *btn = new wxButton(this, ListboxPage_Reset, _T("&Reset")); + wxButton *btn = new wxButton(this, ListboxPage_Reset, wxT("&Reset")); sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15); // middle pane - wxStaticBox *box2 = new wxStaticBox(this, -1, _T("&Change listbox contents")); + wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, + wxT("&Change listbox contents")); wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL); wxSizer *sizerRow = new wxBoxSizer(wxHORIZONTAL); - btn = new wxButton(this, ListboxPage_Add, _T("&Add this string")); - m_textAdd = new wxTextCtrl(this, ListboxPage_AddText, _T("test item 0")); + btn = new wxButton(this, ListboxPage_Add, wxT("&Add this string")); + m_textAdd = new wxTextCtrl(this, ListboxPage_AddText, wxT("test item 0")); sizerRow->Add(btn, 0, wxRIGHT, 5); sizerRow->Add(m_textAdd, 1, wxLEFT, 5); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); - btn = new wxButton(this, ListboxPage_AddSeveral, _T("&Insert a few strings")); + btn = new wxButton(this, ListboxPage_AddSeveral, wxT("&Insert a few strings")); sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); - btn = new wxButton(this, ListboxPage_AddMany, _T("Add &many strings")); + btn = new wxButton(this, ListboxPage_AddMany, wxT("Add &many strings")); sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); sizerRow = new wxBoxSizer(wxHORIZONTAL); - btn = new wxButton(this, ListboxPage_Change, _T("C&hange current")); - m_textChange = new wxTextCtrl(this, ListboxPage_ChangeText, _T("")); + btn = new wxButton(this, ListboxPage_Change, wxT("C&hange current")); + m_textChange = new wxTextCtrl(this, ListboxPage_ChangeText, wxEmptyString); sizerRow->Add(btn, 0, wxRIGHT, 5); sizerRow->Add(m_textChange, 1, wxLEFT, 5); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); sizerRow = new wxBoxSizer(wxHORIZONTAL); - btn = new wxButton(this, ListboxPage_Delete, _T("&Delete this item")); - m_textDelete = new wxTextCtrl(this, ListboxPage_DeleteText, _T("")); + btn = new wxButton(this, ListboxPage_EnsureVisible, wxT("Make item &visible")); + m_textEnsureVisible = new wxTextCtrl(this, ListboxPage_EnsureVisibleText, wxEmptyString); + sizerRow->Add(btn, 0, wxRIGHT, 5); + sizerRow->Add(m_textEnsureVisible, 1, wxLEFT, 5); + sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); + + sizerRow = new wxBoxSizer(wxHORIZONTAL); + btn = new wxButton(this, ListboxPage_Delete, wxT("&Delete this item")); + m_textDelete = new wxTextCtrl(this, ListboxPage_DeleteText, wxEmptyString); sizerRow->Add(btn, 0, wxRIGHT, 5); sizerRow->Add(m_textDelete, 1, wxLEFT, 5); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); - btn = new wxButton(this, ListboxPage_DeleteSel, _T("Delete &selection")); + btn = new wxButton(this, ListboxPage_DeleteSel, wxT("Delete &selection")); sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); - btn = new wxButton(this, ListboxPage_Clear, _T("&Clear")); + btn = new wxButton(this, ListboxPage_Clear, wxT("&Clear")); + sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); + + btn = new wxButton(this, ListboxPage_ContainerTests, wxT("Run &tests")); sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); // right pane @@ -303,10 +360,7 @@ ListboxWidgetsPage::ListboxWidgetsPage(wxNotebook *notebook, // final initializations Reset(); - SetAutoLayout(TRUE); SetSizer(sizerTop); - - sizerTop->Fit(this); } // ---------------------------------------------------------------------------- @@ -316,19 +370,20 @@ ListboxWidgetsPage::ListboxWidgetsPage(wxNotebook *notebook, void ListboxWidgetsPage::Reset() { m_radioSelMode->SetSelection(LboxSel_Single); - m_chkSort->SetValue(FALSE); - m_chkCheck->SetValue(FALSE); - m_chkHScroll->SetValue(TRUE); - m_chkVScroll->SetValue(FALSE); + m_chkVScroll->SetValue(false); + m_chkHScroll->SetValue(true); + m_chkCheck->SetValue(false); + m_chkSort->SetValue(false); + m_chkOwnerDraw->SetValue(false); } void ListboxWidgetsPage::CreateLbox() { - int flags = 0; + int flags = ms_defaultFlags; switch ( m_radioSelMode->GetSelection() ) { default: - wxFAIL_MSG( _T("unexpected radio box selection") ); + wxFAIL_MSG( wxT("unexpected radio box selection") ); case LboxSel_Single: flags |= wxLB_SINGLE; break; case LboxSel_Extended: flags |= wxLB_EXTENDED; break; @@ -341,6 +396,8 @@ void ListboxWidgetsPage::CreateLbox() flags |= wxLB_HSCROLL; if ( m_chkSort->GetValue() ) flags |= wxLB_SORT; + if ( m_chkOwnerDraw->GetValue() ) + flags |= wxLB_OWNERDRAW; wxArrayString items; if ( m_lbox ) @@ -351,7 +408,7 @@ void ListboxWidgetsPage::CreateLbox() items.Add(m_lbox->GetString(n)); } - m_sizerLbox->Remove(m_lbox); + m_sizerLbox->Detach( m_lbox ); delete m_lbox; } @@ -377,6 +434,33 @@ void ListboxWidgetsPage::CreateLbox() m_sizerLbox->Layout(); } +// ---------------------------------------------------------------------------- +// miscellaneous helpers +// ---------------------------------------------------------------------------- + +bool +ListboxWidgetsPage::GetValidIndexFromText(const wxTextCtrl *text, int *n) const +{ + unsigned long idx; + if ( !text->GetValue().ToULong(&idx) || (idx >= m_lbox->GetCount()) ) + { + // don't give the warning if we're just testing but do give it if we + // want to retrieve the value as this is only done in answer to a user + // action + if ( n ) + { + wxLogWarning("Invalid index \"%s\"", text->GetValue()); + } + + return false; + } + + if ( n ) + *n = idx; + + return true; +} + // ---------------------------------------------------------------------------- // event handlers // ---------------------------------------------------------------------------- @@ -399,11 +483,21 @@ void ListboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event)) } } +void ListboxWidgetsPage::OnButtonEnsureVisible(wxCommandEvent& WXUNUSED(event)) +{ + int n; + if ( !GetValidIndexFromText(m_textEnsureVisible, &n) ) + { + return; + } + + m_lbox->EnsureVisible(n); +} + void ListboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event)) { - unsigned long n; - if ( !m_textDelete->GetValue().ToULong(&n) || - (n >= (unsigned)m_lbox->GetCount()) ) + int n; + if ( !GetValidIndexFromText(m_textDelete, &n) ) { return; } @@ -421,20 +515,20 @@ void ListboxWidgetsPage::OnButtonDeleteSel(wxCommandEvent& WXUNUSED(event)) } } -void ListboxWidgetsPage::OnButtonClear(wxCommandEvent& event) +void ListboxWidgetsPage::OnButtonClear(wxCommandEvent& WXUNUSED(event)) { m_lbox->Clear(); } -void ListboxWidgetsPage::OnButtonAdd(wxCommandEvent& event) +void ListboxWidgetsPage::OnButtonAdd(wxCommandEvent& WXUNUSED(event)) { - static size_t s_item = 0; + static unsigned int s_item = 0; wxString s = m_textAdd->GetValue(); if ( !m_textAdd->IsModified() ) { // update the default string - m_textAdd->SetValue(wxString::Format(_T("test item %u"), ++s_item)); + m_textAdd->SetValue(wxString::Format(wxT("test item %u"), ++s_item)); } m_lbox->Append(s); @@ -443,18 +537,18 @@ void ListboxWidgetsPage::OnButtonAdd(wxCommandEvent& event) void ListboxWidgetsPage::OnButtonAddMany(wxCommandEvent& WXUNUSED(event)) { // "many" means 1000 here - for ( size_t n = 0; n < 1000; n++ ) + for ( unsigned int n = 0; n < 1000; n++ ) { - m_lbox->Append(wxString::Format(_T("item #%u"), n)); + m_lbox->Append(wxString::Format(wxT("item #%u"), n)); } } -void ListboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& event) +void ListboxWidgetsPage::OnButtonAddSeveral(wxCommandEvent& WXUNUSED(event)) { wxArrayString items; - items.Add(_T("First")); - items.Add(_T("another one")); - items.Add(_T("and the last (very very very very very very very very very very long) one")); + items.Add(wxT("First")); + items.Add(wxT("another one")); + items.Add(wxT("and the last (very very very very very very very very very very long) one")); m_lbox->InsertItems(items, 0); } @@ -462,15 +556,19 @@ void ListboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event) { event.Enable( (m_radioSelMode->GetSelection() != LboxSel_Single) || m_chkSort->GetValue() || + m_chkOwnerDraw->GetValue() || !m_chkHScroll->GetValue() || m_chkVScroll->GetValue() ); } +void ListboxWidgetsPage::OnUpdateUIEnsureVisibleButton(wxUpdateUIEvent& event) +{ + event.Enable(GetValidIndexFromText(m_textEnsureVisible)); +} + void ListboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event) { - unsigned long n; - event.Enable(m_textDelete->GetValue().ToULong(&n) && - (n < (unsigned)m_lbox->GetCount())); + event.Enable(GetValidIndexFromText(m_textDelete)); } void ListboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event) @@ -491,25 +589,32 @@ void ListboxWidgetsPage::OnUpdateUIAddSeveral(wxUpdateUIEvent& event) void ListboxWidgetsPage::OnListbox(wxCommandEvent& event) { - long sel = event.GetInt(); - m_textDelete->SetValue(wxString::Format(_T("%ld"), sel)); + long sel = event.GetSelection(); + m_textDelete->SetValue(wxString::Format(wxT("%ld"), sel)); - wxLogMessage(_T("Listbox item %ld selected"), sel); + if (event.IsSelection()) + { + wxLogMessage(wxT("Listbox item %ld selected"), sel); + } + else + { + wxLogMessage(wxT("Listbox item %ld deselected"), sel); + } } void ListboxWidgetsPage::OnListboxDClick(wxCommandEvent& event) { - wxLogMessage( _T("Listbox item %ld double clicked"), event.GetInt() ); + wxLogMessage( wxT("Listbox item %d double clicked"), event.GetInt() ); } void ListboxWidgetsPage::OnCheckListbox(wxCommandEvent& event) { - wxLogMessage( _T("Listbox item %ld toggled"), event.GetInt() ); + wxLogMessage( wxT("Listbox item %d toggled"), event.GetInt() ); } -void ListboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event) +void ListboxWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) { CreateLbox(); } -#endif +#endif // wxUSE_LISTBOX