X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a236aa2058ccf3d36e9cafc20fa7375080c4be50..8d5016b18bfaee2f1694e386a7dff89868a03b6d:/src/univ/listbox.cpp diff --git a/src/univ/listbox.cpp b/src/univ/listbox.cpp index 7c1ca6dcca..520ae86b20 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) @@ -115,7 +115,7 @@ void wxListBox::Init() m_maxWidth = 0; m_scrollRangeY = 0; m_maxWidthItem = -1; - m_strings = NULL; + m_strings.unsorted = NULL; // no items hence no current item m_current = -1; @@ -192,7 +192,10 @@ bool wxListBox::Create(wxWindow *parent, validator, name) ) return false; - m_strings = IsSorted() ? new wxArrayString : new wxSortedArrayString; + if ( IsSorted() ) + m_strings.sorted = new wxSortedArrayString; + else + m_strings.unsorted = new wxArrayString; Set(n, choices); @@ -208,9 +211,34 @@ wxListBox::~wxListBox() // call this just to free the client data -- and avoid leaking memory DoClear(); - delete m_strings; + if ( IsSorted() ) + delete m_strings.sorted; + else + delete m_strings.unsorted; + + m_strings.sorted = NULL; +} + +// ---------------------------------------------------------------------------- +// accessing strings +// ---------------------------------------------------------------------------- + +unsigned int wxListBox::GetCount() const +{ + return IsSorted() ? m_strings.sorted->size() + : m_strings.unsorted->size(); +} + +wxString wxListBox::GetString(unsigned int n) const +{ + return IsSorted() ? m_strings.sorted->Item(n) + : m_strings.unsorted->Item(n); +} - m_strings = NULL; +int wxListBox::FindString(const wxString& s, bool bCase) const +{ + return IsSorted() ? m_strings.sorted->Index(s, bCase) + : m_strings.unsorted->Index(s, bCase); } // ---------------------------------------------------------------------------- @@ -228,8 +256,8 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, for ( unsigned int i = 0; i < numItems; ++i ) { const wxString& item = items[i]; - idx = IsSorted() ? m_strings->Add(item) - : (m_strings->Insert(item, pos), pos++); + idx = IsSorted() ? m_strings.sorted->Add(item) + : (m_strings.unsorted->Insert(item, pos), pos++); m_itemsClientData.Insert(NULL, idx); AssignNewItemClientData(idx, clientData, i, type); @@ -255,9 +283,12 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items, void wxListBox::SetString(unsigned int n, const wxString& s) { - wxCHECK_RET( !IsSorted(), _T("can't set string in sorted listbox") ); + wxCHECK_RET( !IsSorted(), wxT("can't set string in sorted listbox") ); - (*m_strings)[n] = s; + if ( IsSorted() ) + (*m_strings.sorted)[n] = s; + else + (*m_strings.unsorted)[n] = s; if ( HasHorzScrollbar() ) { @@ -290,7 +321,10 @@ void wxListBox::SetString(unsigned int n, const wxString& s) void wxListBox::DoClear() { - m_strings->Clear(); + if ( IsSorted() ) + m_strings.sorted->Clear(); + else + m_strings.unsorted->Clear(); m_itemsClientData.Clear(); m_selections.Clear(); @@ -307,13 +341,16 @@ void wxListBox::DoClear() void wxListBox::DoDeleteOneItem(unsigned int n) { wxCHECK_RET( IsValid(n), - _T("invalid index in wxListBox::Delete") ); + wxT("invalid index in wxListBox::Delete") ); // do it before removing the index as otherwise the last item will not be // refreshed (as GetCount() will be decremented) RefreshFromItemToEnd(n); - m_strings->RemoveAt(n); + if ( IsSorted() ) + m_strings.sorted->RemoveAt(n); + else + m_strings.unsorted->RemoveAt(n); m_itemsClientData.RemoveAt(n); @@ -423,7 +460,7 @@ void wxListBox::DoSetSelection(int n, bool select) // sanity check: a single selection listbox can't have more than one item // selected wxASSERT_MSG( HasMultipleSelection() || (m_selections.GetCount() < 2), - _T("multiple selected items in single selection lbox?") ); + wxT("multiple selected items in single selection lbox?") ); if ( select ) { @@ -435,12 +472,12 @@ void wxListBox::DoSetSelection(int n, bool select) int wxListBox::GetSelection() const { wxCHECK_MSG( !HasMultipleSelection(), wxNOT_FOUND, - _T("use wxListBox::GetSelections for ths listbox") ); + wxT("use wxListBox::GetSelections for ths listbox") ); return m_selections.IsEmpty() ? wxNOT_FOUND : m_selections[0]; } -int wxCMPFUNC_CONV wxCompareInts(int *n, int *m) +static int wxCMPFUNC_CONV wxCompareInts(int *n, int *m) { return *n - *m; } @@ -602,7 +639,7 @@ void wxListBox::UpdateItems() if ( m_updateCount == -1 ) { // refresh all - wxLogTrace(_T("listbox"), _T("Refreshing all")); + wxLogTrace(wxT("listbox"), wxT("Refreshing all")); Refresh(); } @@ -619,7 +656,7 @@ void wxListBox::UpdateItems() // entire line(s) CalcScrolledPosition(0, rect.y, NULL, &rect.y); - wxLogTrace(_T("listbox"), _T("Refreshing items %d..%d (%d-%d)"), + wxLogTrace(wxT("listbox"), wxT("Refreshing items %d..%d (%d-%d)"), m_updateFrom, m_updateFrom + m_updateCount - 1, rect.GetTop(), rect.GetBottom()); @@ -680,7 +717,7 @@ void wxListBox::DoDraw(wxControlRenderer *renderer) wxCoord lineHeight = GetLineHeight(); unsigned int itemFirst = yTop / lineHeight, itemLast = (yBottom + lineHeight - 1) / lineHeight, - itemMax = m_strings->GetCount(); + itemMax = GetCount(); if ( itemFirst >= itemMax ) return; @@ -689,7 +726,7 @@ void wxListBox::DoDraw(wxControlRenderer *renderer) itemLast = itemMax; // do draw them - wxLogTrace(_T("listbox"), _T("Repainting items %d..%d"), + wxLogTrace(wxT("listbox"), wxT("Repainting items %d..%d"), itemFirst, itemLast); DoDrawRange(renderer, itemFirst, itemLast); @@ -749,7 +786,7 @@ wxCoord wxListBox::GetMaxWidth() const { wxListBox *self = wxConstCast(this, wxListBox); wxCoord width; - unsigned int count = m_strings->GetCount(); + unsigned int count = GetCount(); for ( unsigned int n = 0; n < count; n++ ) { GetTextExtent(this->GetString(n), &width, NULL); @@ -806,7 +843,7 @@ wxSize wxListBox::DoGetBestClientSize() const wxCoord width = 0, height = 0; - unsigned int count = m_strings->GetCount(); + unsigned int count = GetCount(); for ( unsigned int n = 0; n < count; n++ ) { wxCoord w,h; @@ -910,7 +947,7 @@ bool wxListBox::FindItem(const wxString& prefix, bool strictlyAfter) int last = first == 0 ? count - 1 : first - 1; // if this is not true we'd never exit from the loop below! - wxASSERT_MSG( first < (int)count && last < (int)count, _T("logic error") ); + wxASSERT_MSG( first < (int)count && last < (int)count, wxT("logic error") ); // precompute it outside the loop size_t len = prefix.length(); @@ -1156,7 +1193,7 @@ bool wxListBox::PerformAction(const wxControlAction& action, AnchorSelection(item == -1 ? m_current : item); else if ( action == wxACTION_LISTBOX_SELECTALL || action == wxACTION_LISTBOX_SELTOGGLE ) - wxFAIL_MSG(_T("unimplemented yet")); + wxFAIL_MSG(wxT("unimplemented yet")); else return wxControl::PerformAction(action, numArg, strArg); @@ -1467,7 +1504,7 @@ bool wxStdListboxInputHandler::HandleMouseMove(wxInputConsumer *consumer, { // pass something into strArg to tell the listbox that it shouldn't // send the notification message: see PerformAction() above - lbox->PerformAction(m_actionMouse, item, _T("no")); + lbox->PerformAction(m_actionMouse, item, wxT("no")); } // else: don't pass invalid index to the listbox }