diff options
author | Katarina Behrens <Katarina.Behrens@cib.de> | 2018-09-14 14:53:40 +0200 |
---|---|---|
committer | Katarina Behrens <Katarina.Behrens@cib.de> | 2018-10-04 10:19:33 +0200 |
commit | de40fe552e51e1d634c2401afef305ba4af91799 (patch) | |
tree | e828d8977b7fa8b58aef1dfa18c111181036789e /vcl/qt5/Qt5Clipboard.cxx | |
parent | f317a3de7473de5e6366ba4f2a4aa0ca25cdfdc1 (diff) |
Clipboard support for qt5, first cut
this adds just enough of basic UNO ifaces to have SID_PASTE enabled.
It can't actually paste anything yet.
Change-Id: I82e8ef37e11e9df21d27f08d4d199f3e5924ed84
Reviewed-on: https://gerrit.libreoffice.org/60494
Tested-by: Jenkins
Reviewed-by: Katarina Behrens <Katarina.Behrens@cib.de>
Diffstat (limited to 'vcl/qt5/Qt5Clipboard.cxx')
-rw-r--r-- | vcl/qt5/Qt5Clipboard.cxx | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/vcl/qt5/Qt5Clipboard.cxx b/vcl/qt5/Qt5Clipboard.cxx new file mode 100644 index 000000000000..ac2daae520c8 --- /dev/null +++ b/vcl/qt5/Qt5Clipboard.cxx @@ -0,0 +1,142 @@ +/* -*- 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 <comphelper/solarmutex.hxx> +#include <comphelper/sequence.hxx> +#include <cppuhelper/supportsservice.hxx> +#include <vcl/svapp.hxx> + +#include <Qt5Clipboard.hxx> + +std::vector<css::datatransfer::DataFlavor> Qt5Transferable::getTransferDataFlavorsAsVector() +{ + std::vector<css::datatransfer::DataFlavor> aVector; + + // FIXME: this is fake + css::datatransfer::DataFlavor aFlavor; + aFlavor.MimeType = "text/plain;charset=utf-16"; + aFlavor.DataType = cppu::UnoType<OUString>::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 !aAll.empty(); //FIXME +} + +/* + * XTransferable + */ + +css::uno::Any SAL_CALL +Qt5Transferable::getTransferData(const css::datatransfer::DataFlavor& /*rFlavor*/) +{ + css::uno::Any aRet; + Sequence<sal_Int8> aSeq(0, 4); //FIXME + aRet <<= aSeq; + return aRet; +} + +VclQt5Clipboard::VclQt5Clipboard() + : cppu::WeakComponentImplHelper<datatransfer::clipboard::XSystemClipboard, + datatransfer::clipboard::XFlushableClipboard, XServiceInfo>( + m_aMutex) +{ +} + +void VclQt5Clipboard::flushClipboard() +{ + SolarMutexGuard aGuard; + return; +} + +VclQt5Clipboard::~VclQt5Clipboard() {} + +OUString VclQt5Clipboard::getImplementationName() +{ + return OUString("com.sun.star.datatransfer.VclQt5Clipboard"); +} + +Sequence<OUString> VclQt5Clipboard::getSupportedServiceNames() +{ + Sequence<OUString> aRet{ "com.sun.star.datatransfer.clipboard.SystemClipboard" }; + return aRet; +} + +sal_Bool VclQt5Clipboard::supportsService(const OUString& ServiceName) +{ + return cppu::supportsService(this, ServiceName); +} + +Reference<css::datatransfer::XTransferable> VclQt5Clipboard::getContents() +{ + if (!m_aContents.is()) + m_aContents = new Qt5Transferable(); + + return m_aContents; +} + +void VclQt5Clipboard::setContents( + const Reference<css::datatransfer::XTransferable>& xTrans, + const Reference<css::datatransfer::clipboard::XClipboardOwner>& xClipboardOwner) +{ + osl::ClearableMutexGuard aGuard(m_aMutex); + Reference<datatransfer::clipboard::XClipboardOwner> xOldOwner(m_aOwner); + Reference<datatransfer::XTransferable> xOldContents(m_aContents); + m_aContents = xTrans; + m_aOwner = xClipboardOwner; + + std::vector<Reference<datatransfer::clipboard::XClipboardListener>> aListeners(m_aListeners); + datatransfer::clipboard::ClipboardEvent aEv; + + aEv.Contents = getContents(); + + aGuard.clear(); + + if (xOldOwner.is() && xOldOwner != xClipboardOwner) + xOldOwner->lostOwnership(this, xOldContents); + for (auto const& listener : aListeners) + { + listener->changedContents(aEv); + } +} + +OUString VclQt5Clipboard::getName() { return OUString("CLIPBOARD"); } + +sal_Int8 VclQt5Clipboard::getRenderingCapabilities() { return 0; } + +void VclQt5Clipboard::addClipboardListener( + const Reference<datatransfer::clipboard::XClipboardListener>& listener) +{ + osl::ClearableMutexGuard aGuard(m_aMutex); + + m_aListeners.push_back(listener); +} + +void VclQt5Clipboard::removeClipboardListener( + const Reference<datatransfer::clipboard::XClipboardListener>& listener) +{ + osl::ClearableMutexGuard aGuard(m_aMutex); + + m_aListeners.erase(std::remove(m_aListeners.begin(), m_aListeners.end(), listener), + m_aListeners.end()); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |