]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/listbox.cpp
fixed badly named wxHtmlTag::GetParam() argument: with_quotes, not with_commas
[wxWidgets.git] / src / univ / listbox.cpp
index 7657a08ac6cdc569717c8af40d9d6bb3d5d16c6a..c26aafb29eed8022f3d019b43c76ec13cb7db036 100644 (file)
@@ -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)
@@ -192,11 +192,11 @@ bool wxListBox::Create(wxWindow *parent,
                             validator, name) )
         return false;
 
-    m_strings = new wxArrayString;
+    m_strings = IsSorted() ? new wxArrayString : new wxSortedArrayString;
 
     Set(n, choices);
 
-    SetBestSize(size);
+    SetInitialSize(size);
 
     CreateInputHandler(wxINP_HANDLER_LISTBOX);
 
@@ -217,67 +217,25 @@ wxListBox::~wxListBox()
 // adding/inserting strings
 // ----------------------------------------------------------------------------
 
-int wxCMPFUNC_CONV wxListBoxSortNoCase(wxString* s1, wxString* s2)
+int wxListBox::DoInsertItems(const wxArrayStringsAdapter& items,
+                             unsigned int pos,
+                             void **clientData,
+                             wxClientDataType type)
 {
-    return  s1->CmpNoCase(*s2);
-}
-
-int wxListBox::DoAppendOnly(const wxString& item)
-{
-    unsigned int index;
+    int idx = wxNOT_FOUND;
 
-    if ( IsSorted() )
-    {
-        m_strings->Add(item);
-        m_strings->Sort(wxListBoxSortNoCase);
-        index = m_strings->Index(item);
-    }
-    else
+    const unsigned int numItems = items.GetCount();
+    for ( unsigned int i = 0; i < numItems; ++i )
     {
-        index = m_strings->GetCount();
-        m_strings->Add(item);
-    }
+        const wxString& item = items[i];
+        idx = IsSorted() ? m_strings->Add(item)
+                         : (m_strings->Insert(item, pos), pos++);
 
-    return index;
-}
-
-int wxListBox::DoAppend(const wxString& item)
-{
-    size_t index = DoAppendOnly( item );
+        m_itemsClientData.Insert(NULL, idx);
+        AssignNewItemClientData(idx, clientData, i, type);
 
-    m_itemsClientData.Insert(NULL, index);
-
-    m_updateScrollbarY = true;
-
-    if ( HasHorzScrollbar() )
-    {
-        // has the max width increased?
-        wxCoord width;
-        GetTextExtent(item, &width, NULL);
-        if ( width > m_maxWidth )
-        {
-            m_maxWidth = width;
-            m_maxWidthItem = index;
-            m_updateScrollbarX = true;
-        }
-    }
-
-    RefreshFromItemToEnd(index);
-
-    return index;
-}
-
-void wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos)
-{
-    // the position of the item being added to a sorted listbox can't be
-    // specified
-    wxCHECK_RET( !IsSorted(), _T("can't insert items into sorted listbox") );
-
-    unsigned int count = items.GetCount();
-    for ( unsigned int n = 0; n < count; n++ )
-    {
-        m_strings->Insert(items[n], pos + n);
-        m_itemsClientData.Insert(NULL, pos + n);
+        // call the wxCheckListBox hook
+        OnItemInserted(idx);
     }
 
     // the number of items has changed so we might have to show the scrollbar
@@ -291,29 +249,8 @@ void wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos)
     // note that we have to refresh all the items after the ones we inserted,
     // not just these items
     RefreshFromItemToEnd(pos);
-}
-
-void wxListBox::DoSetItems(const wxArrayString& items, void **clientData)
-{
-    DoClear();
-
-    unsigned int count = items.GetCount();
-    if ( !count )
-        return;
-
-    m_strings->Alloc(count);
 
-    m_itemsClientData.Alloc(count);
-    for ( unsigned int n = 0; n < count; n++ )
-    {
-        unsigned int index = DoAppendOnly(items[n]);
-
-        m_itemsClientData.Insert(clientData ? clientData[n] : NULL, index);
-    }
-
-    m_updateScrollbarY = true;
-
-    RefreshAll();
+    return idx;
 }
 
 void wxListBox::SetString(unsigned int n, const wxString& s)
@@ -355,24 +292,10 @@ void wxListBox::DoClear()
 {
     m_strings->Clear();
 
-    if ( HasClientObjectData() )
-    {
-        unsigned int count = m_itemsClientData.GetCount();
-        for ( unsigned int n = 0; n < count; n++ )
-        {
-            delete (wxClientData *) m_itemsClientData[n];
-        }
-    }
-
     m_itemsClientData.Clear();
     m_selections.Clear();
 
     m_current = -1;
-}
-
-void wxListBox::Clear()
-{
-    DoClear();
 
     m_updateScrollbarY = true;
 
@@ -381,7 +304,7 @@ void wxListBox::Clear()
     RefreshAll();
 }
 
-void wxListBox::Delete(unsigned int n)
+void wxListBox::DoDeleteOneItem(unsigned int n)
 {
     wxCHECK_RET( IsValid(n),
                  _T("invalid index in wxListBox::Delete") );
@@ -392,11 +315,6 @@ void wxListBox::Delete(unsigned int n)
 
     m_strings->RemoveAt(n);
 
-    if ( HasClientObjectData() )
-    {
-        delete (wxClientData *)m_itemsClientData[n];
-    }
-
     m_itemsClientData.RemoveAt(n);
 
     // when the item disappears we must not keep using its index
@@ -458,16 +376,6 @@ void *wxListBox::DoGetItemClientData(unsigned int n) const
     return m_itemsClientData[n];
 }
 
-void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData)
-{
-    m_itemsClientData[n] = clientData;
-}
-
-wxClientData* wxListBox::DoGetItemClientObject(unsigned int n) const
-{
-    return (wxClientData *)m_itemsClientData[n];
-}
-
 // ----------------------------------------------------------------------------
 // selection
 // ----------------------------------------------------------------------------
@@ -476,14 +384,22 @@ void wxListBox::DoSetSelection(int n, bool select)
 {
     if ( select )
     {
-        if ( m_selections.Index(n) == wxNOT_FOUND )
+        if ( n == wxNOT_FOUND )
+        {
+            if ( !HasMultipleSelection() )
+            {
+                // selecting wxNOT_FOUND is documented to deselect all items
+                DeselectAll();
+                return;
+            }
+        }
+        else if ( m_selections.Index(n) == wxNOT_FOUND )
         {
             if ( !HasMultipleSelection() )
             {
                 // selecting an item in a single selection listbox deselects
                 // all the others
                 DeselectAll();
-                return;
             }
 
             m_selections.Add(n);