summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2022-10-26 10:03:04 +0200
committerMiklos Vajna <vmiklos@collabora.com>2022-10-26 15:34:30 +0200
commit23272c0cfe01d0719572bc80733833f6f8c09f24 (patch)
tree7c20093a1d6a8b524dfb6587c47ca90147601fd2 /writerfilter
parent3005bd3793e76f8c010a9e774cfb508de406a3d1 (diff)
sw content controls: enable data binding for date
The document had a 2022 date in document.xml, but had a 2012 date in data binding. Writer used to show 2022, while Word picks 2012. Data binding for dates were disabled in commit de90c192cb8f1f03a4028493d8bfe9a127a76b2a (sw content controls, plain text: enable DOCX filter with data binding, 2022-09-19), because the formatting of those date timestamps were missing, so it was better to just not update them from data binding, temporarily. Fix the problem by adding a new read-only DateString property on SwXContentControl, this way the import filter can set not only the timestamp but the formatted date as well. This shares the SwContentControl::GetDateString() code with the UI, which already had the need in the past to turn a timestamp into a date string, based on a provided language and date format. (cherry picked from commit 58002ab85d992c7ac44d8bb4d135246b67aa5cc7) Conflicts: sw/source/core/unocore/unomap1.cxx Change-Id: I842a9483a675f895129a9854caec347be6b6b84e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141867 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/qa/cppunittests/dmapper/DomainMapper_Impl.cxx23
-rw-r--r--writerfilter/qa/cppunittests/dmapper/data/content-control-date-data-binding.docxbin0 -> 33834 bytes
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx18
3 files changed, 39 insertions, 2 deletions
diff --git a/writerfilter/qa/cppunittests/dmapper/DomainMapper_Impl.cxx b/writerfilter/qa/cppunittests/dmapper/DomainMapper_Impl.cxx
index 3012ab8d0e2f..4c6b2b979def 100644
--- a/writerfilter/qa/cppunittests/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/qa/cppunittests/dmapper/DomainMapper_Impl.cxx
@@ -318,6 +318,29 @@ CPPUNIT_TEST_FIXTURE(Test, testClearingBreak)
// SwLineBreakClear::ALL
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(3), eClear);
}
+
+CPPUNIT_TEST_FIXTURE(Test, testContentControlDateDataBinding)
+{
+ // Given a document with date content control and data binding, data binding date is 2012,
+ // in-document date is 2022:
+ OUString aURL
+ = m_directories.getURLFromSrc(DATA_DIRECTORY) + "content-control-date-data-binding.docx";
+
+ // When loading that file:
+ getComponent() = loadFromDesktop(aURL);
+
+ // Then make sure that the date is from the data binding, not from document.xml:
+ uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY);
+ uno::Reference<text::XText> xText = xTextDocument->getText();
+ uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xText, uno::UNO_QUERY);
+ uno::Reference<container::XEnumeration> xParagraphs = xParaEnumAccess->createEnumeration();
+ uno::Reference<text::XTextRange> xParagraph(xParagraphs->nextElement(), uno::UNO_QUERY);
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 4/26/2012
+ // - Actual : 4/26/2022
+ // i.e. the date was from document.xml, which is considered outdated.
+ CPPUNIT_ASSERT_EQUAL(OUString("4/26/2012"), xParagraph->getString());
+}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/qa/cppunittests/dmapper/data/content-control-date-data-binding.docx b/writerfilter/qa/cppunittests/dmapper/data/content-control-date-data-binding.docx
new file mode 100644
index 000000000000..9ad644ef642c
--- /dev/null
+++ b/writerfilter/qa/cppunittests/dmapper/data/content-control-date-data-binding.docx
Binary files differ
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 2f7cc6ca619a..ada74256cfc0 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -888,7 +888,7 @@ void DomainMapper_Impl::PopSdt()
xCursor->gotoRange(xEnd, /*bExpand=*/true);
std::optional<OUString> oData = m_pSdtHelper->getValueFromDataBinding();
- if (oData.has_value() && m_pSdtHelper->getControlType() != SdtControlType::datePicker)
+ if (oData.has_value())
{
// Data binding has a value for us, prefer that over the in-document value.
xCursor->setString(*oData);
@@ -986,6 +986,7 @@ void DomainMapper_Impl::PopSdt()
xContentControlProps->setPropertyValue("Picture", uno::Any(true));
}
+ bool bDateFromDataBinding = false;
if (m_pSdtHelper->getControlType() == SdtControlType::datePicker)
{
xContentControlProps->setPropertyValue("Date", uno::Any(true));
@@ -994,8 +995,14 @@ void DomainMapper_Impl::PopSdt()
uno::Any(aDateFormat.replaceAll("'", "\"")));
xContentControlProps->setPropertyValue("DateLanguage",
uno::Any(m_pSdtHelper->getLocale().makeStringAndClear()));
+ OUString aCurrentDate = m_pSdtHelper->getDate().makeStringAndClear();
+ if (oData.has_value())
+ {
+ aCurrentDate = *oData;
+ bDateFromDataBinding = true;
+ }
xContentControlProps->setPropertyValue("CurrentDate",
- uno::Any(m_pSdtHelper->getDate().makeStringAndClear()));
+ uno::Any(aCurrentDate));
}
if (m_pSdtHelper->getControlType() == SdtControlType::plainText)
@@ -1005,6 +1012,13 @@ void DomainMapper_Impl::PopSdt()
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
+ if (bDateFromDataBinding)
+ {
+ OUString aDateString;
+ xContentControlProps->getPropertyValue("DateString") >>= aDateString;
+ xCursor->setString(aDateString);
+ }
+
m_pSdtHelper->clear();
}