tdf#126316 revert Clipboard to PrimarySelection

Regression from commit ce9795954d39 ("fix crash in header/footer
calc dialog"), which replaced some GetPrimarySelection() calls
with GetClipboard() calls.

This replaces the Window class calls for clipboard with global
GetSystem* calls in vcl/transfer.hxx. Not sure if this is the
best place, but the crowded Window class is definitly not.

Change-Id: Ic5f9e575c1ac5d43df234426c5616eca616dea30
Reviewed-on: https://gerrit.libreoffice.org/75318
Tested-by: Jenkins
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx
index 15937ac..15a25c4 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 b7f7d5d..0ef1130 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 3e1c4ee..888fe25 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 a731ec2..9160ba4 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 826ba0c..3b26f70 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 )