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:
@@ -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
|
||||||
|
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user