X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/131b1fba9dbedc86a0b5d7861ca374800f3ad40d..298c25c3a5b9d5d6b92310a54f860cd48627888b:/src/generic/odcombo.cpp diff --git a/src/generic/odcombo.cpp b/src/generic/odcombo.cpp index 0df20a054b..fa036b21e2 100644 --- a/src/generic/odcombo.cpp +++ b/src/generic/odcombo.cpp @@ -33,6 +33,7 @@ #include "wx/dcclient.h" #include "wx/settings.h" #include "wx/dialog.h" + #include "wx/textctrl.h" #endif #include "wx/combo.h" @@ -208,16 +209,15 @@ void wxVListBoxComboPopup::DismissWithEvent() Dismiss(); - wxString valStr; if ( selection != wxNOT_FOUND ) - valStr = m_strings[selection]; + m_stringValue = m_strings[selection]; else - valStr = wxEmptyString; + m_stringValue = wxEmptyString; - m_value = selection; + if ( m_stringValue != m_combo->GetValue() ) + m_combo->SetValueWithEvent(m_stringValue); - if ( valStr != m_combo->GetValue() ) - m_combo->SetValueWithEvent(valStr); + m_value = selection; SendComboBoxEvent(selection); } @@ -246,8 +246,14 @@ void wxVListBoxComboPopup::SendComboBoxEvent( int selection ) // returns true if key was consumed bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar unicode ) { + const int itemCount = GetCount(); + + // keys do nothing in the empty control and returning immediately avoids + // using invalid indices below + if ( !itemCount ) + return false; + int value = m_value; - int itemCount = GetCount(); int comboStyle = m_combo->GetWindowStyle(); // this is the character equivalent of the code @@ -608,9 +614,7 @@ void wxVListBoxComboPopup::SetString( int item, const wxString& str ) wxString wxVListBoxComboPopup::GetStringValue() const { - if ( m_value >= 0 ) - return m_strings[m_value]; - return wxEmptyString; + return m_stringValue; } void wxVListBoxComboPopup::SetSelection( int item ) @@ -620,6 +624,11 @@ void wxVListBoxComboPopup::SetSelection( int item ) m_value = item; + if ( item >= 0 ) + m_stringValue = m_strings[item]; + else + m_stringValue = wxEmptyString; + if ( IsCreated() ) wxVListBox::SetSelection(item); } @@ -633,10 +642,13 @@ void wxVListBoxComboPopup::SetStringValue( const wxString& value ) { int index = m_strings.Index(value); - m_value = index; + m_stringValue = value; - if ( index >= -1 && index < (int)wxVListBox::GetItemCount() ) + if ( index >= 0 && index < (int)wxVListBox::GetItemCount() ) + { wxVListBox::SetSelection(index); + m_value = index; + } } void wxVListBoxComboPopup::CalcWidths() @@ -1015,13 +1027,29 @@ int wxOwnerDrawnComboBox::DoInsertItems(const wxArrayStringsAdapter& items, EnsurePopupControl(); const unsigned int count = items.GetCount(); - for( unsigned int i = 0; i < count; ++i, ++pos ) + + if ( HasFlag(wxCB_SORT) ) { - GetVListBoxComboPopup()->Insert(items[i], pos); - AssignNewItemClientData(pos, clientData, i, type); + int n = pos; + + for ( unsigned int i = 0; i < count; ++i ) + { + int n = GetVListBoxComboPopup()->Append(items[i]); + AssignNewItemClientData(n, clientData, i, type); + } + + return n; } + else + { + for ( unsigned int i = 0; i < count; ++i, ++pos ) + { + GetVListBoxComboPopup()->Insert(items[i], pos); + AssignNewItemClientData(pos, clientData, i, type); + } - return pos - 1; + return pos - 1; + } } void wxOwnerDrawnComboBox::DoSetItemClientData(unsigned int n, void* clientData)