X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a236aa2058ccf3d36e9cafc20fa7375080c4be50..ccd5d46c7b69632eaa231e8fc7801dd5af2faaa8:/src/msw/choice.cpp diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index 4d834267cd..14a10703bc 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -158,6 +158,21 @@ bool wxChoice::CreateAndInit(wxWindow *parent, return true; } +void wxChoice::SetLabel(const wxString& label) +{ + if ( FindString(label) == wxNOT_FOUND ) + { + // unless we explicitly do this here, CB_GETCURSEL will continue to + // return the index of the previously selected item which will result + // in wrongly replacing the value being set now with the previously + // value if the user simply opens and closes (without selecting + // anything) the combobox popup + SetSelection(-1); + } + + wxChoiceBase::SetLabel(label); +} + bool wxChoice::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, @@ -363,25 +378,22 @@ void wxChoice::SetString(unsigned int n, const wxString& s) // we have to delete and add back the string as there is no way to change a // string in place - // we need to preserve the client data - void *data; - if ( m_clientDataItemsType != wxClientData_None ) - { - data = DoGetItemClientData(n); - } - else // no client data - { - data = NULL; - } + // we need to preserve the client data manually + void *oldData = NULL; + wxClientData *oldObjData = NULL; + if ( HasClientUntypedData() ) + oldData = GetClientData(n); + else if ( HasClientObjectData() ) + oldObjData = GetClientObject(n); ::SendMessage(GetHwnd(), CB_DELETESTRING, n, 0); ::SendMessage(GetHwnd(), CB_INSERTSTRING, n, (LPARAM)s.wx_str() ); - if ( data ) - { - DoSetItemClientData(n, data); - } - //else: it's already NULL by default + // restore the client data + if ( oldData ) + SetClientData(n, oldData); + else if ( oldObjData ) + SetClientObject(n, oldObjData); InvalidateBestSize(); } @@ -691,13 +703,6 @@ bool wxChoice::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) // need to reset the selection back to it if it's eventually // cancelled by user m_lastAcceptedSelection = GetCurrentSelection(); - if ( m_lastAcceptedSelection == -1 ) - { - // no current selection so no need to restore it later (this - // happens when opening a combobox containing text not from its - // list of items and we shouldn't erase this text) - m_lastAcceptedSelection = wxID_NONE; - } break; case CBN_CLOSEUP: