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     :

Reply via email to