X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/170acdc90e9f92f8b8120fa6c04acdbf45c89582..1b27b2bd2b6e290645516c180566222c6aa22149:/src/univ/listbox.cpp diff --git a/src/univ/listbox.cpp b/src/univ/listbox.cpp index 7aaa9953f3..c26aafb29e 100644 --- a/src/univ/listbox.cpp +++ b/src/univ/listbox.cpp @@ -97,7 +97,7 @@ protected: // implementation of wxListBox // ============================================================================ -IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems) BEGIN_EVENT_TABLE(wxListBox, wxListBoxBase) EVT_SIZE(wxListBox::OnSize) @@ -192,7 +192,7 @@ bool wxListBox::Create(wxWindow *parent, validator, name) ) return false; - m_strings = new wxArrayString; + m_strings = IsSorted() ? new wxArrayString : new wxSortedArrayString; Set(n, choices); @@ -217,67 +217,25 @@ wxListBox::~wxListBox() // adding/inserting strings // ---------------------------------------------------------------------------- -int wxCMPFUNC_CONV wxListBoxSortNoCase(wxString* s1, wxString* s2) +int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, + wxClientDataType type) { - return s1->CmpNoCase(*s2); -} - -int wxListBox::DoAppendOnly(const wxString& item) -{ - unsigned int index; + int idx = wxNOT_FOUND; - if ( IsSorted() ) + const unsigned int numItems = items.GetCount(); + for ( unsigned int i = 0; i < numItems; ++i ) { - m_strings->Add(item); - m_strings->Sort(wxListBoxSortNoCase); - index = m_strings->Index(item); - } - else - { - index = m_strings->GetCount(); - m_strings->Add(item); - } + const wxString& item = items[i]; + idx = IsSorted() ? m_strings->Add(item) + : (m_strings->Insert(item, pos), pos++); - return index; -} + m_itemsClientData.Insert(NULL, idx); + AssignNewItemClientData(idx, clientData, i, type); -int wxListBox::DoAppend(const wxString& item) -{ - size_t index = DoAppendOnly( item ); - - m_itemsClientData.Insert(NULL, index); - - m_updateScrollbarY = true; - - if ( HasHorzScrollbar() ) - { - // has the max width increased? - wxCoord width; - GetTextExtent(item, &width, NULL); - if ( width > m_maxWidth ) - { - m_maxWidth = width; - m_maxWidthItem = index; - m_updateScrollbarX = true; - } - } - - RefreshFromItemToEnd(index); - - return index; -} - -void wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos) -{ - // the position of the item being added to a sorted listbox can't be - // specified - wxCHECK_RET( !IsSorted(), _T("can't insert items into sorted listbox") ); - - unsigned int count = items.GetCount(); - for ( unsigned int n = 0; n < count; n++ ) - { - m_strings->Insert(items[n], pos + n); - m_itemsClientData.Insert(NULL, pos + n); + // call the wxCheckListBox hook + OnItemInserted(idx); } // the number of items has changed so we might have to show the scrollbar @@ -291,29 +249,8 @@ void wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos) // note that we have to refresh all the items after the ones we inserted, // not just these items RefreshFromItemToEnd(pos); -} -void wxListBox::DoSetItems(const wxArrayString& items, void **clientData) -{ - DoClear(); - - unsigned int count = items.GetCount(); - if ( !count ) - return; - - m_strings->Alloc(count); - - m_itemsClientData.Alloc(count); - for ( unsigned int n = 0; n < count; n++ ) - { - unsigned int index = DoAppendOnly(items[n]); - - m_itemsClientData.Insert(clientData ? clientData[n] : NULL, index); - } - - m_updateScrollbarY = true; - - RefreshAll(); + return idx; } void wxListBox::SetString(unsigned int n, const wxString& s) @@ -355,24 +292,10 @@ void wxListBox::DoClear() { m_strings->Clear(); - if ( HasClientObjectData() ) - { - unsigned int count = m_itemsClientData.GetCount(); - for ( unsigned int n = 0; n < count; n++ ) - { - delete (wxClientData *) m_itemsClientData[n]; - } - } - m_itemsClientData.Clear(); m_selections.Clear(); m_current = -1; -} - -void wxListBox::Clear() -{ - DoClear(); m_updateScrollbarY = true; @@ -381,7 +304,7 @@ void wxListBox::Clear() RefreshAll(); } -void wxListBox::Delete(unsigned int n) +void wxListBox::DoDeleteOneItem(unsigned int n) { wxCHECK_RET( IsValid(n), _T("invalid index in wxListBox::Delete") ); @@ -392,11 +315,6 @@ void wxListBox::Delete(unsigned int n) m_strings->RemoveAt(n); - if ( HasClientObjectData() ) - { - delete (wxClientData *)m_itemsClientData[n]; - } - m_itemsClientData.RemoveAt(n); // when the item disappears we must not keep using its index @@ -458,16 +376,6 @@ void *wxListBox::DoGetItemClientData(unsigned int n) const return m_itemsClientData[n]; } -void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData) -{ - m_itemsClientData[n] = clientData; -} - -wxClientData* wxListBox::DoGetItemClientObject(unsigned int n) const -{ - return (wxClientData *)m_itemsClientData[n]; -} - // ---------------------------------------------------------------------------- // selection // ----------------------------------------------------------------------------