X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f7a201b94e6b6160cb1d2b08d56f88941239ca56..aa99e0cd2242db04fe1f9bb7d91aea545def2422:/src/univ/listbox.cpp diff --git a/src/univ/listbox.cpp b/src/univ/listbox.cpp index 7ae71b51fe..d05da69d53 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 @@ -49,8 +49,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) BEGIN_EVENT_TABLE(wxListBox, wxListBoxBase) EVT_SIZE(wxListBox::OnSize) - - EVT_IDLE(wxListBox::OnIdle) END_EVENT_TABLE() // ---------------------------------------------------------------------------- @@ -65,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; @@ -81,6 +80,35 @@ void wxListBox::Init() m_showScrollbarY = FALSE; } +wxListBox::wxListBox(wxWindow *parent, + wxWindowID id, + const wxPoint &pos, + const wxSize &size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString &name) +{ + Init(); + + Create(parent, id, pos, size, choices, style, validator, name); +} + +bool wxListBox::Create(wxWindow *parent, + wxWindowID id, + const wxPoint &pos, + const wxSize &size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString &name) +{ + wxCArrayString chs(choices); + + return Create(parent, id, pos, size, chs.GetCount(), chs.GetStrings(), + style, validator, name); +} + bool wxListBox::Create(wxWindow *parent, wxWindowID id, const wxPoint &pos, @@ -108,13 +136,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); @@ -129,6 +159,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; } // ---------------------------------------------------------------------------- @@ -137,7 +174,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; @@ -169,7 +217,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); } @@ -194,11 +242,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); } @@ -214,7 +273,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 @@ -232,7 +291,7 @@ void wxListBox::SetString(int n, const wxString& s) } else // no horz scrollbar { - m_strings[n] = s; + (*m_strings)[n] = s; } RefreshItem(n); @@ -244,7 +303,7 @@ void wxListBox::SetString(int n, const wxString& s) void wxListBox::DoClear() { - m_strings.Clear(); + m_strings->Clear(); if ( HasClientObjectData() ) { @@ -281,7 +340,7 @@ void wxListBox::Delete(int n) // refreshed (as GetCount() will be decremented) RefreshFromItemToEnd(n); - m_strings.RemoveAt(n); + m_strings->RemoveAt(n); if ( HasClientObjectData() ) { @@ -601,7 +660,7 @@ void wxListBox::UpdateItems() } } -void wxListBox::OnIdle(wxIdleEvent& event) +void wxListBox::OnInternalIdle() { if ( m_updateScrollbarY || m_updateScrollbarX ) { @@ -624,8 +683,7 @@ void wxListBox::OnIdle(wxIdleEvent& event) m_updateCount = 0; } - - event.Skip(); + wxListBoxBase::OnInternalIdle(); } // ---------------------------------------------------------------------------- @@ -655,7 +713,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; @@ -724,10 +782,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; @@ -773,7 +831,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 @@ -781,11 +839,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; @@ -893,7 +951,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);