// implementation of wxListBox
// ============================================================================
-IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems)
BEGIN_EVENT_TABLE(wxListBox, wxListBoxBase)
EVT_SIZE(wxListBox::OnSize)
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;
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);
// 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);
}
// ----------------------------------------------------------------------------
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);
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() )
{
void wxListBox::DoClear()
{
- m_strings->Clear();
+ if ( IsSorted() )
+ m_strings.sorted->Clear();
+ else
+ m_strings.unsorted->Clear();
m_itemsClientData.Clear();
m_selections.Clear();
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);
// 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 )
{
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;
}
if ( m_updateCount == -1 )
{
// refresh all
- wxLogTrace(_T("listbox"), _T("Refreshing all"));
+ wxLogTrace(wxT("listbox"), wxT("Refreshing all"));
Refresh();
}
// 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());
wxCoord lineHeight = GetLineHeight();
unsigned int itemFirst = yTop / lineHeight,
itemLast = (yBottom + lineHeight - 1) / lineHeight,
- itemMax = m_strings->GetCount();
+ itemMax = GetCount();
if ( itemFirst >= itemMax )
return;
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);
{
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);
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;
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();
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);
{
// 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
}