Kaydet (Commit) de40fe55 authored tarafından Katarina Behrens's avatar Katarina Behrens

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: 's avatarKatarina Behrens <Katarina.Behrens@cib.de>
üst f317a3de
...@@ -82,6 +82,7 @@ endif ...@@ -82,6 +82,7 @@ endif
$(eval $(call gb_Library_add_exception_objects,vclplug_qt5,\ $(eval $(call gb_Library_add_exception_objects,vclplug_qt5,\
vcl/qt5/Qt5AccessibleWidget \ vcl/qt5/Qt5AccessibleWidget \
vcl/qt5/Qt5Bitmap \ vcl/qt5/Qt5Bitmap \
vcl/qt5/Qt5Clipboard \
vcl/qt5/Qt5Data \ vcl/qt5/Qt5Data \
vcl/qt5/Qt5FilePicker \ vcl/qt5/Qt5FilePicker \
vcl/qt5/Qt5Font \ vcl/qt5/Qt5Font \
......
/* -*- 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/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>
using namespace com::sun::star;
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
class Qt5Transferable : public cppu::WeakImplHelper<css::datatransfer::XTransferable>
{
public:
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;
};
class VclQt5Clipboard
: public cppu::WeakComponentImplHelper<datatransfer::clipboard::XSystemClipboard,
datatransfer::clipboard::XFlushableClipboard,
XServiceInfo>
{
osl::Mutex m_aMutex;
Reference<css::datatransfer::XTransferable> m_aContents;
Reference<css::datatransfer::clipboard::XClipboardOwner> m_aOwner;
std::vector<Reference<css::datatransfer::clipboard::XClipboardListener>> m_aListeners;
public:
explicit VclQt5Clipboard();
virtual ~VclQt5Clipboard();
/*
* XServiceInfo
*/
virtual OUString SAL_CALL getImplementationName() override;
virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
virtual Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
/*
* XClipboard
*/
virtual Reference<css::datatransfer::XTransferable> SAL_CALL getContents() override;
virtual void SAL_CALL setContents(
const Reference<css::datatransfer::XTransferable>& xTrans,
const Reference<css::datatransfer::clipboard::XClipboardOwner>& xClipboardOwner) override;
virtual OUString SAL_CALL getName() override;
/*
* XClipboardEx
*/
virtual sal_Int8 SAL_CALL getRenderingCapabilities() override;
/*
* XFlushableClipboard
*/
virtual void SAL_CALL flushClipboard() override;
/*
* XClipboardNotifier
*/
virtual void SAL_CALL addClipboardListener(
const Reference<css::datatransfer::clipboard::XClipboardListener>& listener) override;
virtual void SAL_CALL removeClipboardListener(
const Reference<css::datatransfer::clipboard::XClipboardListener>& listener) override;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -109,6 +109,9 @@ public: ...@@ -109,6 +109,9 @@ public:
virtual css::uno::Reference<css::ui::dialogs::XFolderPicker2> virtual css::uno::Reference<css::ui::dialogs::XFolderPicker2>
createFolderPicker(const css::uno::Reference<css::uno::XComponentContext>&) override; createFolderPicker(const css::uno::Reference<css::uno::XComponentContext>&) override;
virtual css::uno::Reference<css::uno::XInterface>
CreateClipboard(const css::uno::Sequence<css::uno::Any>& i_rArguments) override;
}; };
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* -*- 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: */
...@@ -20,7 +20,10 @@ ...@@ -20,7 +20,10 @@
#include <Qt5Instance.hxx> #include <Qt5Instance.hxx>
#include <Qt5Instance.moc> #include <Qt5Instance.moc>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
#include <Qt5Bitmap.hxx> #include <Qt5Bitmap.hxx>
#include <Qt5Clipboard.hxx>
#include <Qt5Data.hxx> #include <Qt5Data.hxx>
#include <Qt5FilePicker.hxx> #include <Qt5FilePicker.hxx>
#include <Qt5Frame.hxx> #include <Qt5Frame.hxx>
...@@ -218,6 +221,26 @@ Qt5Instance::createFolderPicker(const css::uno::Reference<css::uno::XComponentCo ...@@ -218,6 +221,26 @@ Qt5Instance::createFolderPicker(const css::uno::Reference<css::uno::XComponentCo
new Qt5FilePicker(QFileDialog::Directory)); new Qt5FilePicker(QFileDialog::Directory));
} }
css::uno::Reference<css::uno::XInterface>
Qt5Instance::CreateClipboard(const css::uno::Sequence<css::uno::Any>& arguments)
{
OUString sel;
if (arguments.getLength() == 0)
{
sel = "CLIPBOARD";
}
else if (arguments.getLength() != 1 || !(arguments[0] >>= sel))
{
throw css::lang::IllegalArgumentException("bad Qt5Instance::CreateClipboard arguments",
css::uno::Reference<css::uno::XInterface>(), -1);
}
css::uno::Reference<css::uno::XInterface> xClipboard(
static_cast<cppu::OWeakObject*>(new VclQt5Clipboard()));
return xClipboard;
}
extern "C" { extern "C" {
VCLPLUG_QT5_PUBLIC SalInstance* create_SalInstance() VCLPLUG_QT5_PUBLIC SalInstance* create_SalInstance()
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment