summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-11-13 17:30:22 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-11-13 17:30:54 +0100
commit57972554b58a680f47a05f4d6711c99106f80523 (patch)
treeeacbbd1051685b5e870a1a9448387fc013785550
parent022c716fc89c7315a7c454c01e2fe70d5aece289 (diff)
sw lok comments: fix position of blinking cursor after mouse click
LOK always works in absolute twips (origo being the top left corner of SwEditWin), so not only the callbacks have to translate relative twips to absolute ones, but the opposite have to be done for mouse event coordinates. With this, clicking at a random position inside a comment places the blinking cursor at a reasonable position, not always at 0,0. Change-Id: Ic8d20f177acd9e1908acf17698c53a1470bd4aec
-rw-r--r--sw/source/uibase/docvw/SidebarWin.cxx24
1 files changed, 18 insertions, 6 deletions
diff --git a/sw/source/uibase/docvw/SidebarWin.cxx b/sw/source/uibase/docvw/SidebarWin.cxx
index 304e2148003d..1877e702549b 100644
--- a/sw/source/uibase/docvw/SidebarWin.cxx
+++ b/sw/source/uibase/docvw/SidebarWin.cxx
@@ -357,14 +357,25 @@ void SwSidebarWin::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, D
}
}
-/// We want to work in absolute twips: so set delta between rChild and rParent as origin on rChild, then disable map mode on rChild.
-static void lcl_setAbsoluteTwips(vcl::Window& rParent, vcl::Window& rChild)
+/// Translate absolute <-> relative twips: LOK wants absolute coordinates as output and gives absolute coordinates as input.
+static void lcl_translateTwips(vcl::Window& rParent, vcl::Window& rChild, MouseEvent* pMouseEvent)
{
+ // Set map mode, so that callback payloads will contain absolute coordinates instead of relative ones.
Point aOffset(rChild.GetOutOffXPixel() - rParent.GetOutOffXPixel(), rChild.GetOutOffYPixel() - rParent.GetOutOffYPixel());
+ aOffset = rChild.PixelToLogic(aOffset);
MapMode aMapMode(rChild.GetMapMode());
- aMapMode.SetOrigin(rChild.PixelToLogic(aOffset));
+ aMapMode.SetOrigin(aOffset);
rChild.SetMapMode(aMapMode);
rChild.EnableMapMode(false);
+
+ if (pMouseEvent)
+ {
+ // Set event coordinates, so they contain relative coordinates instead of absolute ones.
+ Point aPos = pMouseEvent->GetPosPixel();
+ aPos.Move(-aOffset.getX(), -aOffset.getY());
+ MouseEvent aMouseEvent(aPos, pMouseEvent->GetClicks(), pMouseEvent->GetMode(), pMouseEvent->GetButtons(), pMouseEvent->GetModifier());
+ *pMouseEvent = aMouseEvent;
+ }
}
void SwSidebarWin::KeyInput(const KeyEvent& rKeyEvent)
@@ -372,7 +383,7 @@ void SwSidebarWin::KeyInput(const KeyEvent& rKeyEvent)
if (mpSidebarTextControl)
{
mpSidebarTextControl->Push(PushFlags::MAPMODE);
- lcl_setAbsoluteTwips(EditWin(), *mpSidebarTextControl);
+ lcl_translateTwips(EditWin(), *mpSidebarTextControl, nullptr);
mpSidebarTextControl->KeyInput(rKeyEvent);
@@ -385,9 +396,10 @@ void SwSidebarWin::MouseButtonDown(const MouseEvent& rMouseEvent)
if (mpSidebarTextControl)
{
mpSidebarTextControl->Push(PushFlags::MAPMODE);
- lcl_setAbsoluteTwips(EditWin(), *mpSidebarTextControl);
+ MouseEvent aMouseEvent(rMouseEvent);
+ lcl_translateTwips(EditWin(), *mpSidebarTextControl, &aMouseEvent);
- mpSidebarTextControl->MouseButtonDown(rMouseEvent);
+ mpSidebarTextControl->MouseButtonDown(aMouseEvent);
mpSidebarTextControl->Pop();
}