include/vcl/window.hxx | 1 + sc/source/ui/view/select.cxx | 4 ++++ vcl/inc/window.h | 1 + vcl/source/window/mouse.cxx | 5 +++++ vcl/source/window/window.cxx | 1 + vcl/source/window/winproc.cxx | 26 +++++++++++++++++--------- 6 files changed, 29 insertions(+), 9 deletions(-)
New commits: commit f45e4008cb21832fd7922dad3e014d66b15f9a4a Author: Henry Castro <hcas...@collabora.com> AuthorDate: Wed Jun 30 18:45:38 2021 -0400 Commit: Henry Castro <hcas...@collabora.com> CommitDate: Tue Feb 15 13:58:23 2022 +0100 lok: sc: introduce LocalStartDrag method Update the mouse mode to start drag, otherwise it will conflict with normal cell selection. Change-Id: I6d4939b704114e7de1c9c051459fd02100a7536c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118874 Tested-by: Szymon Kłos <szymon.k...@collabora.com> Reviewed-by: Szymon Kłos <szymon.k...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118203 Tested-by: Jenkins Reviewed-by: Henry Castro <hcas...@collabora.com> diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx index ac0bfa54ad0a..08c87993b65e 100644 --- a/include/vcl/window.hxx +++ b/include/vcl/window.hxx @@ -1012,6 +1012,7 @@ public: static VclPtr<vcl::Window> SaveFocus(); static void EndSaveFocus(const VclPtr<vcl::Window>& xFocusWin); + void LocalStartDrag(); void CaptureMouse(); void ReleaseMouse(); bool IsMouseCaptured() const; diff --git a/sc/source/ui/view/select.cxx b/sc/source/ui/view/select.cxx index 18ac99b0ccd9..3dbe74373237 100644 --- a/sc/source/ui/view/select.cxx +++ b/sc/source/ui/view/select.cxx @@ -31,6 +31,7 @@ #include <markdata.hxx> #include <gridwin.hxx> #include <sfx2/lokhelper.hxx> +#include <comphelper/lok.hxx> #if defined(_WIN32) #define SC_SELENG_REFMODE_UPDATE_INTERVAL_MIN 65 @@ -205,6 +206,9 @@ void ScViewFunctionSet::BeginDrag() if ( pWindow->IsTracking() ) pWindow->EndTracking( TrackingEventFlags::Cancel ); // abort selecting + if (comphelper::LibreOfficeKit::isActive()) + pWindow->LocalStartDrag(); + SC_MOD()->SetDragObject( pTransferObj.get(), nullptr ); // for internal D&D pTransferObj->StartDrag( pWindow, nDragActions ); diff --git a/vcl/inc/window.h b/vcl/inc/window.h index c932a4d09d51..b5ef63ab327c 100644 --- a/vcl/inc/window.h +++ b/vcl/inc/window.h @@ -176,6 +176,7 @@ struct ImplFrameData css::uno::Reference< css::datatransfer::clipboard::XClipboard > mxClipboard; bool mbInternalDragGestureRecognizer; + bool mbDragging; VclPtr<VirtualDevice> mpBuffer; ///< Buffer for the double-buffering bool mbInBufferedPaint; ///< PaintHelper is in the process of painting into this buffer. tools::Rectangle maBufferedRect; ///< Rectangle in the buffer that has to be painted to the screen. diff --git a/vcl/source/window/mouse.cxx b/vcl/source/window/mouse.cxx index 02f6c8a484b1..7566cae5ddd9 100644 --- a/vcl/source/window/mouse.cxx +++ b/vcl/source/window/mouse.cxx @@ -443,6 +443,11 @@ void Window::SetMouseTransparent( bool bTransparent ) mpWindowImpl->mbMouseTransparent = bTransparent; } +void Window::LocalStartDrag() +{ + ImplGetFrameData()->mbDragging = true; +} + void Window::CaptureMouse() { ImplSVData* pSVData = ImplGetSVData(); diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 2072de7e0ed0..152d163f3399 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -807,6 +807,7 @@ ImplFrameData::ImplFrameData( vcl::Window *pWindow ) maResizeIdle.SetPriority( TaskPriority::RESIZE ); maResizeIdle.SetInvokeHandler( LINK( pWindow, vcl::Window, ImplHandleResizeTimerHdl ) ); mbInternalDragGestureRecognizer = false; + mbDragging = false; mbInBufferedPaint = false; mnDPIX = 96; mnDPIY = 96; diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx index 83f45b640ea6..ebd1fa43c0a5 100644 --- a/vcl/source/window/winproc.cxx +++ b/vcl/source/window/winproc.cxx @@ -831,21 +831,27 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& xWindow, MouseNotifyEven pFrameData->mbMouseIn = false; vcl::Window* pDragWin = pFrameData->mpMouseDownWin; - if (pDragWin && pFrameData->mbStartDragCalled && - nEvent == MouseNotifyEvent::MOUSEMOVE) + if (pDragWin && + nEvent == MouseNotifyEvent::MOUSEMOVE && + pFrameData->mbDragging) { css::uno::Reference<css::datatransfer::dnd::XDropTargetDragContext> xDropTargetDragContext = new GenericDropTargetDragContext(); css::uno::Reference<css::datatransfer::dnd::XDropTarget> xDropTarget( pDragWin->ImplGetWindowImpl()->mxDNDListenerContainer, css::uno::UNO_QUERY); - if (!xDropTargetDragContext.is() || - !xDropTarget.is() || - (nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) == + if ((nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) != (MouseSettings::GetStartDragCode() & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE))) + { + pDragWin->ImplGetFrameData()->mbDragging = false; + return false; + } + + if (!xDropTargetDragContext.is() || + !xDropTarget.is()) { // cancel dragdrop - pDragWin->ImplGetFrameData()->mbStartDragCalled = false; + pDragWin->ImplGetFrameData()->mbDragging = false; return false; } @@ -861,8 +867,9 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& xWindow, MouseNotifyEven return true; } - if (pDragWin && pFrameData->mbStartDragCalled && - nEvent == MouseNotifyEvent::MOUSEBUTTONUP) + if (pDragWin && + nEvent == MouseNotifyEvent::MOUSEBUTTONUP && + pFrameData->mbDragging) { css::uno::Reference<css::datatransfer::dnd::XDropTargetDropContext> xDropTargetDropContext = new GenericDropTargetDropContext(); @@ -882,7 +889,8 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& xWindow, MouseNotifyEven css::uno::Reference<css::datatransfer::XTransferable>()); } - pDragWin->ImplGetFrameData()->mbStartDragCalled = false; + pDragWin->ImplGetFrameData()->mbDragging = false; + return true; } vcl::Window* pDownWin = pFrameData->mpMouseDownWin;