summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/qt5/Qt5DragAndDrop.hxx21
-rw-r--r--vcl/inc/qt5/Qt5Frame.hxx10
-rw-r--r--vcl/inc/qt5/Qt5Tools.hxx3
-rw-r--r--vcl/inc/qt5/Qt5Transferable.hxx2
-rw-r--r--vcl/inc/qt5/Qt5Widget.hxx2
-rw-r--r--vcl/qt5/Qt5DragAndDrop.cxx93
-rw-r--r--vcl/qt5/Qt5Frame.cxx153
-rw-r--r--vcl/qt5/Qt5Tools.cxx12
-rw-r--r--vcl/qt5/Qt5Widget.cxx32
-rw-r--r--vcl/unx/kf5/KF5SalFrame.hxx4
10 files changed, 174 insertions, 158 deletions
diff --git a/vcl/inc/qt5/Qt5DragAndDrop.hxx b/vcl/inc/qt5/Qt5DragAndDrop.hxx
index dcd6cb5e4048..0ec9ce5bbcb2 100644
--- a/vcl/inc/qt5/Qt5DragAndDrop.hxx
+++ b/vcl/inc/qt5/Qt5DragAndDrop.hxx
@@ -25,7 +25,6 @@ class Qt5DragSource
osl::Mutex m_aMutex;
Qt5Frame* m_pFrame;
css::uno::Reference<css::datatransfer::dnd::XDragSourceListener> m_xListener;
- css::uno::Reference<css::datatransfer::XTransferable> m_xTrans;
public:
Qt5DragSource()
@@ -55,17 +54,7 @@ public:
css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
- void dragFailed();
- void fire_dragEnd(sal_Int8 nAction);
-
- static Qt5DragSource* m_ActiveDragSource;
- static bool m_bDropSuccessSet;
- static bool m_bDropSuccess;
-
- css::uno::Reference<css::datatransfer::XTransferable> const& GetTransferable() const
- {
- return m_xTrans;
- }
+ void fire_dragEnd(sal_Int8 nAction, bool bSuccessful);
};
class Qt5DropTarget
@@ -76,11 +65,11 @@ class Qt5DropTarget
{
osl::Mutex m_aMutex;
Qt5Frame* m_pFrame;
- sal_Int8 mnDragAction;
- sal_Int8 mnDropAction;
+ sal_Int8 m_nDropAction;
bool m_bActive;
sal_Int8 m_nDefaultActions;
std::vector<css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>> m_aListeners;
+ bool m_bDropSuccessful;
public:
Qt5DropTarget();
@@ -115,10 +104,12 @@ public:
css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
void fire_dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtde);
+ void fire_dragExit(const css::datatransfer::dnd::DropTargetEvent& dte);
void fire_dragOver(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtde);
void fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& dtde);
- sal_Int8 proposedDragAction() const { return mnDragAction; }
+ sal_Int8 proposedDropAction() const { return m_nDropAction; }
+ bool dropSuccessful() const { return m_bDropSuccessful; }
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/qt5/Qt5Frame.hxx b/vcl/inc/qt5/Qt5Frame.hxx
index 4c94b846bc93..e296ce92db29 100644
--- a/vcl/inc/qt5/Qt5Frame.hxx
+++ b/vcl/inc/qt5/Qt5Frame.hxx
@@ -56,6 +56,8 @@ class Qt5MainWindow;
class Qt5Menu;
class Qt5SvpGraphics;
+class QDragMoveEvent;
+class QDropEvent;
class QImage;
class QMimeData;
class QPaintDevice;
@@ -159,10 +161,10 @@ 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, Qt::DropActions eActions,
- Qt::KeyboardModifiers eKeyMod, const QMimeData* pQMimeData);
- void dropping(const int x, const int y, Qt::KeyboardModifiers eKeyMod,
- const QMimeData* pQMimeData);
+
+ void handleDragLeave();
+ void handleDragMove(QDragMoveEvent* pEvent);
+ void handleDrop(QDropEvent* pEvent);
virtual void SetExtendedFrameStyle(SalExtStyle nExtStyle) override;
virtual void Show(bool bVisible, bool bNoActivate = false) override;
diff --git a/vcl/inc/qt5/Qt5Tools.hxx b/vcl/inc/qt5/Qt5Tools.hxx
index 6b1fb1adcc7e..697b703e28f4 100644
--- a/vcl/inc/qt5/Qt5Tools.hxx
+++ b/vcl/inc/qt5/Qt5Tools.hxx
@@ -70,6 +70,7 @@ inline QColor toQColor(const Color& rColor)
Qt::DropActions toQtDropActions(sal_Int8 dragOperation);
sal_Int8 toVclDropActions(Qt::DropActions dragOperation);
+sal_Int8 toVclDropAction(Qt::DropAction dragOperation);
Qt::DropAction getPreferredDropAction(sal_Int8 dragOperation);
inline QList<int> toQList(const css::uno::Sequence<sal_Int32>& aSequence)
@@ -126,8 +127,6 @@ inline sal_uInt16 getFormatBits(QImage::Format eFormat)
}
}
-static const QString sInternalMimeType = "application/x-libreoffice-dnditem";
-
typedef struct _cairo_surface cairo_surface_t;
struct CairoDeleter
{
diff --git a/vcl/inc/qt5/Qt5Transferable.hxx b/vcl/inc/qt5/Qt5Transferable.hxx
index df06661bb9fd..0d1cc70502aa 100644
--- a/vcl/inc/qt5/Qt5Transferable.hxx
+++ b/vcl/inc/qt5/Qt5Transferable.hxx
@@ -117,6 +117,8 @@ public:
QStringList formats() const override;
bool deepCopy(QMimeData** const) const;
+
+ css::datatransfer::XTransferable* xTransferable() const { return m_aContents.get(); }
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/qt5/Qt5Widget.hxx b/vcl/inc/qt5/Qt5Widget.hxx
index 85523951cda2..a69c86876a44 100644
--- a/vcl/inc/qt5/Qt5Widget.hxx
+++ b/vcl/inc/qt5/Qt5Widget.hxx
@@ -57,6 +57,7 @@ class Qt5Widget : public QWidget
virtual void mousePressEvent(QMouseEvent*) override;
virtual void mouseReleaseEvent(QMouseEvent*) override;
virtual void dragEnterEvent(QDragEnterEvent*) override;
+ virtual void dragLeaveEvent(QDragLeaveEvent*) override;
virtual void dragMoveEvent(QDragMoveEvent*) override;
virtual void dropEvent(QDropEvent*) override;
virtual void moveEvent(QMoveEvent*) override;
@@ -74,7 +75,6 @@ public:
Qt5Widget(Qt5Frame& rFrame, Qt::WindowFlags f = Qt::WindowFlags());
Qt5Frame& getFrame() const { return m_rFrame; }
- void startDrag(sal_Int8 nSourceActions);
void endExtTextInput();
static bool handleEvent(Qt5Frame&, const QWidget&, QEvent*);
diff --git a/vcl/qt5/Qt5DragAndDrop.cxx b/vcl/qt5/Qt5DragAndDrop.cxx
index ea26d5aaeb6f..3f57f3bc303e 100644
--- a/vcl/qt5/Qt5DragAndDrop.cxx
+++ b/vcl/qt5/Qt5DragAndDrop.cxx
@@ -16,13 +16,12 @@
#include <Qt5DragAndDrop.hxx>
#include <Qt5Frame.hxx>
+#include <Qt5Transferable.hxx>
#include <Qt5Widget.hxx>
-using namespace com::sun::star;
+#include <QtGui/QDrag>
-bool Qt5DragSource::m_bDropSuccessSet = false;
-bool Qt5DragSource::m_bDropSuccess = false;
-Qt5DragSource* Qt5DragSource::m_ActiveDragSource = nullptr;
+using namespace com::sun::star;
Qt5DragSource::~Qt5DragSource() {}
@@ -60,52 +59,35 @@ void Qt5DragSource::startDrag(
const css::uno::Reference<css::datatransfer::dnd::XDragSourceListener>& rListener)
{
m_xListener = rListener;
- m_xTrans = rTrans;
if (m_pFrame)
{
- Qt5Widget* qw = static_cast<Qt5Widget*>(m_pFrame->GetQWidget());
- m_ActiveDragSource = this;
- m_bDropSuccessSet = false;
- m_bDropSuccess = false;
- qw->startDrag(sourceActions);
+ QDrag* drag = new QDrag(m_pFrame->GetQWidget());
+ drag->setMimeData(new Qt5MimeData(rTrans));
+ // just a reminder that exec starts a nested event loop, so everything after
+ // this call is just executed, after D'n'D has finished!
+ drag->exec(toQtDropActions(sourceActions), getPreferredDropAction(sourceActions));
}
- else
- dragFailed();
-}
-void Qt5DragSource::dragFailed()
-{
- if (m_xListener.is())
- {
- datatransfer::dnd::DragSourceDropEvent aEv;
- aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_NONE;
- aEv.DropSuccess = false;
- auto xListener = m_xListener;
- m_xListener.clear();
- xListener->dragDropEnd(aEv);
- }
+ // the drop will eventually call fire_dragEnd, which will clear the listener.
+ // if D'n'D ends without success, we just get a leave event without any indicator,
+ // but the event loop will be terminated, so we have to try to inform the source of
+ // a failure in any way.
+ fire_dragEnd(datatransfer::dnd::DNDConstants::ACTION_NONE, false);
}
-void Qt5DragSource::fire_dragEnd(sal_Int8 nAction)
+void Qt5DragSource::fire_dragEnd(sal_Int8 nAction, bool bDropSuccessful)
{
if (m_xListener.is())
{
datatransfer::dnd::DragSourceDropEvent aEv;
aEv.DropAction = nAction;
-
- // internal DnD can accept the drop
- // but still fail in Qt5DropTarget::dropComplete
- if (m_bDropSuccessSet)
- aEv.DropSuccess = m_bDropSuccess;
- else
- aEv.DropSuccess = true;
+ aEv.DropSuccess = bDropSuccessful;
auto xListener = m_xListener;
m_xListener.clear();
xListener->dragDropEnd(aEv);
}
- m_ActiveDragSource = nullptr;
}
OUString SAL_CALL Qt5DragSource::getImplementationName()
@@ -175,8 +157,7 @@ void Qt5DropTarget::initialize(const uno::Sequence<uno::Any>& rArguments)
static_cast<OWeakObject*>(this));
}
- mnDragAction = datatransfer::dnd::DNDConstants::ACTION_NONE;
- mnDropAction = datatransfer::dnd::DNDConstants::ACTION_NONE;
+ m_nDropAction = datatransfer::dnd::DNDConstants::ACTION_NONE;
m_pFrame = reinterpret_cast<Qt5Frame*>(nFrame);
m_pFrame->registerDropTarget(this);
@@ -239,6 +220,8 @@ void Qt5DropTarget::fire_dragOver(const css::datatransfer::dnd::DropTargetDragEn
void Qt5DropTarget::fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& dtde)
{
+ m_bDropSuccessful = true;
+
osl::ClearableGuard<osl::Mutex> aGuard(m_aMutex);
std::vector<css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>> aListeners(
m_aListeners);
@@ -250,40 +233,28 @@ void Qt5DropTarget::fire_drop(const css::datatransfer::dnd::DropTargetDropEvent&
}
}
-void Qt5DropTarget::acceptDrag(sal_Int8 dragOperation)
+void Qt5DropTarget::fire_dragExit(const css::datatransfer::dnd::DropTargetEvent& dte)
{
- mnDragAction = dragOperation;
- return;
-}
+ osl::ClearableGuard<::osl::Mutex> aGuard(m_aMutex);
+ std::vector<css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>> aListeners(
+ m_aListeners);
+ aGuard.clear();
-void Qt5DropTarget::rejectDrag()
-{
- mnDragAction = 0;
- return;
+ for (auto const& listener : aListeners)
+ listener->dragExit(dte);
}
-void Qt5DropTarget::acceptDrop(sal_Int8 dropOperation)
-{
- mnDropAction = dropOperation;
- return;
-}
+void Qt5DropTarget::acceptDrag(sal_Int8 dragOperation) { m_nDropAction = dragOperation; }
-void Qt5DropTarget::rejectDrop()
-{
- mnDropAction = 0;
- return;
-}
+void Qt5DropTarget::rejectDrag() { m_nDropAction = 0; }
+
+void Qt5DropTarget::acceptDrop(sal_Int8 dropOperation) { m_nDropAction = dropOperation; }
+
+void Qt5DropTarget::rejectDrop() { m_nDropAction = 0; }
void Qt5DropTarget::dropComplete(sal_Bool success)
{
- // internal DnD
- if (Qt5DragSource::m_ActiveDragSource)
- {
- Qt5DragSource::m_bDropSuccessSet = true;
- Qt5DragSource::m_bDropSuccess = success;
- }
-
- return;
+ m_bDropSuccessful = (m_bDropSuccessful && success);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx
index 142cb12aa199..cd850e6c3c0f 100644
--- a/vcl/qt5/Qt5Frame.cxx
+++ b/vcl/qt5/Qt5Frame.cxx
@@ -36,6 +36,8 @@
#include <QtCore/QPoint>
#include <QtCore/QSize>
#include <QtCore/QThread>
+#include <QtGui/QDragMoveEvent>
+#include <QtGui/QDropEvent>
#include <QtGui/QIcon>
#include <QtGui/QWindow>
#include <QtGui/QScreen>
@@ -1187,84 +1189,145 @@ void Qt5Frame::deregisterDropTarget(Qt5DropTarget const* pDropTarget)
m_pDropTarget = nullptr;
}
-void Qt5Frame::draggingStarted(const int x, const int y, Qt::DropActions eActions,
- Qt::KeyboardModifiers eKeyMod, const QMimeData* pQMimeData)
+static css::uno::Reference<css::datatransfer::XTransferable>
+lcl_getXTransferable(const QMimeData* pMimeData)
{
- assert(m_pDropTarget);
+ css::uno::Reference<css::datatransfer::XTransferable> xTransferable;
+ const Qt5MimeData* pQt5MimeData = dynamic_cast<const Qt5MimeData*>(pMimeData);
+ if (!pQt5MimeData)
+ xTransferable = new Qt5DnDTransferable(pMimeData);
+ else
+ xTransferable = pQt5MimeData->xTransferable();
+ return xTransferable;
+}
- sal_Int8 nUserDropAction = css::datatransfer::dnd::DNDConstants::ACTION_MOVE;
+static sal_Int8 lcl_getUserDropAction(const QDropEvent* pEvent, const sal_Int8 nSourceActions,
+ const QMimeData* pMimeData)
+{
+ // we completely ignore all proposals by the Qt event, as they don't
+ // match at all with the preferred LO DnD actions.
+ const sal_Int8 nFilterActions
+ = nSourceActions | css::datatransfer::dnd::DNDConstants::ACTION_DEFAULT;
+
+ // check the key modifiers to detect a user-overridden DnD action
+ const Qt::KeyboardModifiers eKeyMod = pEvent->keyboardModifiers();
+ sal_Int8 nUserDropAction = 0;
if ((eKeyMod & Qt::ShiftModifier) && !(eKeyMod & Qt::ControlModifier))
nUserDropAction = css::datatransfer::dnd::DNDConstants::ACTION_MOVE;
else if ((eKeyMod & Qt::ControlModifier) && !(eKeyMod & Qt::ShiftModifier))
nUserDropAction = css::datatransfer::dnd::DNDConstants::ACTION_COPY;
else if ((eKeyMod & Qt::ShiftModifier) && (eKeyMod & Qt::ControlModifier))
nUserDropAction = css::datatransfer::dnd::DNDConstants::ACTION_LINK;
+ nUserDropAction &= nFilterActions;
+
+ // select the default DnD action, if there isn't a user preference
+ if (0 == nUserDropAction)
+ {
+ // default LO internal action is move, but default external action is copy
+ nUserDropAction = dynamic_cast<const Qt5MimeData*>(pMimeData)
+ ? css::datatransfer::dnd::DNDConstants::ACTION_MOVE
+ : css::datatransfer::dnd::DNDConstants::ACTION_COPY;
+ nUserDropAction &= nFilterActions;
+
+ // if the default doesn't match any allowed source action, fall back to the
+ // preferred of all allowed source actions
+ if (0 == nUserDropAction)
+ nUserDropAction = toVclDropAction(getPreferredDropAction(nSourceActions));
+
+ // this is "our" preference, but actually we would even prefer any default,
+ // if there is any
+ nUserDropAction |= css::datatransfer::dnd::DNDConstants::ACTION_DEFAULT;
+ }
+ return nUserDropAction;
+}
+
+void Qt5Frame::handleDragMove(QDragMoveEvent* pEvent)
+{
+ assert(m_pDropTarget);
+
+ // prepare our suggested drop action for the drop target
+ const sal_Int8 nSourceActions = toVclDropActions(pEvent->possibleActions());
+ const QMimeData* pMimeData = pEvent->mimeData();
+ const sal_Int8 nUserDropAction = lcl_getUserDropAction(pEvent, nSourceActions, pMimeData);
css::datatransfer::dnd::DropTargetDragEnterEvent aEvent;
aEvent.Source = static_cast<css::datatransfer::dnd::XDropTarget*>(m_pDropTarget);
aEvent.Context = static_cast<css::datatransfer::dnd::XDropTargetDragContext*>(m_pDropTarget);
- aEvent.LocationX = x;
- aEvent.LocationY = y;
-
- // system drop action if neither Shift nor Control is held
- if (!(eKeyMod & (Qt::ShiftModifier | Qt::ControlModifier)))
- aEvent.DropAction = getPreferredDropAction(eActions);
- // otherwise user-preferred action
- else
- aEvent.DropAction = nUserDropAction;
- aEvent.SourceActions = toVclDropActions(eActions);
+ aEvent.LocationX = pEvent->pos().x();
+ aEvent.LocationY = pEvent->pos().y();
+ aEvent.DropAction = nUserDropAction;
+ aEvent.SourceActions = nSourceActions;
- css::uno::Reference<css::datatransfer::XTransferable> xTransferable;
- if (!pQMimeData->hasFormat(sInternalMimeType))
- xTransferable = new Qt5DnDTransferable(pQMimeData);
- else
- xTransferable = Qt5DragSource::m_ActiveDragSource->GetTransferable();
-
- if (!m_bInDrag && xTransferable.is())
+ // ask the drop target to accept our drop action
+ if (!m_bInDrag)
{
- css::uno::Sequence<css::datatransfer::DataFlavor> aFormats
- = xTransferable->getTransferDataFlavors();
- aEvent.SupportedDataFlavors = aFormats;
-
+ aEvent.SupportedDataFlavors = lcl_getXTransferable(pMimeData)->getTransferDataFlavors();
m_pDropTarget->fire_dragEnter(aEvent);
m_bInDrag = true;
}
else
m_pDropTarget->fire_dragOver(aEvent);
+
+ // the drop target accepted our drop action => inform Qt
+ if (m_pDropTarget->proposedDropAction() != 0)
+ {
+ pEvent->setDropAction(getPreferredDropAction(m_pDropTarget->proposedDropAction()));
+ pEvent->accept();
+ }
+ else // or maybe someone else likes it?
+ pEvent->ignore();
}
-void Qt5Frame::dropping(const int x, const int y, Qt::KeyboardModifiers eKeyMod,
- const QMimeData* pQMimeData)
+void Qt5Frame::handleDrop(QDropEvent* pEvent)
{
assert(m_pDropTarget);
+ // prepare our suggested drop action for the drop target
+ const sal_Int8 nSourceActions = toVclDropActions(pEvent->possibleActions());
+ const sal_Int8 nUserDropAction
+ = lcl_getUserDropAction(pEvent, nSourceActions, pEvent->mimeData());
+
css::datatransfer::dnd::DropTargetDropEvent aEvent;
aEvent.Source = static_cast<css::datatransfer::dnd::XDropTarget*>(m_pDropTarget);
aEvent.Context = static_cast<css::datatransfer::dnd::XDropTargetDropContext*>(m_pDropTarget);
- aEvent.LocationX = x;
- aEvent.LocationY = y;
-
- if (!(eKeyMod & (Qt::ShiftModifier | Qt::ControlModifier)))
- aEvent.DropAction = m_pDropTarget->proposedDragAction()
- | css::datatransfer::dnd::DNDConstants::ACTION_DEFAULT;
- else
- aEvent.DropAction = m_pDropTarget->proposedDragAction();
- aEvent.SourceActions = css::datatransfer::dnd::DNDConstants::ACTION_MOVE;
-
- css::uno::Reference<css::datatransfer::XTransferable> xTransferable;
- if (!pQMimeData->hasFormat(sInternalMimeType))
- xTransferable = new Qt5DnDTransferable(pQMimeData);
- else
- xTransferable = Qt5DragSource::m_ActiveDragSource->GetTransferable();
- aEvent.Transferable = xTransferable;
+ aEvent.LocationX = pEvent->pos().x();
+ aEvent.LocationY = pEvent->pos().y();
+ aEvent.SourceActions = nSourceActions;
+ aEvent.DropAction = nUserDropAction;
+ aEvent.Transferable = lcl_getXTransferable(pEvent->mimeData());
+ // ask the drop target to accept our drop action
m_pDropTarget->fire_drop(aEvent);
m_bInDrag = false;
- if (m_pDragSource)
+ const bool bDropSuccessful = m_pDropTarget->dropSuccessful();
+ const sal_Int8 nDropAction = m_pDropTarget->proposedDropAction();
+
+ // inform the drag source of the drag-origin frame of the drop result
+ if (pEvent->source())
{
- m_pDragSource->fire_dragEnd(m_pDropTarget->proposedDragAction());
+ Qt5Widget* pWidget = dynamic_cast<Qt5Widget*>(pEvent->source());
+ assert(pWidget); // AFAIK there shouldn't be any non-Qt5Widget as source in LO itself
+ if (pWidget)
+ pWidget->getFrame().m_pDragSource->fire_dragEnd(nDropAction, bDropSuccessful);
}
+
+ // the drop target accepted our drop action => inform Qt
+ if (bDropSuccessful)
+ {
+ pEvent->setDropAction(getPreferredDropAction(nDropAction));
+ pEvent->accept();
+ }
+ else // or maybe someone else likes it?
+ pEvent->ignore();
+}
+
+void Qt5Frame::handleDragLeave()
+{
+ css::datatransfer::dnd::DropTargetEvent aEvent;
+ aEvent.Source = static_cast<css::datatransfer::dnd::XDropTarget*>(m_pDropTarget);
+ m_pDropTarget->fire_dragExit(aEvent);
+ m_bInDrag = false;
}
cairo_t* Qt5Frame::getCairoContext() const
diff --git a/vcl/qt5/Qt5Tools.cxx b/vcl/qt5/Qt5Tools.cxx
index cff661ba8a34..24e60b9e1375 100644
--- a/vcl/qt5/Qt5Tools.cxx
+++ b/vcl/qt5/Qt5Tools.cxx
@@ -80,6 +80,18 @@ sal_Int8 toVclDropActions(Qt::DropActions dragOperation)
return nRet;
}
+sal_Int8 toVclDropAction(Qt::DropAction dragOperation)
+{
+ sal_Int8 nRet(0);
+ if (dragOperation == Qt::CopyAction)
+ nRet = css::datatransfer::dnd::DNDConstants::ACTION_COPY;
+ else if (dragOperation == Qt::MoveAction)
+ nRet = css::datatransfer::dnd::DNDConstants::ACTION_MOVE;
+ else if (dragOperation == Qt::LinkAction)
+ nRet = css::datatransfer::dnd::DNDConstants::ACTION_LINK;
+ return nRet;
+}
+
Qt::DropAction getPreferredDropAction(sal_Int8 dragOperation)
{
Qt::DropAction eAct = Qt::IgnoreAction;
diff --git a/vcl/qt5/Qt5Widget.cxx b/vcl/qt5/Qt5Widget.cxx
index f3dbfd516716..4c1c474aa159 100644
--- a/vcl/qt5/Qt5Widget.cxx
+++ b/vcl/qt5/Qt5Widget.cxx
@@ -24,6 +24,7 @@
#include <Qt5Graphics.hxx>
#include <Qt5Instance.hxx>
#include <Qt5SvpGraphics.hxx>
+#include <Qt5Transferable.hxx>
#include <Qt5Tools.hxx>
#include <QtCore/QMimeData>
@@ -214,41 +215,20 @@ void Qt5Widget::wheelEvent(QWheelEvent* pEvent)
pEvent->accept();
}
-void Qt5Widget::startDrag(sal_Int8 nSourceActions)
-{
- // internal drag source
- QMimeData* mimeData = new QMimeData;
- mimeData->setData(sInternalMimeType, nullptr);
-
- QDrag* drag = new QDrag(this);
- drag->setMimeData(mimeData);
- drag->exec(toQtDropActions(nSourceActions), Qt::MoveAction);
-}
-
void Qt5Widget::dragEnterEvent(QDragEnterEvent* event)
{
- if (event->mimeData()->hasFormat(sInternalMimeType))
+ if (dynamic_cast<const Qt5MimeData*>(event->mimeData()))
event->accept();
else
event->acceptProposedAction();
}
-void Qt5Widget::dragMoveEvent(QDragMoveEvent* event)
-{
- QPoint point = event->pos();
+// also called when a drop is rejected
+void Qt5Widget::dragLeaveEvent(QDragLeaveEvent*) { m_rFrame.handleDragLeave(); }
- m_rFrame.draggingStarted(point.x(), point.y(), event->possibleActions(),
- event->keyboardModifiers(), event->mimeData());
- QWidget::dragMoveEvent(event);
-}
-
-void Qt5Widget::dropEvent(QDropEvent* event)
-{
- QPoint point = event->pos();
+void Qt5Widget::dragMoveEvent(QDragMoveEvent* pEvent) { m_rFrame.handleDragMove(pEvent); }
- m_rFrame.dropping(point.x(), point.y(), event->keyboardModifiers(), event->mimeData());
- QWidget::dropEvent(event);
-}
+void Qt5Widget::dropEvent(QDropEvent* pEvent) { m_rFrame.handleDrop(pEvent); }
void Qt5Widget::moveEvent(QMoveEvent* event)
{
diff --git a/vcl/unx/kf5/KF5SalFrame.hxx b/vcl/unx/kf5/KF5SalFrame.hxx
index 091a5b019ca7..f757535c2f35 100644
--- a/vcl/unx/kf5/KF5SalFrame.hxx
+++ b/vcl/unx/kf5/KF5SalFrame.hxx
@@ -38,10 +38,6 @@ public:
virtual SalGraphics* AcquireGraphics() override;
virtual void ReleaseGraphics(SalGraphics* pGraphics) override;
virtual void UpdateSettings(AllSettings& rSettings) override;
-
- virtual LanguageType GetInputLanguage() override { return LANGUAGE_SYSTEM; }
- virtual SalPointerState GetPointerState() override { return SalPointerState(); }
- virtual KeyIndicatorState GetIndicatorState() override { return KeyIndicatorState(); }
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */