diff --git a/include/wx/dataobj.h b/include/wx/dataobj.h index b7680b5c95..4091f7b766 100644 --- a/include/wx/dataobj.h +++ b/include/wx/dataobj.h @@ -427,6 +427,11 @@ public: #endif // different wxTextDataObject implementations private: +#if defined(__WXQT__) + // Overridden to set text directly instead of extracting byte array + void QtSetDataSingleFormat(const class QMimeData &mimeData, const wxDataFormat &format) wxOVERRIDE; +#endif + wxString m_text; wxDECLARE_NO_COPY_CLASS(wxTextDataObject); diff --git a/include/wx/qt/dataobj.h b/include/wx/qt/dataobj.h index ed4287c285..3e891d12ab 100644 --- a/include/wx/qt/dataobj.h +++ b/include/wx/qt/dataobj.h @@ -12,6 +12,8 @@ // wxDataObject is the same as wxDataObjectBase under wxQT // ---------------------------------------------------------------------------- +class QMimeData; + class WXDLLIMPEXP_CORE wxDataObject : public wxDataObjectBase { public: @@ -19,6 +21,15 @@ public: virtual ~wxDataObject(); virtual bool IsSupportedFormat( const wxDataFormat& format, Direction dir = Get ) const; + + // Adds object's data to Qt mime data appropriately for type + virtual void QtAddDataTo(QMimeData &mimeData) const; + // Sets object's data from Qt mime data appropriately for type + virtual bool QtSetDataFrom(const QMimeData &mimeData); + +private: + // Sets object's data from Qt mime data in specific format + virtual void QtSetDataSingleFormat(const QMimeData &mimeData, const wxDataFormat &format); }; #endif // _WX_QT_DATAOBJ_H_ diff --git a/include/wx/qt/dataobj2.h b/include/wx/qt/dataobj2.h index 26536b2750..8ddb3e781e 100644 --- a/include/wx/qt/dataobj2.h +++ b/include/wx/qt/dataobj2.h @@ -14,6 +14,11 @@ public: wxBitmapDataObject(); wxBitmapDataObject(const wxBitmap& bitmap); + // Overridden to set image data directly, which Qt will write to clipboard in many formats + void QtAddDataTo(QMimeData &mimeData) const wxOVERRIDE; + // Overridden to retrieve image data from any format that Qt can read from clipboard + bool QtSetDataFrom(const QMimeData &mimeData) wxOVERRIDE; + protected: private: diff --git a/src/qt/clipbrd.cpp b/src/qt/clipbrd.cpp index 0a9dc2902d..9d38aebd86 100644 --- a/src/qt/clipbrd.cpp +++ b/src/qt/clipbrd.cpp @@ -14,14 +14,13 @@ #include #include +#include #include "wx/clipbrd.h" #include "wx/scopedarray.h" #include "wx/scopeguard.h" #include "wx/qt/private/converter.h" -#include - // ---------------------------------------------------------------------------- // wxClipboard ctor/dtor // ---------------------------------------------------------------------------- @@ -90,28 +89,7 @@ bool wxClipboard::IsOpened() const bool wxClipboard::AddData( wxDataObject *data ) { QMimeData *MimeData = new QMimeData; - const size_t count = data->GetFormatCount(); - wxDataFormatArray formats(count); - data->GetAllFormats(formats.get()); - - // how to add timestamp? - - // Unfortunately I cannot find a way to use the qt clipboard with - // a callback to select the data type, so I must copy it all here - - for ( size_t i = 0; i < count; i++ ) - { - const wxDataFormat format(formats[i]); - - int size = data->GetDataSize( format ); - if ( !size ) - continue; - - QByteArray bytearray(size, 0); - data->GetDataHere(format, bytearray.data()); - MimeData->setData(wxQtConvertString(format.GetMimeType()), bytearray); - } - + data->QtAddDataTo(*MimeData); delete data; QtClipboard->setMimeData(MimeData, (QClipboard::Mode)Mode()); @@ -135,31 +113,7 @@ bool wxClipboard::GetData( wxDataObject& data ) wxCHECK_MSG( m_open, false, wxT("clipboard not open") ); const QMimeData *MimeData = QtClipboard->mimeData( (QClipboard::Mode)Mode() ); - const size_t count = data.GetFormatCount(wxDataObject::Set); - wxDataFormatArray formats(count); - data.GetAllFormats(formats.get(), wxDataObject::Set); - - for ( size_t i = 0; i < count; i++ ) - { - const wxDataFormat format(formats[i]); - - // is this format supported by clipboard ? - if( !MimeData->hasFormat(wxQtConvertString(format.GetMimeType())) ) - continue; - - wxTextDataObject *textdata = dynamic_cast(&data); - if ( textdata ) - textdata->SetText(wxQtConvertString(MimeData->text())); - else - { - QByteArray bytearray = MimeData->data( wxQtConvertString(format.GetMimeType()) ).data(); - data.SetData(format, bytearray.size(), bytearray.constData()); - } - - return true; - } - - return false; + return data.QtSetDataFrom(*MimeData); } void wxClipboard::Clear() @@ -170,6 +124,10 @@ void wxClipboard::Clear() bool wxClipboard::IsSupported( const wxDataFormat& format ) { const QMimeData *data = QtClipboard->mimeData( (QClipboard::Mode)Mode() ); + if (format.GetType() == wxDF_BITMAP) + { + return data->hasImage(); + } return data->hasFormat(wxQtConvertString(format.GetMimeType())); } diff --git a/src/qt/dataobj.cpp b/src/qt/dataobj.cpp index f8ba76bcc2..0790128228 100644 --- a/src/qt/dataobj.cpp +++ b/src/qt/dataobj.cpp @@ -12,8 +12,14 @@ #pragma hdrstop #endif +#include +#include + #include "wx/dataobj.h" #include "wx/scopedarray.h" +#include "wx/qt/private/converter.h" + +typedef wxScopedArray wxDataFormatArray; namespace { @@ -150,16 +156,83 @@ bool wxDataObject::IsSupportedFormat(const wxDataFormat& format, return false; } +void wxDataObject::QtAddDataTo(QMimeData &mimeData) const +{ + const size_t count = GetFormatCount(); + wxDataFormatArray formats(count); + GetAllFormats(formats.get()); + + // how to add timestamp? + + // Unfortunately I cannot find a way to use the qt clipboard with + // a callback to select the data type, so I must copy it all here + + for (size_t i = 0; i < count; i++) + { + const wxDataFormat format(formats[i]); + + int size = GetDataSize(format); + if (!size) + continue; + + QByteArray bytearray(size, 0); + GetDataHere(format, bytearray.data()); + mimeData.setData(wxQtConvertString(format.GetMimeType()), bytearray); + } +} + +bool wxDataObject::QtSetDataFrom(const QMimeData &mimeData) +{ + const size_t count = GetFormatCount(Set); + wxDataFormatArray formats(count); + GetAllFormats(formats.get(), Set); + + for (size_t i = 0; i < count; i++) + { + const wxDataFormat format(formats[i]); + + // is this format supported by clipboard ? + if (!mimeData.hasFormat(wxQtConvertString(format.GetMimeType()))) + continue; + + QtSetDataSingleFormat(mimeData, format); + return true; + } + + return false; +} + +void wxDataObject::QtSetDataSingleFormat(const QMimeData &mimeData, const wxDataFormat &format) +{ + QByteArray bytearray = mimeData.data(wxQtConvertString(format.GetMimeType())); + SetData(format, bytearray.size(), bytearray.constData()); +} + //############################################################################ wxBitmapDataObject::wxBitmapDataObject() { } -wxBitmapDataObject::wxBitmapDataObject( const wxBitmap &WXUNUSED(bitmap) ) +wxBitmapDataObject::wxBitmapDataObject( const wxBitmap &bitmap ) + : wxBitmapDataObjectBase( bitmap ) { } +void wxBitmapDataObject::QtAddDataTo(QMimeData &mimeData) const +{ + mimeData.setImageData(GetBitmap().GetHandle()->toImage()); +} + +bool wxBitmapDataObject::QtSetDataFrom(const QMimeData &mimeData) +{ + if (!mimeData.hasImage()) + return false; + + SetBitmap(wxBitmap(QPixmap::fromImage(qvariant_cast(mimeData.imageData())))); + return true; +} + //############################################################################# // ---------------------------------------------------------------------------- // wxTextDataObject @@ -174,6 +247,11 @@ void wxTextDataObject::GetAllFormats(wxDataFormat *formats, } #endif +void wxTextDataObject::QtSetDataSingleFormat(const QMimeData &mimeData, const wxDataFormat &WXUNUSED(format)) +{ + SetText(wxQtConvertString(mimeData.text())); +} + //############################################################################# wxFileDataObject::wxFileDataObject()