summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editeng/source/editeng/impedit.cxx13
-rw-r--r--editeng/source/editeng/impedit.hxx1
-rw-r--r--include/vcl/transfer.hxx4
-rw-r--r--vcl/source/treelist/transfer2.cxx41
-rw-r--r--vcl/source/window/window.cxx69
5 files changed, 67 insertions, 61 deletions
diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx
index 15937acb1cf2..15a25c4cdd68 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -1279,7 +1279,14 @@ Reference<css::datatransfer::clipboard::XClipboard> ImpEditView::GetClipboard()
{
if (vcl::Window* pWindow = GetWindow())
return pWindow->GetClipboard();
- return css::datatransfer::clipboard::SystemClipboard::create(comphelper::getProcessComponentContext());
+ return GetSystemClipboard();
+}
+
+Reference<css::datatransfer::clipboard::XClipboard> ImpEditView::GetSelection()
+{
+ if (vcl::Window* pWindow = GetWindow())
+ return pWindow->GetPrimarySelection();
+ return GetSystemPrimarySelection();
}
bool ImpEditView::PostKeyEvent( const KeyEvent& rKeyEvent, vcl::Window const * pFrameWin )
@@ -1343,12 +1350,12 @@ bool ImpEditView::MouseButtonUp( const MouseEvent& rMouseEvent )
if ( rMouseEvent.IsMiddle() && !bReadOnly &&
( pWindow->GetSettings().GetMouseSettings().GetMiddleButtonAction() == MouseMiddleButtonAction::PasteSelection ) )
{
- Reference<css::datatransfer::clipboard::XClipboard> aClipBoard(GetClipboard());
+ Reference<css::datatransfer::clipboard::XClipboard> aClipBoard(GetSelection());
Paste( aClipBoard );
}
else if ( rMouseEvent.IsLeft() && GetEditSelection().HasRange() )
{
- Reference<css::datatransfer::clipboard::XClipboard> aClipBoard(GetClipboard());
+ Reference<css::datatransfer::clipboard::XClipboard> aClipBoard(GetSelection());
CutCopy( aClipBoard, false );
}
}
diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx
index b7f7d5db0323..0ef1130322c0 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -283,6 +283,7 @@ private:
void InvalidateAtWindow(const tools::Rectangle& rRect);
css::uno::Reference<css::datatransfer::clipboard::XClipboard> GetClipboard();
+ css::uno::Reference<css::datatransfer::clipboard::XClipboard> GetSelection();
protected:
diff --git a/include/vcl/transfer.hxx b/include/vcl/transfer.hxx
index 3e1c4ee5b325..888fe254e115 100644
--- a/include/vcl/transfer.hxx
+++ b/include/vcl/transfer.hxx
@@ -31,6 +31,7 @@
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/lang/XUnoTunnel.hpp>
#include <com/sun/star/datatransfer/XTransferable2.hpp>
+#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
#include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp>
#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
#include <com/sun/star/datatransfer/dnd/XDragGestureListener.hpp>
@@ -503,6 +504,9 @@ public:
const Link<sal_Int8,void>& rCallbck );
};
+css::uno::Reference<css::datatransfer::clipboard::XClipboard> VCL_DLLPUBLIC GetSystemClipboard();
+css::uno::Reference<css::datatransfer::clipboard::XClipboard> VCL_DLLPUBLIC GetSystemPrimarySelection();
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/treelist/transfer2.cxx b/vcl/source/treelist/transfer2.cxx
index a731ec2abf23..9160ba416e02 100644
--- a/vcl/source/treelist/transfer2.cxx
+++ b/vcl/source/treelist/transfer2.cxx
@@ -17,6 +17,8 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
+#include <config_features.h>
+
#include <osl/mutex.hxx>
#include <sot/exchange.hxx>
#include <sot/storage.hxx>
@@ -26,9 +28,12 @@
#include <vcl/svapp.hxx>
#include <vcl/window.hxx>
#include <comphelper/fileformat.h>
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/datatransfer/clipboard/SystemClipboard.hpp>
#include <com/sun/star/datatransfer/dnd/XDropTargetDragContext.hpp>
#include <com/sun/star/datatransfer/dnd/XDragGestureRecognizer.hpp>
#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
+#include <com/sun/star/uno/DeploymentException.hpp>
#include <svl/urlbmk.hxx>
#include <vcl/inetimg.hxx>
#include <vcl/imap.hxx>
@@ -460,4 +465,40 @@ void TransferDataContainer::DragFinished( sal_Int8 nDropAction )
pImpl->aFinshedLnk.Call( nDropAction );
}
+Reference<XClipboard> GetSystemClipboard()
+{
+ Reference<XClipboard> xClipboard;
+ try
+ {
+ xClipboard = css::datatransfer::clipboard::SystemClipboard::create(
+ comphelper::getProcessComponentContext());
+ }
+ catch (DeploymentException const &) {}
+ return xClipboard;
+}
+
+Reference<XClipboard> GetSystemPrimarySelection()
+{
+ Reference<XClipboard> xSelection;
+ try
+ {
+ Reference<XComponentContext> xContext(comphelper::getProcessComponentContext());
+#if HAVE_FEATURE_X11
+ // A hack, making the primary selection available as an instance
+ // of the SystemClipboard service on X11:
+ Sequence< Any > args(1);
+ args[0] <<= OUString("PRIMARY");
+ xSelection.set(xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
+ "com.sun.star.datatransfer.clipboard.SystemClipboard", args, xContext), UNO_QUERY_THROW);
+#else
+ static Reference< XClipboard > s_xSelection(
+ xContext->getServiceManager()->createInstanceWithContext(
+ "com.sun.star.datatransfer.clipboard.GenericClipboard", xContext), UNO_QUERY);
+ xSelection = s_xSelection;
+#endif
+ }
+ catch (RuntimeException const &) {}
+ return xSelection;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 826ba0cbadbe..3b26f70d7040 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -46,6 +46,7 @@
#include <vcl/sysdata.hxx>
#include <vcl/ptrstyle.hxx>
#include <vcl/IDialogRenderable.hxx>
+#include <vcl/transfer.hxx>
#include <vcl/uitest/uiobject.hxx>
#include <vcl/uitest/uitest.hxx>
@@ -3273,68 +3274,20 @@ void Window::SetClipboard(Reference<XClipboard> const & xClipboard)
Reference< XClipboard > Window::GetClipboard()
{
-
- if( mpWindowImpl->mpFrameData )
- {
- if( ! mpWindowImpl->mpFrameData->mxClipboard.is() )
- {
- try
- {
- mpWindowImpl->mpFrameData->mxClipboard
- = css::datatransfer::clipboard::SystemClipboard::create(
- comphelper::getProcessComponentContext());
- }
- catch (DeploymentException const &)
- {
- TOOLS_WARN_EXCEPTION("vcl.window", "ignoring");
- }
- }
-
- return mpWindowImpl->mpFrameData->mxClipboard;
- }
-
- return static_cast < XClipboard * > (nullptr);
+ if (!mpWindowImpl->mpFrameData)
+ return static_cast<XClipboard*>(nullptr);
+ if (!mpWindowImpl->mpFrameData->mxClipboard.is())
+ mpWindowImpl->mpFrameData->mxClipboard = GetSystemClipboard();
+ return mpWindowImpl->mpFrameData->mxClipboard;
}
Reference< XClipboard > Window::GetPrimarySelection()
{
-
- if( mpWindowImpl->mpFrameData )
- {
- if( ! mpWindowImpl->mpFrameData->mxSelection.is() )
- {
- try
- {
- Reference< XComponentContext > xContext( comphelper::getProcessComponentContext() );
-
-#if HAVE_FEATURE_X11
- // A hack, making the primary selection available as an instance
- // of the SystemClipboard service on X11:
- Sequence< Any > args(1);
- args[0] <<= OUString("PRIMARY");
- mpWindowImpl->mpFrameData->mxSelection.set(
- (xContext->getServiceManager()->
- createInstanceWithArgumentsAndContext(
- "com.sun.star.datatransfer.clipboard.SystemClipboard",
- args, xContext)),
- UNO_QUERY_THROW);
-#else
- static Reference< XClipboard > s_xSelection(
- xContext->getServiceManager()->createInstanceWithContext( "com.sun.star.datatransfer.clipboard.GenericClipboard", xContext ), UNO_QUERY );
-
- mpWindowImpl->mpFrameData->mxSelection = s_xSelection;
-#endif
- }
- catch (RuntimeException const &)
- {
- TOOLS_WARN_EXCEPTION("vcl.window", "ignoring");
- }
- }
-
- return mpWindowImpl->mpFrameData->mxSelection;
- }
-
- return static_cast < XClipboard * > (nullptr);
+ if (!mpWindowImpl->mpFrameData)
+ return static_cast<XClipboard*>(nullptr);
+ if (!mpWindowImpl->mpFrameData->mxSelection.is())
+ mpWindowImpl->mpFrameData->mxSelection = GetSystemPrimarySelection();
+ return mpWindowImpl->mpFrameData->mxSelection;
}
void Window::RecordLayoutData( vcl::ControlLayoutData* pLayout, const tools::Rectangle& rRect )