summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Cecchetti <marco.cecchetti@collabora.com>2020-02-06 11:19:32 +0100
committerMiklos Vajna <vmiklos@collabora.com>2020-02-06 20:23:40 +0100
commit814c69878b03cd053b53bcc81bbaeee02d416ce7 (patch)
treebd9ca4c30195bd5d68624df9c2067e63f50d253f
parentMissing test dependency (diff)
downloadcore-814c69878b03cd053b53bcc81bbaeee02d416ce7.tar.gz
core-814c69878b03cd053b53bcc81bbaeee02d416ce7.zip
lok: calc: formula input bar: set text selection as requested by client
Change-Id: If04ed3c1637249329530a73d20df9b9296d1004e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88089 Reviewed-by: Marco Cecchetti <marco.cecchetti@collabora.com> Tested-by: Marco Cecchetti <marco.cecchetti@collabora.com> (cherry picked from commit 01f0d42f5ca9fb0e6e45b7bfcf51cb33c1a27bec) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88117 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r--desktop/qa/desktop_lib/test_desktop_lib.cxx3
-rw-r--r--desktop/source/lib/init.cxx31
-rw-r--r--include/LibreOfficeKit/LibreOfficeKit.h7
-rw-r--r--include/LibreOfficeKit/LibreOfficeKit.hxx13
-rw-r--r--vcl/source/window/seleng.cxx11
5 files changed, 63 insertions, 2 deletions
diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 14ecd2bcb196..a582ba764a01 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -2902,10 +2902,11 @@ void DesktopLOKTest::testABI()
CPPUNIT_ASSERT_EQUAL(documentClassOffset(57), offsetof(struct _LibreOfficeKitDocumentClass, renderFontOrientation));
CPPUNIT_ASSERT_EQUAL(documentClassOffset(58), offsetof(struct _LibreOfficeKitDocumentClass, paintWindowForView));
CPPUNIT_ASSERT_EQUAL(documentClassOffset(59), offsetof(struct _LibreOfficeKitDocumentClass, completeFunction));
+ CPPUNIT_ASSERT_EQUAL(documentClassOffset(60), offsetof(struct _LibreOfficeKitDocumentClass, setWindowTextSelection));
// Extending is fine, update this, and add new assert for the offsetof the
// new method
- CPPUNIT_ASSERT_EQUAL(documentClassOffset(60), sizeof(struct _LibreOfficeKitDocumentClass));
+ CPPUNIT_ASSERT_EQUAL(documentClassOffset(61), sizeof(struct _LibreOfficeKitDocumentClass));
}
CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest);
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 253ab51d2b29..65698eebbc37 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -1037,6 +1037,11 @@ static void doc_postUnoCommand(LibreOfficeKitDocument* pThis,
const char* pCommand,
const char* pArguments,
bool bNotifyWhenFinished);
+static void doc_setWindowTextSelection(LibreOfficeKitDocument* pThis,
+ unsigned nLOKWindowId,
+ bool swap,
+ int nX,
+ int nY);
static void doc_setTextSelection (LibreOfficeKitDocument* pThis,
int nType,
int nX,
@@ -1201,6 +1206,7 @@ LibLODocument_Impl::LibLODocument_Impl(const uno::Reference <css::lang::XCompone
m_pDocumentClass->sendDialogEvent = doc_sendDialogEvent;
m_pDocumentClass->postUnoCommand = doc_postUnoCommand;
m_pDocumentClass->setTextSelection = doc_setTextSelection;
+ m_pDocumentClass->setWindowTextSelection = doc_setWindowTextSelection;
m_pDocumentClass->getTextSelection = doc_getTextSelection;
m_pDocumentClass->getSelectionType = doc_getSelectionType;
m_pDocumentClass->getClipboard = doc_getClipboard;
@@ -3881,6 +3887,31 @@ static void doc_setTextSelection(LibreOfficeKitDocument* pThis, int nType, int n
pDoc->setTextSelection(nType, nX, nY);
}
+static void doc_setWindowTextSelection(LibreOfficeKitDocument* /*pThis*/, unsigned nLOKWindowId, bool swap, int nX, int nY)
+{
+ comphelper::ProfileZone aZone("doc_setWindowTextSelection");
+
+ SolarMutexGuard aGuard;
+ SetLastExceptionMsg();
+
+ VclPtr<Window> pWindow = vcl::Window::FindLOKWindow(nLOKWindowId);
+ if (!pWindow)
+ {
+ SetLastExceptionMsg("Document doesn't support dialog rendering, or window not found.");
+ return;
+ }
+
+
+ Size aOffset(pWindow->GetOutOffXPixel(), pWindow->GetOutOffYPixel());
+ Point aCursorPos(nX, nY);
+ aCursorPos.Move(aOffset);
+ sal_uInt16 nModifier = swap ? KEY_MOD1 + KEY_MOD2 : KEY_SHIFT;
+
+ MouseEvent aCursorEvent(aCursorPos, 1, MouseEventModifiers::SIMPLECLICK, 0, nModifier);
+ Application::PostMouseEvent(VclEventId::WindowMouseButtonDown, pWindow, &aCursorEvent);
+ Application::PostMouseEvent(VclEventId::WindowMouseButtonUp, pWindow, &aCursorEvent);
+}
+
static bool getFromTransferrable(
const css::uno::Reference<css::datatransfer::XTransferable> &xTransferable,
const OString &aInMimeType, OString &aRet);
diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h
index b4278625ccb0..6203c11fb044 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.h
+++ b/include/LibreOfficeKit/LibreOfficeKit.h
@@ -439,6 +439,13 @@ struct _LibreOfficeKitDocumentClass
/// @see lok::Document::completeFunction().
void (*completeFunction) (LibreOfficeKitDocument* pThis, int nIndex);
+ /// @see lok::Document::setWindowTextSelection
+ void (*setWindowTextSelection) (LibreOfficeKitDocument* pThis,
+ unsigned nWindowId,
+ bool bSwap,
+ int nX,
+ int nY);
+
#endif // defined LOK_USE_UNSTABLE_API || defined LIBO_INTERNAL_ONLY
};
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index 28a603e02203..4076637863fd 100644
--- a/include/LibreOfficeKit/LibreOfficeKit.hxx
+++ b/include/LibreOfficeKit/LibreOfficeKit.hxx
@@ -766,6 +766,19 @@ public:
mpDoc->pClass->completeFunction(mpDoc, nIndex);
}
+ /**
+ * Sets the start or end of a text selection for a dialog.
+ *
+ * @param nWindowId
+ * @param bSwap swap anchor and cursor position of current selection
+ * @param nX horizontal position in document coordinates
+ * @param nY vertical position in document coordinates
+ */
+ void setWindowTextSelection(unsigned nWindowId, bool bSwap, int nX, int nY)
+ {
+ mpDoc->pClass->setWindowTextSelection(mpDoc, nWindowId, bSwap, nX, nY);
+ }
+
#endif // defined LOK_USE_UNSTABLE_API || defined LIBO_INTERNAL_ONLY
};
diff --git a/vcl/source/window/seleng.cxx b/vcl/source/window/seleng.cxx
index cb3b19056bcd..41d0d5f89ec9 100644
--- a/vcl/source/window/seleng.cxx
+++ b/vcl/source/window/seleng.cxx
@@ -119,7 +119,9 @@ bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
return false;
sal_uInt16 nModifier = rMEvt.GetModifier() | nLockedMods;
- if ( nModifier & KEY_MOD2 )
+ bool nSwap = comphelper::LibreOfficeKit::isActive() && (nModifier & KEY_MOD1) && (nModifier & KEY_MOD2);
+
+ if ( !nSwap && (nModifier & KEY_MOD2) )
return false;
// in SingleSelection: filter Control-Key,
// so that a D&D can be also started with a Ctrl-Click
@@ -139,6 +141,13 @@ bool SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
nModifier = 0;
}
+ if (nSwap)
+ {
+ pFunctionSet->CreateAnchor();
+ pFunctionSet->SetCursorAtPoint( aPos );
+ return true;
+ }
+
switch ( nModifier )
{
case 0: // KEY_NO_KEY