]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/listbox.cpp
wxTinderbox build fix.
[wxWidgets.git] / src / univ / listbox.cpp
index 1ece01a74bc13c6357450a6f71a669f1ab53498e..9b26f6c6144f717ccbfd7ad0504f9dbfe486f883 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        univ/listbox.cpp
+// Name:        src/univ/listbox.cpp
 // Purpose:     wxListBox implementation
 // Author:      Vadim Zeitlin
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "univlistbox.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
@@ -88,6 +84,7 @@ wxListBox::wxListBox(wxWindow *parent,
                      long style,
                      const wxValidator& validator,
                      const wxString &name)
+          :wxScrollHelper(this)
 {
     Init();
 
@@ -135,16 +132,11 @@ bool wxListBox::Create(wxWindow *parent,
         style |= wxBORDER_SUNKEN;
 #endif
 
-    if ( !wxControl::Create(parent, id, pos, size, style, 
+    if ( !wxControl::Create(parent, id, pos, size, style,
                             validator, name) )
         return false;
 
-    SetWindow(this);
-
-    if ( style & wxLB_SORT )
-        m_stringsSorted = new wxSortedArrayString;
-    else
-        m_strings = new wxArrayString;
+    m_strings = new wxArrayString;
 
     Set(n, choices);
 
@@ -160,10 +152,7 @@ wxListBox::~wxListBox()
     // call this just to free the client data -- and avoid leaking memory
     DoClear();
 
-    if ( IsSorted() )
-        delete m_stringsSorted;
-    else
-        delete m_strings;
+    delete m_strings;
 
     m_strings = NULL;
 }
@@ -172,13 +161,20 @@ wxListBox::~wxListBox()
 // adding/inserting strings
 // ----------------------------------------------------------------------------
 
-int wxListBox::DoAppend(const wxString& item)
+int wxCMPFUNC_CONV wxListBoxSortNoCase(wxString* s1, wxString* s2)
+{
+    return  s1->CmpNoCase(*s2);
+}
+
+int wxListBox::DoAppendOnly(const wxString& item)
 {
     size_t index;
 
     if ( IsSorted() )
     {
-        index = m_stringsSorted->Add(item);
+        m_strings->Add(item);
+        m_strings->Sort(wxListBoxSortNoCase);
+        index = m_strings->Index(item);
     }
     else
     {
@@ -186,6 +182,13 @@ int wxListBox::DoAppend(const wxString& item)
         m_strings->Add(item);
     }
 
+    return index;
+}
+
+int wxListBox::DoAppend(const wxString& item)
+{
+    size_t index = DoAppendOnly( item );
+
     m_itemsClientData.Insert(NULL, index);
 
     m_updateScrollbarY = true;
@@ -243,20 +246,11 @@ void wxListBox::DoSetItems(const wxArrayString& items, void **clientData)
         return;
 
     m_strings->Alloc(count);
+
     m_itemsClientData.Alloc(count);
     for ( size_t n = 0; n < count; n++ )
     {
-        size_t index;
-
-        if ( IsSorted() )
-        {
-            index = m_stringsSorted->Add(items[n]);
-        }
-        else
-        {
-            index = m_strings->GetCount();
-            m_strings->Add(items[n]);
-        }
+        size_t index = DoAppendOnly(items[n]);
 
         m_itemsClientData.Insert(clientData ? clientData[n] : NULL, index);
     }
@@ -268,12 +262,16 @@ void wxListBox::DoSetItems(const wxArrayString& items, void **clientData)
 
 void wxListBox::SetString(int n, const wxString& s)
 {
+    wxCHECK_RET( !IsSorted(), _T("can't set string in sorted listbox") );
+
+    (*m_strings)[n] = s;
+
     if ( HasHorzScrollbar() )
     {
         // we need to update m_maxWidth as changing the string may cause the
         // horz scrollbar [dis]appear
         wxCoord width;
-        (*m_strings)[n] = s;
+
         GetTextExtent(s, &width, NULL);
 
         // it might have increased if the new string is long
@@ -289,10 +287,6 @@ void wxListBox::SetString(int n, const wxString& s)
             RefreshHorzScrollbar();
         }
     }
-    else // no horz scrollbar
-    {
-        (*m_strings)[n] = s;
-    }
 
     RefreshItem(n);
 }
@@ -333,7 +327,7 @@ void wxListBox::Clear()
 
 void wxListBox::Delete(int n)
 {
-    wxCHECK_RET( n >= 0 && n < GetCount(),
+    wxCHECK_RET( IsValid(n),
                  _T("invalid index in wxListBox::Delete") );
 
     // do it before removing the index as otherwise the last item will not be
@@ -422,7 +416,7 @@ wxClientData* wxListBox::DoGetItemClientObject(int n) const
 // selection
 // ----------------------------------------------------------------------------
 
-void wxListBox::SetSelection(int n, bool select)
+void wxListBox::DoSetSelection(int n, bool select)
 {
     if ( select )
     {
@@ -580,7 +574,7 @@ void wxListBox::UpdateScrollbars()
     wxSize size = GetClientSize();
 
     // is our height enough to show all items?
-    int nLines = GetCount();
+    size_t nLines = GetCount();
     wxCoord lineHeight = GetLineHeight();
     bool showScrollbarY = nLines*lineHeight > size.y;
 
@@ -785,7 +779,7 @@ wxCoord wxListBox::GetMaxWidth() const
         size_t count = m_strings->GetCount();
         for ( size_t n = 0; n < count; n++ )
         {
-            GetTextExtent((*m_strings)[n], &width, NULL);
+            GetTextExtent(this->GetString(n), &width, NULL);
             if ( width > m_maxWidth )
             {
                 self->m_maxWidth = width;
@@ -843,7 +837,7 @@ wxSize wxListBox::DoGetBestClientSize() const
     for ( size_t n = 0; n < count; n++ )
     {
         wxCoord w,h;
-        GetTextExtent((*m_strings)[n], &w, &h);
+        GetTextExtent(this->GetString(n), &w, &h);
 
         if ( w > width )
             width = w;
@@ -893,7 +887,7 @@ bool wxListBox::SendEvent(wxEventType type, int item)
         event.SetString(GetString(item));
     }
 
-    event.m_commandInt = item;
+    event.SetInt(item);
 
     return GetEventHandler()->ProcessEvent(event);
 }
@@ -919,8 +913,8 @@ void wxListBox::SetCurrentItem(int n)
 
 bool wxListBox::FindItem(const wxString& prefix, bool strictlyAfter)
 {
-    int count = GetCount();
-    if ( !count )
+    size_t count = GetCount();
+    if ( count==0 )
     {
         // empty listbox, we can't find anything in it
         return false;
@@ -943,15 +937,15 @@ 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 < count && last < count, _T("logic error") );
+    wxASSERT_MSG( first < (int)count && last < (int)count, _T("logic error") );
 
     // precompute it outside the loop
     size_t len = prefix.length();
 
     // loop over all items in the listbox
-    for ( int item = first; item != last; item < count - 1 ? item++ : item = 0 )
+    for ( int item = first; item != (int)last; item < count - 1 ? item++ : item = 0 )
     {
-        if ( wxStrnicmp((*m_strings)[item], prefix, len) == 0 )
+        if ( wxStrnicmp(this->GetString(item).c_str(), prefix, len) == 0 )
         {
             SetCurrentItem(item);
 
@@ -1061,8 +1055,8 @@ void wxListBox::ExtendSelection(int itemTo)
         SetSelection(n);
     }
 
-    int count = GetCount();
-    for ( ; n < count; n++ )
+    size_t count = GetCount();
+    for ( ; n < (int)count; n++ )
     {
         Deselect(n);
     }
@@ -1236,7 +1230,7 @@ int wxStdListboxInputHandler::FixItemIndex(const wxListBox *lbox,
         // mouse is above the first item
         item = 0;
     }
-    else if ( item >= lbox->GetCount() )
+    else if ( (size_t)item >= lbox->GetCount() )
     {
         // mouse is below the last item
         item = lbox->GetCount() - 1;
@@ -1247,7 +1241,7 @@ int wxStdListboxInputHandler::FixItemIndex(const wxListBox *lbox,
 
 bool wxStdListboxInputHandler::IsValidIndex(const wxListBox *lbox, int item)
 {
-    return item >= 0 && item < lbox->GetCount();
+    return item >= 0 && (size_t)item < lbox->GetCount();
 }
 
 wxControlAction
@@ -1380,7 +1374,7 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
                 break;
 
             default:
-                if ( (keycode < 255) && wxIsalnum(keycode) )
+                if ( (keycode < 255) && wxIsalnum((wxChar)keycode) )
                 {
                     action = wxACTION_LISTBOX_FIND;
                     strArg = (wxChar)keycode;