From 1ff360c29c99a570bfe59c69d8f589d4f2b59135 Mon Sep 17 00:00:00 2001
From: Miklos Vajna <vmiklos@collabora.com>
Date: Mon, 14 Nov 2022 14:21:31 +0100
Subject: sw: add new FieldType parameter for the .uno:TextFormField command

Currently LOK clients can't insert fieldmarks which are comparable to
the ones Zotero's Word extension inserts into DOCX files.

There is already a .uno:TextFormField UNO command to insert fieldmarks,
but it has a hardcoded field type set to ODF_FORMTEXT, which is not what
we need.

Fix this by adding a new, optional FieldType parameter to the existing
UNO command.

The field code/command and the result is not yet possible to customize.

Change-Id: I5625858af950f718220eebeef8fb90267693db7a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142709
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
---
 sw/qa/uibase/shells/shells.cxx | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

(limited to 'sw/qa')

diff --git a/sw/qa/uibase/shells/shells.cxx b/sw/qa/uibase/shells/shells.cxx
index 55b388860adc..c107913e6469 100644
--- a/sw/qa/uibase/shells/shells.cxx
+++ b/sw/qa/uibase/shells/shells.cxx
@@ -25,6 +25,7 @@
 #include <comphelper/processfactory.hxx>
 #include <comphelper/propertyvalue.hxx>
 #include <unotools/ucbstreamhelper.hxx>
+#include <xmloff/odffields.hxx>
 
 #include <IDocumentContentOperations.hxx>
 #include <cmdid.h>
@@ -269,6 +270,32 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testContentControlPageBreak)
     CPPUNIT_ASSERT_EQUAL(1, getPages());
 }
 
+CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testInsertTextFormField)
+{
+    // Given an empty document:
+    createSwDoc();
+    SwDoc* pDoc = getSwDoc();
+
+    // When inserting an ODF_UNHANDLED fieldmark:
+    uno::Sequence<css::beans::PropertyValue> aArgs = {
+        comphelper::makePropertyValue("FieldType", uno::Any(OUString(ODF_UNHANDLED))),
+    };
+    dispatchCommand(mxComponent, ".uno:TextFormField", aArgs);
+
+    // Then make sure that it's type/name is correct:
+    SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+    SwCursor* pCursor = pWrtShell->GetCursor();
+    pCursor->SttEndDoc(/*bSttDoc=*/true);
+    sw::mark::IFieldmark* pFieldmark
+        = pDoc->getIDocumentMarkAccess()->getFieldmarkAt(*pCursor->GetPoint());
+    CPPUNIT_ASSERT(pFieldmark);
+    // Without the accompanying fix in place, this test would have failed with:
+    // - Expected: vnd.oasis.opendocument.field.UNHANDLED
+    // - Actual  : vnd.oasis.opendocument.field.FORMTEXT
+    // i.e. the custom type parameter was ignored.
+    CPPUNIT_ASSERT_EQUAL(OUString(ODF_UNHANDLED), pFieldmark->GetFieldname());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
-- 
cgit