Fixes #10437 (wxDataObjectComposite::Add may add objects having data formats that already exist in the composite object)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58549 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2009-01-31 13:41:11 +00:00
parent 0dd48109b4
commit dc8928439f
2 changed files with 28 additions and 9 deletions

View File

@@ -297,7 +297,7 @@ public:
protected: protected:
// returns the pointer to the object which supports this format or NULL // returns the pointer to the object which supports this format or NULL
wxDataObjectSimple *GetObject(const wxDataFormat& format) const; wxDataObjectSimple *GetObject(const wxDataFormat& format, wxDataObjectBase::Direction dir=Get) const;
private: private:
// the list of all (simple) data objects whose formats we support // the list of all (simple) data objects whose formats we support

View File

@@ -94,29 +94,48 @@ wxDataObjectComposite::~wxDataObjectComposite()
} }
wxDataObjectSimple * wxDataObjectSimple *
wxDataObjectComposite::GetObject(const wxDataFormat& format) const wxDataObjectComposite::GetObject(const wxDataFormat& format, wxDataObjectBase::Direction dir) const
{ {
wxSimpleDataObjectList::compatibility_iterator node = m_dataObjects.GetFirst(); wxSimpleDataObjectList::compatibility_iterator node = m_dataObjects.GetFirst();
while ( node ) while ( node )
{ {
wxDataObjectSimple *dataObj = node->GetData(); wxDataObjectSimple *dataObj = node->GetData();
if ( dataObj->GetFormat() == format ) if (dataObj->IsSupported(format,dir))
{
return dataObj; return dataObj;
}
node = node->GetNext(); node = node->GetNext();
} }
return NULL; return NULL;
} }
void wxDataObjectComposite::Add(wxDataObjectSimple *dataObject, bool preferred) void wxDataObjectComposite::Add(wxDataObjectSimple *dataObject, bool preferred)
{ {
// check if the data format of the passed object already exists in the composite data object, if this is the case
// do not add the data object and display a message in debug mode (otherwise this method fails silently):
// start checking if the data format exists for the 'GET' direction:
size_t indexFormats;
size_t noOfFormats;
wxDataFormat* formats;
noOfFormats = dataObject->GetFormatCount(wxDataObjectBase::Get);
formats = new wxDataFormat[noOfFormats];
for (indexFormats=0; indexFormats<noOfFormats; ++indexFormats)
wxCHECK_RET(this->GetObject(formats[indexFormats],wxDataObjectBase::Get) == NULL,
_("The data format for the GET-direction of the to be added data object already exists"));
delete[] formats;
// do the same with the 'SET' direction:
noOfFormats = dataObject->GetFormatCount(wxDataObjectBase::Set);
formats = new wxDataFormat[noOfFormats];
for (indexFormats=0; indexFormats<noOfFormats; ++indexFormats)
wxCHECK_RET(this->GetObject(formats[indexFormats],wxDataObjectBase::Set) == NULL,
_("The data format for the SET-direction of the to be added data object already exists"));
delete[] formats;
// if we reach this location the data object can simply be appended:
if ( preferred ) if ( preferred )
m_preferred = m_dataObjects.GetCount(); m_preferred = m_dataObjects.GetCount();
m_dataObjects.Append( dataObject ); m_dataObjects.Append( dataObject );
} }