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 8081bbcb2dd42508f8c306fe3b302392358fe892 Author: Vasily Melenchuk <vasily.melenc...@cib.de> AuthorDate: Thu Jul 6 12:45:11 2023 +0300 Commit: Thorsten Behrens <thorsten.behr...@allotropia.de> CommitDate: Tue Jul 18 22:14:40 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> (cherry picked from commit d434104497fa1bea5744d5ce4e9447f75834ba55) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154530 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 f849a5246bf4..4a32891f2503 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -7414,7 +7414,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 :