include/vcl/window.hxx | 2 ++ sd/source/ui/inc/ViewShell.hxx | 5 +++++ sd/source/ui/inc/unomodel.hxx | 2 ++ sd/source/ui/unoidl/unomodel.cxx | 24 ++++++++++++++++++++++++ sd/source/ui/view/viewshel.cxx | 32 ++++++++++++++++++++++++++++++++ vcl/source/window/mouse.cxx | 9 +++++++++ 6 files changed, 74 insertions(+)
New commits: commit f19759645bbe1cde7023ab6136f9ed76bf2ee126 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Tue Feb 24 14:30:41 2015 +0100 Introduce SdXImpressDocument::postMouseEvent() override It's far from perfect, but the following use-case works: - open an empty document with a singe slide (only two placeholder shapes) - type a few characters (into the title shape), Esc to finish editing - click into the non-title placeholder - type + Esc -> characters appear in the non-title shape Change-Id: Idc97c1fbeda0fb3ac53769e78b7cd665d8aee67b diff --git a/sd/source/ui/inc/ViewShell.hxx b/sd/source/ui/inc/ViewShell.hxx index b4bd333..710c722 100644 --- a/sd/source/ui/inc/ViewShell.hxx +++ b/sd/source/ui/inc/ViewShell.hxx @@ -443,6 +443,11 @@ public: SdPage* pPage, const sal_Int32 nInsertPosition = -1); + /// Same as MouseButtonDown(), but coordinates are in logic unit. + void LogicMouseButtonDown(const MouseEvent& rMouseEvent); + /// Same as MouseButtonUp(), but coordinates are in logic unit. + void LogicMouseButtonUp(const MouseEvent& rMouseEvent); + class Implementation; protected: diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx index 768e4f6..64080e7 100644 --- a/sd/source/ui/inc/unomodel.hxx +++ b/sd/source/ui/inc/unomodel.hxx @@ -244,6 +244,8 @@ public: virtual void initializeForTiledRendering() SAL_OVERRIDE; /// @see vcl::ITiledRenderable::registerCallback(). virtual void registerCallback(LibreOfficeKitCallback pCallback, void* pData) SAL_OVERRIDE; + /// @see vcl::ITiledRenderable::postMouseEvent(). + virtual void postMouseEvent(int nType, int nX, int nY, int nCount) SAL_OVERRIDE; // XComponent diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx index ff9115a..054e8f2 100644 --- a/sd/source/ui/unoidl/unomodel.cxx +++ b/sd/source/ui/unoidl/unomodel.cxx @@ -2362,6 +2362,30 @@ void SdXImpressDocument::registerCallback(LibreOfficeKitCallback pCallback, void mpDoc->registerLibreOfficeKitCallback(pCallback, pData); } +void SdXImpressDocument::postMouseEvent(int nType, int nX, int nY, int nCount) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + MouseEvent aEvent(Point(convertTwipToMm100(nX), convertTwipToMm100(nY)), nCount, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT); + + switch (nType) + { + case LOK_MOUSEEVENT_MOUSEBUTTONDOWN: + pViewShell->LogicMouseButtonDown(aEvent); + break; + case LOK_MOUSEEVENT_MOUSEBUTTONUP: + pViewShell->LogicMouseButtonUp(aEvent); + break; + default: + assert(false); + break; + } +} + uno::Reference< i18n::XForbiddenCharacters > SdXImpressDocument::getForbiddenCharsTable() { uno::Reference< i18n::XForbiddenCharacters > xForb(mxForbidenCharacters); diff --git a/sd/source/ui/view/viewshel.cxx b/sd/source/ui/view/viewshel.cxx index 0581a7c..0056af8 100644 --- a/sd/source/ui/view/viewshel.cxx +++ b/sd/source/ui/view/viewshel.cxx @@ -502,6 +502,38 @@ void ViewShell::MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin) } } +void ViewShell::LogicMouseButtonDown(const MouseEvent& rMouseEvent) +{ + // When we're not doing tiled rendering, then positions must be passed as pixels. + assert(GetDoc()->isTiledRendering()); + + bool bMap = mpActiveWindow->IsMapModeEnabled(); + mpActiveWindow->EnableMapMode(false); + Point aPoint = mpActiveWindow->GetPointerPosPixel(); + mpActiveWindow->SetPointerPosPixel(rMouseEvent.GetPosPixel()); + + MouseButtonDown(rMouseEvent, 0); + + mpActiveWindow->SetPointerPosPixel(aPoint); + mpActiveWindow->EnableMapMode(bMap); +} + +void ViewShell::LogicMouseButtonUp(const MouseEvent& rMouseEvent) +{ + // When we're not doing tiled rendering, then positions must be passed as pixels. + assert(GetDoc()->isTiledRendering()); + + bool bMap = mpActiveWindow->IsMapModeEnabled(); + mpActiveWindow->EnableMapMode(false); + Point aPoint = mpActiveWindow->GetPointerPosPixel(); + mpActiveWindow->SetPointerPosPixel(rMouseEvent.GetPosPixel()); + + MouseButtonUp(rMouseEvent, 0); + + mpActiveWindow->SetPointerPosPixel(aPoint); + mpActiveWindow->EnableMapMode(bMap); +} + void ViewShell::MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin) { if (rMEvt.IsLeaveWindow()) commit a14673d338b37bb41743536beb1de34a70cafa57 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Tue Feb 24 14:00:28 2015 +0100 Add vcl::Window::SetLastMousePos() This is needed, as e.g. sd::FuText::DoExecute() queries the mouse position from VCL, which won't be correct in case the mouse event is generated by a LOK client, not by VCL. So add a method that makes it possible to set the position before MouseButton*() starts. Change-Id: I1e24ffb2a4a866c9cac89367907ffaec336ad1f6 diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx index b329f45..a6309d6 100644 --- a/include/vcl/window.hxx +++ b/include/vcl/window.hxx @@ -1013,6 +1013,8 @@ public: void SetPointerPosPixel( const Point& rPos ); Point GetPointerPosPixel(); Point GetLastPointerPosPixel(); + /// Similar to SetPointerPosPixel(), but sets the frame data's last mouse position instead. + void SetLastMousePos(const Point& rPos); void ShowPointer( bool bVisible ); void EnterWait(); void LeaveWait(); diff --git a/vcl/source/window/mouse.cxx b/vcl/source/window/mouse.cxx index cc1c032..25de8d3 100644 --- a/vcl/source/window/mouse.cxx +++ b/vcl/source/window/mouse.cxx @@ -532,6 +532,15 @@ void Window::SetPointerPosPixel( const Point& rPos ) mpWindowImpl->mpFrame->SetPointerPos( aPos.X(), aPos.Y() ); } +void Window::SetLastMousePos(const Point& rPos) +{ + // Do this conversion, so when GetPointerPosPixel() calls + // ImplFrameToOutput(), we get back the original position. + Point aPos = ImplOutputToFrame(rPos); + mpWindowImpl->mpFrameData->mnLastMouseX = aPos.X(); + mpWindowImpl->mpFrameData->mnLastMouseY = aPos.Y(); +} + Point Window::GetPointerPosPixel() { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits