Fix assert when adding items with bitmaps wxBitmapComboBox.

The change of r73567 resulted in an assert when adding items with bitmaps to
wxBitmapComboBox without object client data. Fix the code added by this commit
to work for all kinds of client data, including wxClientData_None.

See #14892.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73880 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-04-29 23:13:24 +00:00
parent 0cd8ce0de1
commit 9e86876e69

View File

@@ -133,13 +133,30 @@ void wxBitmapComboBox::RecreateControl()
wxPoint pos = GetPosition();
wxSize size = GetSize();
size.y = GetBestSize().y;
wxArrayString strings = GetStrings();
const wxArrayString strings = GetStrings();
const unsigned numItems = strings.size();
// Save the client data pointers before clearing the control.
wxVector<wxClientData*> clientData;
clientData.reserve(strings.size());
for ( size_t n = 0; n < strings.size(); ++n )
clientData.push_back(GetClientObject(n));
// Save the client data pointers before clearing the control, if any.
const wxClientDataType clientDataType = GetClientDataType();
wxVector<wxClientData*> objectClientData;
wxVector<void*> voidClientData;
switch ( clientDataType )
{
case wxClientData_None:
break;
case wxClientData_Object:
objectClientData.reserve(numItems);
for ( unsigned n = 0; n < numItems; ++n )
objectClientData.push_back(GetClientObject(n));
break;
case wxClientData_Void:
voidClientData.reserve(numItems);
for ( unsigned n = 0; n < numItems; ++n )
voidClientData.push_back(GetClientData(n));
break;
}
wxComboBox::DoClear();
@@ -151,9 +168,14 @@ void wxBitmapComboBox::RecreateControl()
return;
// initialize the controls contents
for ( unsigned int i = 0; i < strings.size(); i++ )
for ( unsigned int i = 0; i < numItems; i++ )
{
wxComboBox::Append(strings[i], clientData[i]);
wxComboBox::Append(strings[i]);
if ( !objectClientData.empty() )
SetClientObject(i, objectClientData[i]);
else if ( !voidClientData.empty() )
SetClientData(i, objectClientData[i]);
}
// and make sure it has the same attributes as before