From: Robert Roebling Date: Sat, 31 Jan 2009 13:41:11 +0000 (+0000) Subject: Fixes #10437 (wxDataObjectComposite::Add may add objects having data formats that... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/dc8928439fa4bc0cfa69e98a98a7831dff3d459b 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 --- diff --git a/include/wx/dataobj.h b/include/wx/dataobj.h index 1dc04bef55..ec7b0d76a4 100644 --- a/include/wx/dataobj.h +++ b/include/wx/dataobj.h @@ -297,7 +297,7 @@ public: protected: // 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: // the list of all (simple) data objects whose formats we support diff --git a/src/common/dobjcmn.cpp b/src/common/dobjcmn.cpp index 4929160986..20d6b2999c 100644 --- a/src/common/dobjcmn.cpp +++ b/src/common/dobjcmn.cpp @@ -94,29 +94,48 @@ wxDataObjectComposite::~wxDataObjectComposite() } wxDataObjectSimple * -wxDataObjectComposite::GetObject(const wxDataFormat& format) const +wxDataObjectComposite::GetObject(const wxDataFormat& format, wxDataObjectBase::Direction dir) const { wxSimpleDataObjectList::compatibility_iterator node = m_dataObjects.GetFirst(); + while ( node ) { wxDataObjectSimple *dataObj = node->GetData(); - if ( dataObj->GetFormat() == format ) - { - return dataObj; - } - + if (dataObj->IsSupported(format,dir)) + return dataObj; node = node->GetNext(); } - return NULL; } 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; indexFormatsGetObject(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; indexFormatsGetObject(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 ) m_preferred = m_dataObjects.GetCount(); - m_dataObjects.Append( dataObject ); }