From 18dbdd3c2785b504c02ebf3739503a0183cae39b Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Sat, 13 Sep 2003 12:14:20 +0000 Subject: [PATCH] wxUniversal STL-ification. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23562 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/univ/listbox.h | 17 +++++++---- src/univ/listbox.cpp | 62 +++++++++++++++++++++++++++++---------- 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/include/wx/univ/listbox.h b/include/wx/univ/listbox.h index 6f00f1d6c2..07bbd27a55 100644 --- a/include/wx/univ/listbox.h +++ b/include/wx/univ/listbox.h @@ -18,6 +18,7 @@ #include "wx/scrolwin.h" // for wxScrollHelper #include "wx/dynarray.h" +#include "wx/arrstr.h" // ---------------------------------------------------------------------------- // the actions supported by this control @@ -85,11 +86,11 @@ public: virtual void Clear(); virtual void Delete(int n); - virtual int GetCount() const { return (int)m_strings.GetCount(); } - virtual wxString GetString(int n) const { return m_strings[n]; } + virtual int GetCount() const { return (int)m_strings->GetCount(); } + virtual wxString GetString(int n) const { return (*m_strings)[n]; } virtual void SetString(int n, const wxString& s); virtual int FindString(const wxString& s) const - { return m_strings.Index(s); } + { return IsSorted() ? m_stringsSorted->Index(s) : m_strings->Index(s); } virtual bool IsSelected(int n) const { return m_selections.Index(n) != wxNOT_FOUND; } @@ -223,8 +224,14 @@ protected: void UpdateItems(); // the array containing all items (it is sorted if the listbox has - // wxLB_SORT style) - wxArrayString m_strings; + // wxLB_SORT style). Note the evil trick: the pointers share the + // same location, hence we use m_strings when we don't care if the + // array is sorted or not, m_stringsSorted when we do + union + { + wxArrayString* m_strings; + wxSortedArrayString* m_stringsSorted; + }; // this array contains the indices of the selected items (for the single // selection listboxes only the first element of it is used and contains diff --git a/src/univ/listbox.cpp b/src/univ/listbox.cpp index 33ba2ea3a3..099d70f8e3 100644 --- a/src/univ/listbox.cpp +++ b/src/univ/listbox.cpp @@ -63,6 +63,7 @@ void wxListBox::Init() m_maxWidth = 0; m_scrollRangeY = 0; m_maxWidthItem = -1; + m_strings = NULL; // no items hence no current item m_current = -1; @@ -112,7 +113,9 @@ bool wxListBox::Create(wxWindow *parent, SetWindow(this); if ( style & wxLB_SORT ) - m_strings = wxArrayString(TRUE /* auto sort */); + m_stringsSorted = new wxSortedArrayString; + else + m_strings = new wxArrayString; Set(n, choices); @@ -127,6 +130,13 @@ wxListBox::~wxListBox() { // call this just to free the client data -- and avoid leaking memory DoClear(); + + if ( IsSorted() ) + delete m_stringsSorted; + else + delete m_strings; + + m_strings = NULL; } // ---------------------------------------------------------------------------- @@ -135,7 +145,18 @@ wxListBox::~wxListBox() int wxListBox::DoAppend(const wxString& item) { - size_t index = m_strings.Add(item); + size_t index; + + if ( IsSorted() ) + { + index = m_stringsSorted->Add(item); + } + else + { + index = m_strings->GetCount(); + m_strings->Add(item); + } + m_itemsClientData.Insert(NULL, index); m_updateScrollbarY = TRUE; @@ -167,7 +188,7 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos) size_t count = items.GetCount(); for ( size_t n = 0; n < count; n++ ) { - m_strings.Insert(items[n], pos + n); + m_strings->Insert(items[n], pos + n); m_itemsClientData.Insert(NULL, pos + n); } @@ -192,11 +213,22 @@ void wxListBox::DoSetItems(const wxArrayString& items, void **clientData) if ( !count ) return; - m_strings.Alloc(count); + m_strings->Alloc(count); m_itemsClientData.Alloc(count); for ( size_t n = 0; n < count; n++ ) { - size_t index = m_strings.Add(items[n]); + size_t index; + + if ( IsSorted() ) + { + index = m_stringsSorted->Add(items[n]); + } + else + { + index = m_strings->GetCount(); + m_strings->Add(items[n]); + } + m_itemsClientData.Insert(clientData ? clientData[n] : NULL, index); } @@ -212,7 +244,7 @@ void wxListBox::SetString(int n, const wxString& s) // we need to update m_maxWidth as changing the string may cause the // horz scrollbar [dis]appear wxCoord width; - m_strings[n] = s; + (*m_strings)[n] = s; GetTextExtent(s, &width, NULL); // it might have increased if the new string is long @@ -230,7 +262,7 @@ void wxListBox::SetString(int n, const wxString& s) } else // no horz scrollbar { - m_strings[n] = s; + (*m_strings)[n] = s; } RefreshItem(n); @@ -242,7 +274,7 @@ void wxListBox::SetString(int n, const wxString& s) void wxListBox::DoClear() { - m_strings.Clear(); + m_strings->Clear(); if ( HasClientObjectData() ) { @@ -279,7 +311,7 @@ void wxListBox::Delete(int n) // refreshed (as GetCount() will be decremented) RefreshFromItemToEnd(n); - m_strings.RemoveAt(n); + m_strings->RemoveAt(n); if ( HasClientObjectData() ) { @@ -652,7 +684,7 @@ void wxListBox::DoDraw(wxControlRenderer *renderer) wxCoord lineHeight = GetLineHeight(); size_t itemFirst = yTop / lineHeight, itemLast = (yBottom + lineHeight - 1) / lineHeight, - itemMax = m_strings.GetCount(); + itemMax = m_strings->GetCount(); if ( itemFirst >= itemMax ) return; @@ -721,10 +753,10 @@ wxCoord wxListBox::GetMaxWidth() const { wxListBox *self = wxConstCast(this, wxListBox); wxCoord width; - size_t count = m_strings.GetCount(); + size_t count = m_strings->GetCount(); for ( size_t n = 0; n < count; n++ ) { - GetTextExtent(m_strings[n], &width, NULL); + GetTextExtent((*m_strings)[n], &width, NULL); if ( width > m_maxWidth ) { self->m_maxWidth = width; @@ -778,11 +810,11 @@ wxSize wxListBox::DoGetBestClientSize() const wxCoord width = 0, height = 0; - size_t count = m_strings.GetCount(); + size_t count = m_strings->GetCount(); for ( size_t n = 0; n < count; n++ ) { wxCoord w,h; - GetTextExtent(m_strings[n], &w, &h); + GetTextExtent((*m_strings)[n], &w, &h); if ( w > width ) width = w; @@ -890,7 +922,7 @@ bool wxListBox::FindItem(const wxString& prefix, bool strictlyAfter) // loop over all items in the listbox for ( int item = first; item != last; item < count - 1 ? item++ : item = 0 ) { - if ( wxStrnicmp(m_strings[item], prefix, len) == 0 ) + if ( wxStrnicmp((*m_strings)[item], prefix, len) == 0 ) { SetCurrentItem(item); -- 2.45.2