X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e39af974ef7846e26686ae39d74e4696c1fef0c3..c0f984728e5cac4d20f004aa962b15e9a30d91e6:/src/univ/listbox.cpp diff --git a/src/univ/listbox.cpp b/src/univ/listbox.cpp index 4612caa01d..099d70f8e3 100644 --- a/src/univ/listbox.cpp +++ b/src/univ/listbox.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "univlistbox.h" #endif @@ -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; @@ -106,13 +107,15 @@ bool wxListBox::Create(wxWindow *parent, #endif if ( !wxControl::Create(parent, id, pos, size, style, - wxDefaultValidator, name) ) + validator, name) ) return FALSE; 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() ) { @@ -622,6 +654,7 @@ void wxListBox::OnInternalIdle() m_updateCount = 0; } + wxListBoxBase::OnInternalIdle(); } // ---------------------------------------------------------------------------- @@ -651,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; @@ -720,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; @@ -769,7 +802,7 @@ void wxListBox::DoSetSize(int x, int y, height = ((height - hBorders + hLine - 1) / hLine)*hLine + hBorders; } - wxListBoxBase::DoSetSize(x, y, width, height); + wxListBoxBase::DoSetSize(x, y, width, height, sizeFlags); } wxSize wxListBox::DoGetBestClientSize() const @@ -777,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; @@ -889,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);