sw/qa/extras/rtfexport/data/tdf156030.rtf | 11 ++++++ sw/qa/extras/rtfexport/rtfexport7.cxx | 38 ++++++++++++++++++++++ writerfilter/source/dmapper/DomainMapper_Impl.cxx | 30 ++++++++++++++++- 3 files changed, 78 insertions(+), 1 deletion(-)
New commits: commit da2e7b1e0b58aed20d44b7c588ee86d922d614a8 Author: Vasily Melenchuk <vasily.melenc...@cib.de> AuthorDate: Thu Jul 6 12:45:11 2023 +0300 Commit: Thorsten Behrens <thorsten.behr...@allotropia.de> CommitDate: Mon Jul 17 15:56:14 2023 +0200 tdf#156030: sw: better import of IF field for RTF and DOCX Since long time IF field was converted to ConditionalText, but no parameters were given. So condition, then text and else text were lost during import. Change-Id: I9b45e8ab394f3c53bb34370bf3ea15a939a400fe Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154101 Tested-by: Jenkins Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de> diff --git a/sw/qa/extras/rtfexport/data/tdf156030.rtf b/sw/qa/extras/rtfexport/data/tdf156030.rtf new file mode 100644 index 000000000000..db501d5bffac --- /dev/null +++ b/sw/qa/extras/rtfexport/data/tdf156030.rtf @@ -0,0 +1,11 @@ +{\rtf1 +{\field{\*\fldinst IF 1 = 2 "true value 1" "false value 1"}}\par +{\field{\*\fldinst IF 1 == 2 "true value 2" "false value 2"}}\par +{\field{\*\fldinst IF 1 != 2 "true value 3" "false value 3"}}\par +{\field{\*\fldinst IF 1 <> 2 "true value 4" "false value 4"}}\par +{\field{\*\fldinst IF 1 > 2 "true value 5" "false value 5"}}\par +{\field{\*\fldinst IF 1 < 2 "true value 6" "false value 6"}}\par +{\field{\*\fldinst IF 1 1 = 1 2 1 true value 7 false value 7}}\par +{\field{\*\fldinst IF 1 1 = "1 2 1 true value 8 fal"se "value 8}}\par +{\field{\*\fldinst IF a}}\par +} diff --git a/sw/qa/extras/rtfexport/rtfexport7.cxx b/sw/qa/extras/rtfexport/rtfexport7.cxx index 11eaadee6a88..ad9249bedeb8 100644 --- a/sw/qa/extras/rtfexport/rtfexport7.cxx +++ b/sw/qa/extras/rtfexport/rtfexport7.cxx @@ -683,6 +683,44 @@ DECLARE_RTFEXPORT_TEST(testTdf113202, "tdf113202.rtf") CPPUNIT_ASSERT(getProperty<bool>(getParagraph(4), "ParaContextMargin")); } +DECLARE_RTFEXPORT_TEST(testTdf156030, "tdf156030.rtf") +{ + uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xFieldsAccess( + xTextFieldsSupplier->getTextFields()); + uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration()); + + // As usual, fields given by FieldsAccess are not in same order as in the document + std::vector<std::vector<OUString>> aExpectedValues = { + { "1 FORMULA 2", "true value 1", "false value 1" }, // #1, condition should be 1 = 2 + { "", "", "" }, // #9, not enough field params + { "1 1 FORMULA 1 2 1 true value 8 fal", "se", "value 8" }, // #8, nonsense in field params + { "1 1 FORMULA 1 2 1 true value 7 false", "value", "7" }, // #7, another parse error + { "1 < 2", "true value 6", "false value 6" }, // #6 + { "1 > 2", "true value 5", "false value 5" }, // #5 + { "1 <> 2", "true value 4", "false value 4" }, // #4 + { "1 != 2", "true value 3", "false value 3" }, // #3 + { "1 FORMULA FORMULA 2", "true value 2", "false value 2" }, // #2, condition expected 1 == 2 + }; + uno::Reference<beans::XPropertySet> xPropertySet; + OUString sValue; + + for (const auto& aValues : aExpectedValues) + { + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xPropertySet.is()); + CPPUNIT_ASSERT(xPropertySet->getPropertyValue("Condition") >>= sValue); + CPPUNIT_ASSERT_EQUAL(aValues[0], sValue); + CPPUNIT_ASSERT(xPropertySet->getPropertyValue("TrueContent") >>= sValue); + CPPUNIT_ASSERT_EQUAL(aValues[1], sValue); + CPPUNIT_ASSERT(xPropertySet->getPropertyValue("FalseContent") >>= sValue); + CPPUNIT_ASSERT_EQUAL(aValues[2], sValue); + } + + // No more fields + CPPUNIT_ASSERT(!xFields->hasMoreElements()); +} + DECLARE_RTFEXPORT_TEST(testTdf153195, "tdf153195.rtf") { uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 491c755206b7..bf433e2b8d33 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -7447,7 +7447,35 @@ void DomainMapper_Impl::CloseFieldCommand() pContext->SetHyperlinkTarget(sTarget); } break; - case FIELD_IF : break; + case FIELD_IF: + { + if (vArguments.size() < 3) + { + SAL_WARN("writerfilter.dmapper", "IF field requires at lest 3 parameters!"); + break; + } + + if (xFieldProperties.is()) + { + // Following code assumes that last argument in field is false value + // before it - true value and everything before them is a condition + OUString sCondition; + size_t i = 0; + while (i < vArguments.size() - 2) { + if (!sCondition.isEmpty()) + sCondition += " "; + sCondition += vArguments[i++]; + } + + xFieldProperties->setPropertyValue( + "TrueContent", uno::Any(vArguments[vArguments.size() - 2])); + xFieldProperties->setPropertyValue( + "FalseContent", uno::Any(vArguments[vArguments.size() - 1])); + xFieldProperties->setPropertyValue( + "Condition", uno::Any(sCondition)); + } + } + break; case FIELD_INFO : break; case FIELD_INCLUDEPICTURE: break; case FIELD_KEYWORDS :