tdf#120783: take suggested/preferred DnD ops into account

use those for drag operation start in Qt5Widget and eventually
to construct DropTargetDragEnterEvent

Change-Id: I3a92cbe722dadc64f8a210f7fd4016c8eb17216b
Reviewed-on: https://gerrit.libreoffice.org/68675
Tested-by: Jenkins
Reviewed-by: Katarina Behrens <Katarina.Behrens@cib.de>
(cherry picked from commit c3751ed3c98e8ed40100a8073b97c83d9ded0803)
Reviewed-on: https://gerrit.libreoffice.org/69122
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
diff --git a/vcl/inc/qt5/Qt5Frame.hxx b/vcl/inc/qt5/Qt5Frame.hxx
index 669833f..f3f8a38 100644
--- a/vcl/inc/qt5/Qt5Frame.hxx
+++ b/vcl/inc/qt5/Qt5Frame.hxx
@@ -137,7 +137,8 @@ public:
    virtual void deregisterDragSource(Qt5DragSource const* pDragSource);
    virtual void registerDropTarget(Qt5DropTarget* pDropTarget);
    virtual void deregisterDropTarget(Qt5DropTarget const* pDropTarget);
    void draggingStarted(const int x, const int y, const QMimeData* pQMimeData);
    void draggingStarted(const int x, const int y, Qt::DropActions eActions,
                         const QMimeData* pQMimeData);
    void dropping(const int x, const int y, const QMimeData* pQMimeData);

    virtual void SetExtendedFrameStyle(SalExtStyle nExtStyle) override;
diff --git a/vcl/inc/qt5/Qt5Tools.hxx b/vcl/inc/qt5/Qt5Tools.hxx
index 57bf947..336a942 100644
--- a/vcl/inc/qt5/Qt5Tools.hxx
+++ b/vcl/inc/qt5/Qt5Tools.hxx
@@ -30,6 +30,7 @@
#include <tools/gen.hxx>

#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>

#include <memory>

@@ -64,6 +65,10 @@ inline QColor toQColor(const Color& rColor)
                  255 - rColor.GetTransparency());
}

Qt::DropActions toQtDropActions(sal_Int8 dragOperation);
sal_Int8 toVclDropActions(Qt::DropActions dragOperation);
Qt::DropAction getPreferredDropAction(sal_Int8 dragOperation);

inline QList<int> toQList(const css::uno::Sequence<sal_Int32>& aSequence)
{
    QList<int> aList;
diff --git a/vcl/inc/qt5/Qt5Widget.hxx b/vcl/inc/qt5/Qt5Widget.hxx
index 731498f..a9b7a0b 100644
--- a/vcl/inc/qt5/Qt5Widget.hxx
+++ b/vcl/inc/qt5/Qt5Widget.hxx
@@ -74,7 +74,7 @@ public slots:
public:
    Qt5Widget(Qt5Frame& rFrame, Qt::WindowFlags f = Qt::WindowFlags());
    Qt5Frame* m_pFrame;
    void startDrag();
    void startDrag(sal_Int8 nSourceActions);
};

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5DragAndDrop.cxx b/vcl/qt5/Qt5DragAndDrop.cxx
index fcd65fe..adc7a94 100644
--- a/vcl/qt5/Qt5DragAndDrop.cxx
+++ b/vcl/qt5/Qt5DragAndDrop.cxx
@@ -128,7 +128,7 @@ void Qt5DragSource::initialize(const css::uno::Sequence<css::uno::Any>& rArgumen
}

void Qt5DragSource::startDrag(
    const datatransfer::dnd::DragGestureEvent& /*rEvent*/, sal_Int8 /*sourceActions*/,
    const datatransfer::dnd::DragGestureEvent& /*rEvent*/, sal_Int8 sourceActions,
    sal_Int32 /*cursor*/, sal_Int32 /*image*/,
    const css::uno::Reference<css::datatransfer::XTransferable>& rTrans,
    const css::uno::Reference<css::datatransfer::dnd::XDragSourceListener>& rListener)
@@ -140,7 +140,7 @@ void Qt5DragSource::startDrag(
    {
        Qt5Widget* qw = static_cast<Qt5Widget*>(m_pFrame->GetQWidget());
        m_ActiveDragSource = this;
        qw->startDrag();
        qw->startDrag(sourceActions);
    }
    else
        dragFailed();
diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx
index acf7c6d..27f331c 100644
--- a/vcl/qt5/Qt5Frame.cxx
+++ b/vcl/qt5/Qt5Frame.cxx
@@ -1078,7 +1078,8 @@ void Qt5Frame::deregisterDropTarget(Qt5DropTarget const* pDropTarget)
    m_pDropTarget = nullptr;
}

void Qt5Frame::draggingStarted(const int x, const int y, const QMimeData* pQMimeData)
void Qt5Frame::draggingStarted(const int x, const int y, Qt::DropActions eActions,
                               const QMimeData* pQMimeData)
{
    assert(m_pDropTarget);

@@ -1087,8 +1088,8 @@ void Qt5Frame::draggingStarted(const int x, const int y, const QMimeData* pQMime
    aEvent.Context = static_cast<css::datatransfer::dnd::XDropTargetDragContext*>(m_pDropTarget);
    aEvent.LocationX = x;
    aEvent.LocationY = y;
    aEvent.DropAction = css::datatransfer::dnd::DNDConstants::ACTION_MOVE;
    aEvent.SourceActions = css::datatransfer::dnd::DNDConstants::ACTION_MOVE;
    aEvent.DropAction = getPreferredDropAction(eActions);
    aEvent.SourceActions = toVclDropActions(eActions);

    css::uno::Reference<css::datatransfer::XTransferable> xTransferable;
    if (pQMimeData)
diff --git a/vcl/qt5/Qt5Tools.cxx b/vcl/qt5/Qt5Tools.cxx
index 54ac3f9..94bb03d 100644
--- a/vcl/qt5/Qt5Tools.cxx
+++ b/vcl/qt5/Qt5Tools.cxx
@@ -51,4 +51,42 @@ sal_uInt16 GetMouseModCode(Qt::MouseButtons eButtons)
    return nCode;
}

Qt::DropActions toQtDropActions(sal_Int8 dragOperation)
{
    Qt::DropActions eRet = Qt::IgnoreAction;
    if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_COPY)
        eRet |= Qt::CopyAction;
    if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_MOVE)
        eRet |= Qt::MoveAction;
    if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_LINK)
        eRet |= Qt::LinkAction;
    return eRet;
}

sal_Int8 toVclDropActions(Qt::DropActions dragOperation)
{
    sal_Int8 nRet(0);
    if (dragOperation & Qt::CopyAction)
        nRet |= css::datatransfer::dnd::DNDConstants::ACTION_COPY;
    if (dragOperation & Qt::MoveAction)
        nRet |= css::datatransfer::dnd::DNDConstants::ACTION_MOVE;
    if (dragOperation & Qt::LinkAction)
        nRet |= css::datatransfer::dnd::DNDConstants::ACTION_LINK;
    return nRet;
}

Qt::DropAction getPreferredDropAction(sal_Int8 dragOperation)
{
    Qt::DropAction eAct = Qt::IgnoreAction;

    if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_MOVE)
        eAct = Qt::MoveAction;
    else if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_COPY)
        eAct = Qt::CopyAction;
    else if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_LINK)
        eAct = Qt::LinkAction;

    return eAct;
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5Widget.cxx b/vcl/qt5/Qt5Widget.cxx
index 6d44262..4335a2b 100644
--- a/vcl/qt5/Qt5Widget.cxx
+++ b/vcl/qt5/Qt5Widget.cxx
@@ -188,7 +188,7 @@ void Qt5Widget::wheelEvent(QWheelEvent* pEvent)
    pEvent->accept();
}

void Qt5Widget::startDrag()
void Qt5Widget::startDrag(sal_Int8 nSourceActions)
{
    // internal drag source
    QMimeData* mimeData = new QMimeData;
@@ -196,7 +196,7 @@ void Qt5Widget::startDrag()

    QDrag* drag = new QDrag(this);
    drag->setMimeData(mimeData);
    drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::MoveAction);
    drag->exec(toQtDropActions(nSourceActions), Qt::MoveAction);
}

void Qt5Widget::dragEnterEvent(QDragEnterEvent* event)
@@ -211,7 +211,7 @@ void Qt5Widget::dragMoveEvent(QDragMoveEvent* event)
{
    QPoint point = event->pos();

    m_pFrame->draggingStarted(point.x(), point.y(), event->mimeData());
    m_pFrame->draggingStarted(point.x(), point.y(), event->possibleActions(), event->mimeData());
    QWidget::dragMoveEvent(event);
}