tdf#122658: Empty date form field is not exported correctly to DOCX file
We need to export date format and also text content
in case of empty date field. Otherwise the exported
date field will be lost during import into LO Writer
or MSO Word.
Change-Id: I5cf65bedba010f64ca8f56262057f3cce32b0943
Reviewed-on: https://gerrit.libreoffice.org/66194
Tested-by: Jenkins
Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
diff --git a/sw/qa/extras/ooxmlexport/data/empty-date-control.odt b/sw/qa/extras/ooxmlexport/data/empty-date-control.odt
new file mode 100755
index 0000000..acd5b8b
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/empty-date-control.odt
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index b22c5cd..dac9337 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -14,6 +14,7 @@
#include <com/sun/star/text/WritingMode2.hpp>
#include <com/sun/star/text/XTextFrame.hpp>
#include <com/sun/star/text/XTextFramesSupplier.hpp>
#include <com/sun/star/drawing/XControlShape.hpp>
#include <sfx2/docfile.hxx>
#include <sfx2/docfilt.hxx>
@@ -66,6 +67,25 @@
CPPUNIT_ASSERT_EQUAL_MESSAGE("Section Left Margin", sal_Int32(2540), getProperty<sal_Int32>(xSect, "SectionLeftMargin"));
}
DECLARE_OOXMLEXPORT_TEST(testDateControl, "empty-date-control.odt")
{
// Check that we did not lost the date control
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xDraws->getCount());
uno::Reference<drawing::XControlShape> xControl(getShape(1), uno::UNO_QUERY);
CPPUNIT_ASSERT(xControl->getControl().is());
// check XML
xmlDocPtr pXmlDoc = parseExport("word/document.xml");
if (!pXmlDoc)
return;
// We need to export date format and a dummy character (" ") for empty date control
assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:dateFormat", "val", "dd/MM/yyyy");
assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t", u" ");
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
old mode 100644
new mode 100755
index c655d99..e845fe0
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -5037,7 +5037,13 @@
}
}
else
{
aContentText = xPropertySet->getPropertyValue("HelpText").get<OUString>();
if(aContentText.isEmpty())
aContentText = " "; // Need to write out something to have it imported by MS Word
if(sDateFormat.isEmpty())
sDateFormat = "dd/MM/yyyy"; // Need to set date format even if there is no date set
}
// output component
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx
index 316980a..0b87074 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -163,7 +163,7 @@
xPropertySet->setPropertyValue("Date", uno::makeAny(aDate));
}
else
xPropertySet->setPropertyValue("HelpText", uno::makeAny(rContentText));
xPropertySet->setPropertyValue("HelpText", uno::makeAny(rContentText.trim()));
// append date format to grab bag
comphelper::SequenceAsHashMap aGrabBag;