vcl/Library_vclplug_qt5.mk | 1 vcl/inc/qt5/Qt5Clipboard.hxx | 22 ----- vcl/inc/qt5/Qt5DragAndDrop.hxx | 18 ---- vcl/inc/qt5/Qt5Transferable.hxx | 56 +++++++++++++ vcl/qt5/Qt5Clipboard.cxx | 131 ++----------------------------- vcl/qt5/Qt5DragAndDrop.cxx | 79 ------------------ vcl/qt5/Qt5Frame.cxx | 1 vcl/qt5/Qt5Transferable.cxx | 167 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 239 insertions(+), 236 deletions(-)
New commits: commit 5c1995d34ca1e925e43ebba04ddae454df74f8fd Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Sat Jun 1 03:36:36 2019 +0000 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Tue Jun 18 07:39:00 2019 +0200 Qt5 refactor and move XTransferable implementations There is already duplicate code getTransferDataFlavorsAsVector. Maybe getTransferData can be also merged later. Change-Id: Iaa1c16990c1f19757f04944bcd21f395f6b8f69b Reviewed-on: https://gerrit.libreoffice.org/73301 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glo...@fbihome.de> (cherry picked from commit 2f0114b6244af429def59e107bd0b2835818913c) Reviewed-on: https://gerrit.libreoffice.org/74205 Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/vcl/Library_vclplug_qt5.mk b/vcl/Library_vclplug_qt5.mk index 4b49eba7504d..3231672c8743 100644 --- a/vcl/Library_vclplug_qt5.mk +++ b/vcl/Library_vclplug_qt5.mk @@ -107,6 +107,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_qt5,\ vcl/qt5/Qt5System \ vcl/qt5/Qt5Timer \ vcl/qt5/Qt5Tools \ + vcl/qt5/Qt5Transferable \ vcl/qt5/Qt5VirtualDevice \ vcl/qt5/Qt5Widget \ vcl/qt5/Qt5XAccessible \ diff --git a/vcl/inc/qt5/Qt5Clipboard.hxx b/vcl/inc/qt5/Qt5Clipboard.hxx index fb79ec463717..2c2bb93f5016 100644 --- a/vcl/inc/qt5/Qt5Clipboard.hxx +++ b/vcl/inc/qt5/Qt5Clipboard.hxx @@ -10,36 +10,16 @@ #pragma once -#include <cppuhelper/compbase.hxx> - #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/datatransfer/XTransferable.hpp> #include <com/sun/star/datatransfer/clipboard/XSystemClipboard.hpp> #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp> #include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp> #include <com/sun/star/datatransfer/clipboard/XClipboardListener.hpp> +#include <cppuhelper/compbase.hxx> #include <QtGui/QClipboard> -class Qt5Transferable : public cppu::WeakImplHelper<css::datatransfer::XTransferable> -{ -public: - explicit Qt5Transferable(QClipboard::Mode aMode); - - virtual css::uno::Any SAL_CALL - getTransferData(const css::datatransfer::DataFlavor& rFlavor) override; - - virtual std::vector<css::datatransfer::DataFlavor> getTransferDataFlavorsAsVector(); - - virtual css::uno::Sequence<css::datatransfer::DataFlavor> - SAL_CALL getTransferDataFlavors() override; - virtual sal_Bool SAL_CALL - isDataFlavorSupported(const css::datatransfer::DataFlavor& rFlavor) override; - -private: - QClipboard::Mode m_aClipboardMode; -}; - class Qt5Clipboard : public QObject, public cppu::WeakComponentImplHelper<css::datatransfer::clipboard::XSystemClipboard, diff --git a/vcl/inc/qt5/Qt5DragAndDrop.hxx b/vcl/inc/qt5/Qt5DragAndDrop.hxx index 3547131587f3..dcd6cb5e4048 100644 --- a/vcl/inc/qt5/Qt5DragAndDrop.hxx +++ b/vcl/inc/qt5/Qt5DragAndDrop.hxx @@ -10,29 +10,13 @@ #pragma once -#include <cppuhelper/compbase.hxx> -#include "Qt5Clipboard.hxx" - #include <com/sun/star/datatransfer/dnd/XDragSource.hpp> #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> #include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> +#include <cppuhelper/compbase.hxx> class Qt5Frame; -class QMimeData; - -class Qt5DnDTransferable : public Qt5Transferable -{ -public: - Qt5DnDTransferable(const QMimeData* pMimeData); - virtual css::uno::Any SAL_CALL - getTransferData(const css::datatransfer::DataFlavor& rFlavor) override; - - virtual std::vector<css::datatransfer::DataFlavor> getTransferDataFlavorsAsVector() override; - -private: - const QMimeData* m_pMimeData; -}; class Qt5DragSource : public cppu::WeakComponentImplHelper<css::datatransfer::dnd::XDragSource, diff --git a/vcl/inc/qt5/Qt5Transferable.hxx b/vcl/inc/qt5/Qt5Transferable.hxx new file mode 100644 index 000000000000..edc14904f769 --- /dev/null +++ b/vcl/inc/qt5/Qt5Transferable.hxx @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#pragma once + +#include <cppuhelper/compbase.hxx> +#include <com/sun/star/datatransfer/XTransferable.hpp> + +#include <QtGui/QClipboard> + +/** + * Abstract XTransferable used for clipboard and D'n'D transfers + **/ +class Qt5Transferable : public cppu::WeakImplHelper<css::datatransfer::XTransferable> +{ + Qt5Transferable() = delete; + Qt5Transferable(const Qt5Transferable&) = delete; + +protected: + const QMimeData* m_pMimeData; + + Qt5Transferable(const QMimeData* pMimeData); + std::vector<css::datatransfer::DataFlavor> getTransferDataFlavorsAsVector(); + +public: + ~Qt5Transferable() override; + + css::uno::Sequence<css::datatransfer::DataFlavor> SAL_CALL getTransferDataFlavors() override; + sal_Bool SAL_CALL isDataFlavorSupported(const css::datatransfer::DataFlavor& rFlavor) override; +}; + +class Qt5ClipboardTransferable final : public Qt5Transferable +{ +public: + explicit Qt5ClipboardTransferable(QClipboard::Mode aMode); + ~Qt5ClipboardTransferable() override; + + css::uno::Any SAL_CALL getTransferData(const css::datatransfer::DataFlavor& rFlavor) override; +}; + +class Qt5DnDTransferable final : public Qt5Transferable +{ +public: + Qt5DnDTransferable(const QMimeData* pMimeData); + + css::uno::Any SAL_CALL getTransferData(const css::datatransfer::DataFlavor& rFlavor) override; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/qt5/Qt5Clipboard.cxx b/vcl/qt5/Qt5Clipboard.cxx index 8f9c373836bb..2fc97caeb16b 100644 --- a/vcl/qt5/Qt5Clipboard.cxx +++ b/vcl/qt5/Qt5Clipboard.cxx @@ -14,13 +14,13 @@ #include <vcl/svapp.hxx> #include <sal/log.hxx> -#include <QtWidgets/QApplication> -#include <QtCore/QBuffer> #include <QtCore/QMimeData> #include <QtCore/QUuid> +#include <QtWidgets/QApplication> #include <Qt5Clipboard.hxx> #include <Qt5Clipboard.moc> +#include <Qt5Transferable.hxx> #include <Qt5Tools.hxx> #include <map> @@ -29,26 +29,20 @@ using namespace com::sun::star; namespace { -std::map<OUString, QClipboard::Mode> g_nameToClipboardMap - = { { "CLIPBOARD", QClipboard::Clipboard }, { "PRIMARY", QClipboard::Selection } }; - QClipboard::Mode getClipboardTypeFromName(const OUString& aString) { - // use QClipboard::Clipboard as fallback if requested type isn't found + static const std::map<OUString, QClipboard::Mode> aNameToClipboardMap + = { { "CLIPBOARD", QClipboard::Clipboard }, { "PRIMARY", QClipboard::Selection } }; + + // default to QClipboard::Clipboard as fallback QClipboard::Mode aMode = QClipboard::Clipboard; - auto iter = g_nameToClipboardMap.find(aString); - if (iter != g_nameToClipboardMap.end()) - { + auto iter = aNameToClipboardMap.find(aString); + if (iter != aNameToClipboardMap.end()) aMode = iter->second; - } else - { SAL_WARN("vcl.qt5", "Unrecognized clipboard type \"" - << aString - << "\" is requested, falling back to QClipboard::Clipboard"); - } - + << aString << "\"; falling back to QClipboard::Clipboard"); return aMode; } @@ -67,107 +61,6 @@ void lcl_peekFormats(const css::uno::Sequence<css::datatransfer::DataFlavor>& rF } } -Qt5Transferable::Qt5Transferable(QClipboard::Mode aMode) - : m_aClipboardMode(aMode) -{ -} - -std::vector<css::datatransfer::DataFlavor> Qt5Transferable::getTransferDataFlavorsAsVector() -{ - std::vector<css::datatransfer::DataFlavor> aVector; - - const QClipboard* clipboard = QApplication::clipboard(); - const QMimeData* mimeData = clipboard->mimeData(m_aClipboardMode); - css::datatransfer::DataFlavor aFlavor; - - if (mimeData) - { - for (QString& rMimeType : mimeData->formats()) - { - // filter out non-MIME types such as TARGETS, MULTIPLE, TIMESTAMP - if (rMimeType.indexOf('/') == -1) - continue; - - if (rMimeType.startsWith("text/plain")) - { - aFlavor.MimeType = "text/plain;charset=utf-16"; - aFlavor.DataType = cppu::UnoType<OUString>::get(); - aVector.push_back(aFlavor); - } - else - { - aFlavor.MimeType = toOUString(rMimeType); - aFlavor.DataType = cppu::UnoType<uno::Sequence<sal_Int8>>::get(); - aVector.push_back(aFlavor); - } - } - } - - return aVector; -} - -css::uno::Sequence<css::datatransfer::DataFlavor> SAL_CALL Qt5Transferable::getTransferDataFlavors() -{ - return comphelper::containerToSequence(getTransferDataFlavorsAsVector()); -} - -sal_Bool SAL_CALL -Qt5Transferable::isDataFlavorSupported(const css::datatransfer::DataFlavor& rFlavor) -{ - const std::vector<css::datatransfer::DataFlavor> aAll = getTransferDataFlavorsAsVector(); - - return std::any_of(aAll.begin(), aAll.end(), [&](const css::datatransfer::DataFlavor& aFlavor) { - return rFlavor.MimeType == aFlavor.MimeType; - }); //FIXME -} - -/* - * XTransferable - */ - -css::uno::Any SAL_CALL -Qt5Transferable::getTransferData(const css::datatransfer::DataFlavor& rFlavor) -{ - css::uno::Any aRet; - const QClipboard* clipboard = QApplication::clipboard(); - const QMimeData* mimeData = clipboard->mimeData(m_aClipboardMode); - - if (mimeData) - { - if (rFlavor.MimeType == "text/plain;charset=utf-16") - { - QString clipboardContent = mimeData->text(); - OUString sContent = toOUString(clipboardContent); - - aRet <<= sContent.replaceAll("\r\n", "\n"); - } - else if (rFlavor.MimeType == "text/html") - { - QString clipboardContent = mimeData->html(); - std::string aStr = clipboardContent.toStdString(); - uno::Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(aStr.c_str()), - aStr.length()); - aRet <<= aSeq; - } - else if (rFlavor.MimeType.startsWith("image") && mimeData->hasImage()) - { - QImage image = qvariant_cast<QImage>(mimeData->imageData()); - QByteArray ba; - QBuffer buffer(&ba); - sal_Int32 nIndex = rFlavor.MimeType.indexOf('/'); - OUString sFormat(nIndex != -1 ? rFlavor.MimeType.copy(nIndex + 1) : "png"); - - buffer.open(QIODevice::WriteOnly); - image.save(&buffer, sFormat.toUtf8().getStr()); - - uno::Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(ba.data()), ba.size()); - aRet <<= aSeq; - } - } - - return aRet; -} - Qt5Clipboard::Qt5Clipboard(const OUString& aModeString) : cppu::WeakComponentImplHelper<datatransfer::clipboard::XSystemClipboard, datatransfer::clipboard::XFlushableClipboard, XServiceInfo>( @@ -195,8 +88,7 @@ OUString Qt5Clipboard::getImplementationName() uno::Sequence<OUString> Qt5Clipboard::getSupportedServiceNames() { - uno::Sequence<OUString> aRet{ "com.sun.star.datatransfer.clipboard.SystemClipboard" }; - return aRet; + return { "com.sun.star.datatransfer.clipboard.SystemClipboard" }; } sal_Bool Qt5Clipboard::supportsService(const OUString& ServiceName) @@ -207,8 +99,7 @@ sal_Bool Qt5Clipboard::supportsService(const OUString& ServiceName) uno::Reference<css::datatransfer::XTransferable> Qt5Clipboard::getContents() { if (!m_aContents.is()) - m_aContents = new Qt5Transferable(m_aClipboardMode); - + m_aContents = new Qt5ClipboardTransferable(m_aClipboardMode); return m_aContents; } diff --git a/vcl/qt5/Qt5DragAndDrop.cxx b/vcl/qt5/Qt5DragAndDrop.cxx index aec98fde73ee..118939cdae8f 100644 --- a/vcl/qt5/Qt5DragAndDrop.cxx +++ b/vcl/qt5/Qt5DragAndDrop.cxx @@ -14,94 +14,17 @@ #include <cppuhelper/supportsservice.hxx> #include <sal/log.hxx> -#include <QtCore/QMimeData> -#include <QtCore/QUrl> - #include <Qt5DragAndDrop.hxx> #include <Qt5Frame.hxx> #include <Qt5Widget.hxx> using namespace com::sun::star; -Qt5DnDTransferable::Qt5DnDTransferable(const QMimeData* pMimeData) - : Qt5Transferable(QClipboard::Clipboard) - , m_pMimeData(pMimeData) -{ -} - -css::uno::Any Qt5DnDTransferable::getTransferData(const css::datatransfer::DataFlavor&) -{ - uno::Any aAny; - assert(m_pMimeData); - - // FIXME: not sure if we should support more mimetypes here - // (how to carry out external DnD with anything else than [file] URL?) - if (m_pMimeData->hasUrls()) - { - QList<QUrl> urlList = m_pMimeData->urls(); - - if (urlList.size() > 0) - { - std::string aStr; - - // transfer data is list of URLs - for (int i = 0; i < urlList.size(); ++i) - { - QString url = urlList.at(i).path(); - aStr += url.toStdString(); - // separated by newline if more than 1 - if (i < urlList.size() - 1) - aStr += "\n"; - } - - uno::Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(aStr.c_str()), - aStr.length()); - aAny <<= aSeq; - } - } - return aAny; -} - -std::vector<css::datatransfer::DataFlavor> Qt5DnDTransferable::getTransferDataFlavorsAsVector() -{ - std::vector<css::datatransfer::DataFlavor> aVector; - css::datatransfer::DataFlavor aFlavor; - - if (m_pMimeData) - { - for (QString& rMimeType : m_pMimeData->formats()) - { - // filter out non-MIME types such as TARGETS, MULTIPLE, TIMESTAMP - if (rMimeType.indexOf('/') == -1) - continue; - - if (rMimeType.startsWith("text/plain")) - { - aFlavor.MimeType = "text/plain;charset=utf-16"; - aFlavor.DataType = cppu::UnoType<OUString>::get(); - aVector.push_back(aFlavor); - } - else - { - aFlavor.MimeType = toOUString(rMimeType); - aFlavor.DataType = cppu::UnoType<uno::Sequence<sal_Int8>>::get(); - aVector.push_back(aFlavor); - } - } - } - - return aVector; -} - bool Qt5DragSource::m_bDropSuccessSet = false; bool Qt5DragSource::m_bDropSuccess = false; Qt5DragSource* Qt5DragSource::m_ActiveDragSource = nullptr; -Qt5DragSource::~Qt5DragSource() -{ - //if (m_pFrame) - // m_pFrame->deregisterDragSource(this); -} +Qt5DragSource::~Qt5DragSource() {} void Qt5DragSource::deinitialize() { m_pFrame = nullptr; } diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx index 6558ad097632..6307a70233fe 100644 --- a/vcl/qt5/Qt5Frame.cxx +++ b/vcl/qt5/Qt5Frame.cxx @@ -29,6 +29,7 @@ #include <Qt5SvpGraphics.hxx> #include <Qt5System.hxx> #include <Qt5Tools.hxx> +#include <Qt5Transferable.hxx> #include <Qt5Widget.hxx> #include <QtCore/QMimeData> diff --git a/vcl/qt5/Qt5Transferable.cxx b/vcl/qt5/Qt5Transferable.cxx new file mode 100644 index 000000000000..a78ff8bc712e --- /dev/null +++ b/vcl/qt5/Qt5Transferable.cxx @@ -0,0 +1,167 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#include <Qt5Transferable.hxx> + +#include <comphelper/solarmutex.hxx> +#include <comphelper/sequence.hxx> +#include <sal/log.hxx> + +#include <QtCore/QBuffer> +#include <QtCore/QMimeData> +#include <QtCore/QUrl> +#include <QtWidgets/QApplication> + +#include <Qt5Clipboard.hxx> +#include <Qt5Tools.hxx> + +using namespace com::sun::star; + +Qt5Transferable::Qt5Transferable(const QMimeData* pMimeData) + : m_pMimeData(pMimeData) +{ +} + +Qt5Transferable::~Qt5Transferable() {} + +std::vector<css::datatransfer::DataFlavor> Qt5Transferable::getTransferDataFlavorsAsVector() +{ + std::vector<css::datatransfer::DataFlavor> aVector; + assert(m_pMimeData); + if (!m_pMimeData) + return aVector; + + css::datatransfer::DataFlavor aFlavor; + for (QString& rMimeType : m_pMimeData->formats()) + { + // filter out non-MIME types such as TARGETS, MULTIPLE, TIMESTAMP + if (rMimeType.indexOf('/') == -1) + continue; + + aFlavor.MimeType = toOUString(rMimeType); + if (rMimeType.startsWith("text/plain")) + { + aFlavor.MimeType = "text/plain;charset=utf-16"; + aFlavor.DataType = cppu::UnoType<OUString>::get(); + aVector.push_back(aFlavor); + } + else + { + aFlavor.MimeType = toOUString(rMimeType); + aFlavor.DataType = cppu::UnoType<uno::Sequence<sal_Int8>>::get(); + aVector.push_back(aFlavor); + } + } + + return aVector; +} + +css::uno::Sequence<css::datatransfer::DataFlavor> SAL_CALL Qt5Transferable::getTransferDataFlavors() +{ + return comphelper::containerToSequence(getTransferDataFlavorsAsVector()); +} + +sal_Bool SAL_CALL +Qt5Transferable::isDataFlavorSupported(const css::datatransfer::DataFlavor& rFlavor) +{ + const std::vector<css::datatransfer::DataFlavor> aAll = getTransferDataFlavorsAsVector(); + + return std::any_of(aAll.begin(), aAll.end(), [&](const css::datatransfer::DataFlavor& aFlavor) { + return rFlavor.MimeType == aFlavor.MimeType; + }); //FIXME +} + +Qt5ClipboardTransferable::Qt5ClipboardTransferable(QClipboard::Mode aMode) + : Qt5Transferable(QApplication::clipboard()->mimeData(aMode)) +{ +} + +Qt5ClipboardTransferable::~Qt5ClipboardTransferable() {} + +css::uno::Any SAL_CALL +Qt5ClipboardTransferable::getTransferData(const css::datatransfer::DataFlavor& rFlavor) +{ + css::uno::Any aAny; + assert(m_pMimeData); + if (!m_pMimeData) + return aAny; + + if (rFlavor.MimeType == "text/plain;charset=utf-16") + { + QString clipboardContent = m_pMimeData->text(); + OUString sContent = toOUString(clipboardContent); + + aAny <<= sContent.replaceAll("\r\n", "\n"); + } + else if (rFlavor.MimeType == "text/html") + { + QString clipboardContent = m_pMimeData->html(); + std::string aStr = clipboardContent.toStdString(); + uno::Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(aStr.c_str()), + aStr.length()); + aAny <<= aSeq; + } + else if (rFlavor.MimeType.startsWith("image") && m_pMimeData->hasImage()) + { + QImage image = qvariant_cast<QImage>(m_pMimeData->imageData()); + QByteArray ba; + QBuffer buffer(&ba); + sal_Int32 nIndex = rFlavor.MimeType.indexOf('/'); + OUString sFormat(nIndex != -1 ? rFlavor.MimeType.copy(nIndex + 1) : "png"); + + buffer.open(QIODevice::WriteOnly); + image.save(&buffer, sFormat.toUtf8().getStr()); + + uno::Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(ba.data()), ba.size()); + aAny <<= aSeq; + } + + return aAny; +} + +Qt5DnDTransferable::Qt5DnDTransferable(const QMimeData* pMimeData) + : Qt5Transferable(pMimeData) +{ +} + +css::uno::Any Qt5DnDTransferable::getTransferData(const css::datatransfer::DataFlavor&) +{ + uno::Any aAny; + assert(m_pMimeData); + + // FIXME: not sure if we should support more mimetypes here + // (how to carry out external DnD with anything else than [file] URL?) + if (m_pMimeData->hasUrls()) + { + QList<QUrl> urlList = m_pMimeData->urls(); + + if (urlList.size() > 0) + { + std::string aStr; + + // transfer data is list of URLs + for (int i = 0; i < urlList.size(); ++i) + { + QString url = urlList.at(i).path(); + aStr += url.toStdString(); + // separated by newline if more than 1 + if (i < urlList.size() - 1) + aStr += "\n"; + } + + uno::Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(aStr.c_str()), + aStr.length()); + aAny <<= aSeq; + } + } + return aAny; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits