summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2022-05-27 08:06:18 +0200
committerMiklos Vajna <vmiklos@collabora.com>2022-05-27 08:44:10 +0200
commit10b1a9eb8588e15ea5e98001cc4d5ab2d56604f3 (patch)
treed68f643550232f70e71822243b2994455525bf8c
parentb7efccde76ca7bfa181fff39c52282e87e940614 (diff)
sw content controls, date: add DOCX export
Map the Date, DateFormat and DateLanguage UNO properties to: <w:date> <w:dateFormat w:val="..."/> <w:lid w:val="..."/> </w:date> Change-Id: I4695ac30be26968b2c2ea14b044c1e2a10638ea8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135033 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport17.cxx34
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx18
2 files changed, 52 insertions, 0 deletions
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
index fd6c560395b5..2ba7a7cfdd97 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
@@ -371,6 +371,40 @@ CPPUNIT_TEST_FIXTURE(Test, testPictureContentControlExport)
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:picture", 1);
}
+CPPUNIT_TEST_FIXTURE(Test, testDateContentControlExport)
+{
+ // Given a document with a date content control around a text portion:
+ mxComponent = loadFromDesktop("private:factory/swriter");
+ uno::Reference<lang::XMultiServiceFactory> xMSF(mxComponent, uno::UNO_QUERY);
+ uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
+ uno::Reference<text::XText> xText = xTextDocument->getText();
+ uno::Reference<text::XTextCursor> xCursor = xText->createTextCursor();
+ xText->insertString(xCursor, "test", /*bAbsorb=*/false);
+ xCursor->gotoStart(/*bExpand=*/false);
+ xCursor->gotoEnd(/*bExpand=*/true);
+ uno::Reference<text::XTextContent> xContentControl(
+ xMSF->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
+ xContentControlProps->setPropertyValue("Date", uno::Any(true));
+ xContentControlProps->setPropertyValue("DateFormat", uno::Any(OUString("M/d/yyyy")));
+ xContentControlProps->setPropertyValue("DateLanguage", uno::Any(OUString("en-US")));
+ xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
+
+ // When exporting to DOCX:
+ save("Office Open XML Text", maTempFile);
+ mbExported = true;
+
+ // Then make sure the expected markup is used:
+ xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml");
+ // Without the fix in place, this test would have failed with:
+ // - Expected: 1
+ // - Actual : 0
+ // - XPath '//w:sdt/w:sdtPr/w:date/w:dateFormat' number of nodes is incorrect
+ // i.e. the <w:date> was lost on export.
+ assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:date/w:dateFormat", "val", "M/d/yyyy");
+ assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:date/w:lid", "val", "en-US");
+}
+
CPPUNIT_TEST_FIXTURE(Test, testTdf148494)
{
loadAndSave("tdf148494.docx");
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 6d179315d456..3d9835ef410a 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -2372,6 +2372,24 @@ void DocxAttributeOutput::WriteContentControlStart()
m_pSerializer->endElementNS(XML_w, XML_dropDownList);
}
+ if (m_pContentControl->GetDate())
+ {
+ m_pSerializer->startElementNS(XML_w, XML_date);
+ OUString aDateFormat = m_pContentControl->GetDateFormat();
+ if (!aDateFormat.isEmpty())
+ {
+ m_pSerializer->singleElementNS(XML_w, XML_dateFormat, FSNS(XML_w, XML_val),
+ aDateFormat);
+ }
+ OUString aDateLanguage = m_pContentControl->GetDateLanguage();
+ if (!aDateLanguage.isEmpty())
+ {
+ m_pSerializer->singleElementNS(XML_w, XML_lid, FSNS(XML_w, XML_val),
+ aDateLanguage);
+ }
+ m_pSerializer->endElementNS(XML_w, XML_date);
+ }
+
m_pSerializer->endElementNS(XML_w, XML_sdtPr);
m_pSerializer->startElementNS(XML_w, XML_sdtContent);
m_pContentControl = nullptr;