]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/listbox.cpp
use wxIsSameDouble() and wxIsNullDouble() for warning-less double comparison of doubles
[wxWidgets.git] / src / univ / listbox.cpp
index d05da69d53f92793babfe4d21e0fbadc8b506946..a938fbd880d12f444a1822b5338d8fdf85dc2d05 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "univlistbox.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
@@ -68,7 +64,7 @@ void wxListBox::Init()
     // no items hence no current item
     m_current = -1;
     m_selAnchor = -1;
     // no items hence no current item
     m_current = -1;
     m_selAnchor = -1;
-    m_currentChanged = FALSE;
+    m_currentChanged = false;
 
     // no need to update anything initially
     m_updateCount = 0;
 
     // no need to update anything initially
     m_updateCount = 0;
@@ -77,7 +73,7 @@ void wxListBox::Init()
     m_updateScrollbarX =
     m_showScrollbarX =
     m_updateScrollbarY =
     m_updateScrollbarX =
     m_showScrollbarX =
     m_updateScrollbarY =
-    m_showScrollbarY = FALSE;
+    m_showScrollbarY = false;
 }
 
 wxListBox::wxListBox(wxWindow *parent,
 }
 
 wxListBox::wxListBox(wxWindow *parent,
@@ -135,16 +131,13 @@ bool wxListBox::Create(wxWindow *parent,
         style |= wxBORDER_SUNKEN;
 #endif
 
         style |= wxBORDER_SUNKEN;
 #endif
 
-    if ( !wxControl::Create(parent, id, pos, size, style, 
+    if ( !wxControl::Create(parent, id, pos, size, style,
                             validator, name) )
                             validator, name) )
-        return FALSE;
+        return false;
 
     SetWindow(this);
 
 
     SetWindow(this);
 
-    if ( style & wxLB_SORT )
-        m_stringsSorted = new wxSortedArrayString;
-    else
-        m_strings = new wxArrayString;
+    m_strings = new wxArrayString;
 
     Set(n, choices);
 
 
     Set(n, choices);
 
@@ -152,7 +145,7 @@ bool wxListBox::Create(wxWindow *parent,
 
     CreateInputHandler(wxINP_HANDLER_LISTBOX);
 
 
     CreateInputHandler(wxINP_HANDLER_LISTBOX);
 
-    return TRUE;
+    return true;
 }
 
 wxListBox::~wxListBox()
 }
 
 wxListBox::~wxListBox()
@@ -160,10 +153,7 @@ wxListBox::~wxListBox()
     // call this just to free the client data -- and avoid leaking memory
     DoClear();
 
     // 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;
 }
 
     m_strings = NULL;
 }
@@ -172,13 +162,20 @@ wxListBox::~wxListBox()
 // adding/inserting strings
 // ----------------------------------------------------------------------------
 
 // 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() )
     {
 {
     size_t index;
 
     if ( IsSorted() )
     {
-        index = m_stringsSorted->Add(item);
+        m_strings->Add(item);
+        m_strings->Sort(wxListBoxSortNoCase);
+        index = m_strings->Index(item);
     }
     else
     {
     }
     else
     {
@@ -186,9 +183,16 @@ int wxListBox::DoAppend(const wxString& item)
         m_strings->Add(item);
     }
 
         m_strings->Add(item);
     }
 
+    return index;
+}
+
+int wxListBox::DoAppend(const wxString& item)
+{
+    size_t index = DoAppendOnly( item );
+
     m_itemsClientData.Insert(NULL, index);
 
     m_itemsClientData.Insert(NULL, index);
 
-    m_updateScrollbarY = TRUE;
+    m_updateScrollbarY = true;
 
     if ( HasHorzScrollbar() )
     {
 
     if ( HasHorzScrollbar() )
     {
@@ -199,7 +203,7 @@ int wxListBox::DoAppend(const wxString& item)
         {
             m_maxWidth = width;
             m_maxWidthItem = index;
         {
             m_maxWidth = width;
             m_maxWidthItem = index;
-            m_updateScrollbarX = TRUE;
+            m_updateScrollbarX = true;
         }
     }
 
         }
     }
 
@@ -222,7 +226,7 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
     }
 
     // the number of items has changed so we might have to show the scrollbar
     }
 
     // the number of items has changed so we might have to show the scrollbar
-    m_updateScrollbarY = TRUE;
+    m_updateScrollbarY = true;
 
     // the max width also might have changed - just recalculate it instead of
     // keeping track of it here, this is probably more efficient for a typical
 
     // the max width also might have changed - just recalculate it instead of
     // keeping track of it here, this is probably more efficient for a typical
@@ -243,37 +247,32 @@ void wxListBox::DoSetItems(const wxArrayString& items, void **clientData)
         return;
 
     m_strings->Alloc(count);
         return;
 
     m_strings->Alloc(count);
+
     m_itemsClientData.Alloc(count);
     for ( size_t n = 0; n < count; n++ )
     {
     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);
     }
 
 
         m_itemsClientData.Insert(clientData ? clientData[n] : NULL, index);
     }
 
-    m_updateScrollbarY = TRUE;
+    m_updateScrollbarY = true;
 
     RefreshAll();
 }
 
 void wxListBox::SetString(int n, const wxString& s)
 {
 
     RefreshAll();
 }
 
 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;
     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
         GetTextExtent(s, &width, NULL);
 
         // it might have increased if the new string is long
@@ -281,7 +280,7 @@ void wxListBox::SetString(int n, const wxString& s)
         {
             m_maxWidth = width;
             m_maxWidthItem = n;
         {
             m_maxWidth = width;
             m_maxWidthItem = n;
-            m_updateScrollbarX = TRUE;
+            m_updateScrollbarX = true;
         }
         // or also decreased if the old string was the longest one
         else if ( n == m_maxWidthItem )
         }
         // or also decreased if the old string was the longest one
         else if ( n == m_maxWidthItem )
@@ -289,10 +288,6 @@ void wxListBox::SetString(int n, const wxString& s)
             RefreshHorzScrollbar();
         }
     }
             RefreshHorzScrollbar();
         }
     }
-    else // no horz scrollbar
-    {
-        (*m_strings)[n] = s;
-    }
 
     RefreshItem(n);
 }
 
     RefreshItem(n);
 }
@@ -324,7 +319,7 @@ void wxListBox::Clear()
 {
     DoClear();
 
 {
     DoClear();
 
-    m_updateScrollbarY = TRUE;
+    m_updateScrollbarY = true;
 
     RefreshHorzScrollbar();
 
 
     RefreshHorzScrollbar();
 
@@ -385,7 +380,7 @@ void wxListBox::Delete(int n)
     }
 
     // the number of items has changed, hence the scrollbar may disappear
     }
 
     // the number of items has changed, hence the scrollbar may disappear
-    m_updateScrollbarY = TRUE;
+    m_updateScrollbarY = true;
 
     // finally, if the longest item was deleted the scrollbar may disappear
     if ( n == m_maxWidthItem )
 
     // finally, if the longest item was deleted the scrollbar may disappear
     if ( n == m_maxWidthItem )
@@ -422,7 +417,7 @@ wxClientData* wxListBox::DoGetItemClientObject(int n) const
 // selection
 // ----------------------------------------------------------------------------
 
 // selection
 // ----------------------------------------------------------------------------
 
-void wxListBox::SetSelection(int n, bool select)
+void wxListBox::DoSetSelection(int n, bool select)
 {
     if ( select )
     {
 {
     if ( select )
     {
@@ -572,7 +567,7 @@ void wxListBox::RefreshAll()
 void wxListBox::RefreshHorzScrollbar()
 {
     m_maxWidth = 0; // recalculate it
 void wxListBox::RefreshHorzScrollbar()
 {
     m_maxWidth = 0; // recalculate it
-    m_updateScrollbarX = TRUE;
+    m_updateScrollbarX = true;
 }
 
 void wxListBox::UpdateScrollbars()
 }
 
 void wxListBox::UpdateScrollbars()
@@ -596,7 +591,7 @@ void wxListBox::UpdateScrollbars()
     else // never show it
     {
         charWidth = maxWidth = 0;
     else // never show it
     {
         charWidth = maxWidth = 0;
-        showScrollbarX = FALSE;
+        showScrollbarX = false;
     }
 
     // what should be the scrollbar range now?
     }
 
     // what should be the scrollbar range now?
@@ -656,7 +651,7 @@ void wxListBox::UpdateItems()
                    m_updateFrom, m_updateFrom + m_updateCount - 1,
                    rect.GetTop(), rect.GetBottom());
 
                    m_updateFrom, m_updateFrom + m_updateCount - 1,
                    rect.GetTop(), rect.GetBottom());
 
-        Refresh(TRUE, &rect);
+        Refresh(true, &rect);
     }
 }
 
     }
 }
 
@@ -667,14 +662,14 @@ void wxListBox::OnInternalIdle()
         UpdateScrollbars();
 
         m_updateScrollbarX =
         UpdateScrollbars();
 
         m_updateScrollbarX =
-        m_updateScrollbarY = FALSE;
+        m_updateScrollbarY = false;
     }
 
     if ( m_currentChanged )
     {
         DoEnsureVisible(m_current);
 
     }
 
     if ( m_currentChanged )
     {
         DoEnsureVisible(m_current);
 
-        m_currentChanged = FALSE;
+        m_currentChanged = false;
     }
 
     if ( m_updateCount )
     }
 
     if ( m_updateCount )
@@ -741,13 +736,13 @@ void wxListBox::DoDrawRange(wxControlRenderer *renderer,
 bool wxListBox::SetFont(const wxFont& font)
 {
     if ( !wxControl::SetFont(font) )
 bool wxListBox::SetFont(const wxFont& font)
 {
     if ( !wxControl::SetFont(font) )
-        return FALSE;
+        return false;
 
     CalcItemsPerPage();
 
     RefreshAll();
 
 
     CalcItemsPerPage();
 
     RefreshAll();
 
-    return TRUE;
+    return true;
 }
 
 void wxListBox::CalcItemsPerPage()
 }
 
 void wxListBox::CalcItemsPerPage()
@@ -785,7 +780,7 @@ wxCoord wxListBox::GetMaxWidth() const
         size_t count = m_strings->GetCount();
         for ( size_t n = 0; n < count; n++ )
         {
         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;
             if ( width > m_maxWidth )
             {
                 self->m_maxWidth = width;
@@ -804,7 +799,7 @@ void wxListBox::OnSize(wxSizeEvent& event)
 
     // the scrollbars might [dis]appear
     m_updateScrollbarX =
 
     // the scrollbars might [dis]appear
     m_updateScrollbarX =
-    m_updateScrollbarY = TRUE;
+    m_updateScrollbarY = true;
 
     event.Skip();
 }
 
     event.Skip();
 }
@@ -843,7 +838,7 @@ wxSize wxListBox::DoGetBestClientSize() const
     for ( size_t n = 0; n < count; n++ )
     {
         wxCoord w,h;
     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;
 
         if ( w > width )
             width = w;
@@ -893,7 +888,7 @@ bool wxListBox::SendEvent(wxEventType type, int item)
         event.SetString(GetString(item));
     }
 
         event.SetString(GetString(item));
     }
 
-    event.m_commandInt = item;
+    event.SetInt(item);
 
     return GetEventHandler()->ProcessEvent(event);
 }
 
     return GetEventHandler()->ProcessEvent(event);
 }
@@ -909,7 +904,7 @@ void wxListBox::SetCurrentItem(int n)
 
         if ( m_current != -1 )
         {
 
         if ( m_current != -1 )
         {
-            m_currentChanged = TRUE;
+            m_currentChanged = true;
 
             RefreshItem(m_current);
         }
 
             RefreshItem(m_current);
         }
@@ -923,7 +918,7 @@ bool wxListBox::FindItem(const wxString& prefix, bool strictlyAfter)
     if ( !count )
     {
         // empty listbox, we can't find anything in it
     if ( !count )
     {
         // empty listbox, we can't find anything in it
-        return FALSE;
+        return false;
     }
 
     // start either from the current item or from the next one if strictlyAfter
     }
 
     // start either from the current item or from the next one if strictlyAfter
@@ -951,7 +946,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 )
     {
     // 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(this->GetString(item).c_str(), prefix, len) == 0 )
         {
             SetCurrentItem(item);
 
         {
             SetCurrentItem(item);
 
@@ -964,12 +959,12 @@ bool wxListBox::FindItem(const wxString& prefix, bool strictlyAfter)
                     AnchorSelection(item);
             }
 
                     AnchorSelection(item);
             }
 
-            return TRUE;
+            return true;
         }
     }
 
     // nothing found
         }
     }
 
     // nothing found
-    return FALSE;
+    return false;
 }
 
 void wxListBox::EnsureVisible(int n)
 }
 
 void wxListBox::EnsureVisible(int n)
@@ -979,7 +974,7 @@ void wxListBox::EnsureVisible(int n)
         UpdateScrollbars();
 
         m_updateScrollbarX =
         UpdateScrollbars();
 
         m_updateScrollbarX =
-        m_updateScrollbarY = FALSE;
+        m_updateScrollbarY = false;
     }
 
     DoEnsureVisible(n);
     }
 
     DoEnsureVisible(n);
@@ -1193,7 +1188,7 @@ bool wxListBox::PerformAction(const wxControlAction& action,
     else
         return wxControl::PerformAction(action, numArg, strArg);
 
     else
         return wxControl::PerformAction(action, numArg, strArg);
 
-    return TRUE;
+    return true;
 }
 
 // ============================================================================
 }
 
 // ============================================================================
