/* -*- 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 #include #include #include #include #include #include #include std::vector Qt5Transferable::getTransferDataFlavorsAsVector() { std::vector aVector; // FIXME: this is fake css::datatransfer::DataFlavor aFlavor; aFlavor.MimeType = "text/plain;charset=utf-16"; aFlavor.DataType = cppu::UnoType::get(); aVector.push_back(aFlavor); return aVector; } css::uno::Sequence SAL_CALL Qt5Transferable::getTransferDataFlavors() { return comphelper::containerToSequence(getTransferDataFlavorsAsVector()); } sal_Bool SAL_CALL Qt5Transferable::isDataFlavorSupported(const css::datatransfer::DataFlavor& /*rFlavor*/) { const std::vector aAll = getTransferDataFlavorsAsVector(); return !aAll.empty(); //FIXME } /* * XTransferable */ css::uno::Any SAL_CALL Qt5Transferable::getTransferData(const css::datatransfer::DataFlavor& rFlavor) { css::uno::Any aRet; if (rFlavor.MimeType == "text/plain;charset=utf-16") { const QClipboard* clipboard = QApplication::clipboard(); QString clipboardContent = clipboard->text(); OUString sContent = toOUString(clipboardContent); aRet <<= sContent.replaceAll("\r\n", "\n"); } return aRet; } VclQt5Clipboard::VclQt5Clipboard() : cppu::WeakComponentImplHelper( m_aMutex) { } void VclQt5Clipboard::flushClipboard() { SolarMutexGuard aGuard; return; } VclQt5Clipboard::~VclQt5Clipboard() {} OUString VclQt5Clipboard::getImplementationName() { return OUString("com.sun.star.datatransfer.VclQt5Clipboard"); } Sequence VclQt5Clipboard::getSupportedServiceNames() { Sequence aRet{ "com.sun.star.datatransfer.clipboard.SystemClipboard" }; return aRet; } sal_Bool VclQt5Clipboard::supportsService(const OUString& ServiceName) { return cppu::supportsService(this, ServiceName); } Reference VclQt5Clipboard::getContents() { if (!m_aContents.is()) m_aContents = new Qt5Transferable; return m_aContents; } void VclQt5Clipboard::setContents( const Reference& xTrans, const Reference& xClipboardOwner) { osl::ClearableMutexGuard aGuard(m_aMutex); Reference xOldOwner(m_aOwner); Reference xOldContents(m_aContents); m_aContents = xTrans; m_aOwner = xClipboardOwner; std::vector> aListeners(m_aListeners); datatransfer::clipboard::ClipboardEvent aEv; if (m_aContents.is()) { css::datatransfer::DataFlavor aFlavor; aFlavor.MimeType = "text/plain;charset=utf-16"; aFlavor.DataType = cppu::UnoType::get(); Any aValue; try { aValue = xTrans->getTransferData(aFlavor); } catch (...) { } OUString aString; aValue >>= aString; QClipboard* clipboard = QApplication::clipboard(); clipboard->setText(toQString(aString)); } 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& listener) { osl::ClearableMutexGuard aGuard(m_aMutex); m_aListeners.push_back(listener); } void VclQt5Clipboard::removeClipboardListener( const Reference& 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: */