X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32b1391332e67af96856865ded257aacd6e1e956..d7b284e5c62523c9a43e26977672b4ff7c5b8981:/src/univ/listbox.cpp diff --git a/src/univ/listbox.cpp b/src/univ/listbox.cpp index c586b15801..663611a6c7 100644 --- a/src/univ/listbox.cpp +++ b/src/univ/listbox.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: univ/listbox.cpp +// Name: src/univ/listbox.cpp // Purpose: wxListBox implementation // Author: Vadim Zeitlin // Modified by: @@ -17,10 +17,6 @@ // 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(); @@ -139,12 +136,7 @@ bool wxListBox::Create(wxWindow *parent, 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 ) { @@ -467,10 +461,10 @@ void wxListBox::SetSelection(int n, bool select) int wxListBox::GetSelection() const { - wxCHECK_MSG( !HasMultipleSelection(), -1, + wxCHECK_MSG( !HasMultipleSelection(), wxNOT_FOUND, _T("use wxListBox::GetSelections for ths listbox") ); - return m_selections.IsEmpty() ? -1 : m_selections[0]; + return m_selections.IsEmpty() ? wxNOT_FOUND : m_selections[0]; } int wxCMPFUNC_CONV wxCompareInts(int *n, int *m) @@ -580,9 +574,9 @@ 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; + bool showScrollbarY = (int)nLines*lineHeight > size.y; // check the width too if required wxCoord charWidth, maxWidth; @@ -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; @@ -933,7 +927,7 @@ bool wxListBox::FindItem(const wxString& prefix, bool strictlyAfter) { // the following line will set first correctly to 0 if there is no // selection (m_current == -1) - first = m_current == count - 1 ? 0 : m_current + 1; + first = m_current == (int)(count - 1) ? 0 : m_current + 1; } else // start with the current { @@ -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 < (int)(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