@@ -1207,7 +1202,7 @@ wxStdListboxInputHandler::wxStdListboxInputHandler(wxInputHandler *handler,
     m_btnCapture = 0;
     m_toggleOnPressAlways = toggleOnPressAlways;
     m_actionMouse = wxACTION_NONE;
     m_btnCapture = 0;
     m_toggleOnPressAlways = toggleOnPressAlways;
     m_actionMouse = wxACTION_NONE;
-    m_trackMouseOutside = TRUE;
+    m_trackMouseOutside = true;
 }
 
 int wxStdListboxInputHandler::HitTest(const wxListBox *lbox,
 }
 
 int wxStdListboxInputHandler::HitTest(const wxListBox *lbox,
@@ -1315,7 +1310,7 @@ wxStdListboxInputHandler::SetupCapture(wxListBox *lbox,
     }
 
     // by default we always do track it
     }
 
     // by default we always do track it
-    m_trackMouseOutside = TRUE;
+    m_trackMouseOutside = true;
 
     return action;
 }
 
     return action;
 }
@@ -1327,7 +1322,7 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
     // we're only interested in the key press events
     if ( pressed && !event.AltDown() )
     {
     // we're only interested in the key press events
     if ( pressed && !event.AltDown() )
     {
-        bool isMoveCmd = TRUE;
+        bool isMoveCmd = true;
         int style = consumer->GetInputWindow()->GetWindowStyle();
 
         wxControlAction action;
         int style = consumer->GetInputWindow()->GetWindowStyle();
 
         wxControlAction action;
@@ -1370,24 +1365,24 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
                 if ( style & wxLB_MULTIPLE )
                 {
                     action = wxACTION_LISTBOX_TOGGLE;
                 if ( style & wxLB_MULTIPLE )
                 {
                     action = wxACTION_LISTBOX_TOGGLE;
-                    isMoveCmd = FALSE;
+                    isMoveCmd = false;
                 }
                 break;
 
             case WXK_RETURN:
                 action = wxACTION_LISTBOX_ACTIVATE;
                 }
                 break;
 
             case WXK_RETURN:
                 action = wxACTION_LISTBOX_ACTIVATE;
-                isMoveCmd = FALSE;
+                isMoveCmd = false;
                 break;
 
             default:
                 break;
 
             default:
-                if ( (keycode < 255) && wxIsalnum(keycode) )
+                if ( (keycode < 255) && wxIsalnum((wxChar)keycode) )
                 {
                     action = wxACTION_LISTBOX_FIND;
                     strArg = (wxChar)keycode;
                 }
         }
 
                 {
                     action = wxACTION_LISTBOX_FIND;
                     strArg = (wxChar)keycode;
                 }
         }
 
-        if ( !!action )
+        if ( !action.IsEmpty() )
         {
             consumer->PerformAction(action, -1, strArg);
 
         {
             consumer->PerformAction(action, -1, strArg);
 
@@ -1412,7 +1407,7 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
                 //else: nothing to do for multiple selection listboxes
             }
 
                 //else: nothing to do for multiple selection listboxes
             }
 
-            return TRUE;
+            return true;
         }
     }
 
         }
     }
 
@@ -1454,11 +1449,11 @@ bool wxStdListboxInputHandler::HandleMouse(wxInputConsumer *consumer,
         action = wxACTION_LISTBOX_ACTIVATE;
     }
 
         action = wxACTION_LISTBOX_ACTIVATE;
     }
 
-    if ( !!action )
+    if ( !action.IsEmpty() )
     {
         lbox->PerformAction(action, item);
 
     {
         lbox->PerformAction(action, item);
 
-        return TRUE;
+        return true;
     }
 
     return wxStdInputHandler::HandleMouse(consumer, event);
     }
 
     return wxStdInputHandler::HandleMouse(consumer, event);
@@ -1478,7 +1473,7 @@ bool wxStdListboxInputHandler::HandleMouseMove(wxInputConsumer *consumer,
             // when we do it ourselves): in this case we only react to
             // the mouse messages when they happen inside the listbox
             if ( lbox->HitTest(event.GetPosition()) != wxHT_WINDOW_INSIDE )
             // when we do it ourselves): in this case we only react to
             // the mouse messages when they happen inside the listbox
             if ( lbox->HitTest(event.GetPosition()) != wxHT_WINDOW_INSIDE )
-                return FALSE;
+                return false;
         }
 
         int item = HitTest(lbox, event);
         }
 
         int item = HitTest(lbox, event);
@@ -1489,7 +1484,7 @@ bool wxStdListboxInputHandler::HandleMouseMove(wxInputConsumer *consumer,
             // events
             SetupCapture(lbox, event, item);
 
             // events
             SetupCapture(lbox, event, item);
 
-            m_trackMouseOutside = FALSE;
+            m_trackMouseOutside = false;
         }
 
         if ( IsValidIndex(lbox, item) )
         }
 
         if ( IsValidIndex(lbox, item) )