[Libreoffice-commits] core.git: sw/qa writerfilter/source

Jean-Sebastien Bevilacqua realitix at gmail.com
Thu Mar 30 17:39:23 UTC 2017


 sw/qa/extras/ooxmlimport/data/tdf105975.docx      |binary
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx          |   17 ++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   31 ++++++++++++++++++++--
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |    3 ++
 4 files changed, 49 insertions(+), 2 deletions(-)

New commits:
commit c568eb7d3bb4584867f0a1f0a7965f73097f009b
Author: Jean-Sebastien Bevilacqua <realitix at gmail.com>
Date:   Thu Feb 16 10:54:33 2017 +0100

    tdf#105975 Add Formula field parsing (docx) in SWriter
    
    Introduction
    ------------
    
    In MSWord, you can create a formula field (starting with =).
    When you save your file as `docx`, this `FORMULA` field is registered
    in you file (a field starting with `=`). In its current state,
    LibreOffice can't parse the `FORMULA` field in `docx` file.
    
    Context of this fix
    -------------------
    
    This fix is entirely located in the `DomainMapper_Impl.cxx` file
    because it's where the parsing is done.
    
    How this fix works
    ------------------
    
    First, we add `FORMULA` support by adding it to the `aFields[]` variable.
    Next, to handle the `FORMULA` constant, we add a condition (swith case) in
    `DomainMapper_Impl::CloseFieldCommand()` to call `handleFieldFormula`.
    
    Note
    ----
    
    In function `lcl_ExtractToken`, if command starts with `=`, it's a
    `FORMULA` field.
    
    Change-Id: If7d25de5413aa3133b22523d8a3f34ab6961adfc
    Reviewed-on: https://gerrit.libreoffice.org/34334
    Reviewed-by: Michael Stahl <mstahl at redhat.com>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/sw/qa/extras/ooxmlimport/data/tdf105975.docx b/sw/qa/extras/ooxmlimport/data/tdf105975.docx
new file mode 100644
index 000000000000..f9407df8889d
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/tdf105975.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 7fb3871f32ed..208ed6370e7b 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -722,6 +722,23 @@ DECLARE_OOXMLIMPORT_TEST(testfdo76583, "fdo76583.docx")
     lcl_countTextFrames( mxComponent, 1 );
 }
 
+DECLARE_OOXMLIMPORT_TEST(testTdf105975formula, "tdf105975.docx")
+{
+    // Make sure the field contains a formula with 10 + 15
+    uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields());
+    uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
+
+    if( !xFields->hasMoreElements() ) {
+        CPPUNIT_ASSERT(false);
+        return;
+    }
+
+    uno::Reference<text::XTextField> xEnumerationAccess(xFields->nextElement(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("10+15"), xEnumerationAccess->getPresentation(true).trim());
+    CPPUNIT_ASSERT_EQUAL(OUString("25"), xEnumerationAccess->getPresentation(false).trim());
+}
+
 DECLARE_OOXMLIMPORT_TEST(testTdf75573, "tdf75573_page1frame.docx")
 {
     // the problem was that the frame was discarded
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 6189f9f139ab..0238820a2e12 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -2307,6 +2307,14 @@ static OUString lcl_ExtractToken(OUString const& rCommand,
                     }
                 }
             break;
+            case '=':
+                if (token.isEmpty())
+                {
+                    rHaveToken = true;
+                    ++rIndex;
+                    return OUString("FORMULA");
+                }
+            break;
             default:
                 token.append(currentChar);
             break;
@@ -2837,7 +2845,7 @@ if(!bFilled)
             {OUString("FILLIN"),        "Input",                    FIELD_FILLIN       },
             {OUString("FILENAME"),      "FileName",                 FIELD_FILENAME     },
 //            {OUString("FILESIZE"),      "",                         FIELD_FILESIZE     },
-//            {OUString("FORMULA"),     "",                           FIELD_FORMULA },
+            {OUString("FORMULA"),       "TableFormula",             FIELD_FORMULA },
             {OUString("FORMCHECKBOX"),     "",                        FIELD_FORMCHECKBOX},
             {OUString("FORMDROPDOWN"),     "DropDown",                FIELD_FORMDROPDOWN},
             {OUString("FORMTEXT"),     "Input", FIELD_FORMTEXT},
@@ -3007,6 +3015,23 @@ void DomainMapper_Impl::handleFieldAsk
     }
 }
 
+void DomainMapper_Impl::handleFieldFormula
+    (const FieldContextPtr& pContext,
+     uno::Reference< beans::XPropertySet > const& xFieldProperties)
+{
+    OUString command = pContext->GetCommand().trim();
+    // command must contains = and at least another char
+    if (command.getLength() < 2)
+        return;
+
+    // we don't copy the = symbol from the command
+    OUString formula = command.copy(1);
+    sal_Int32 standardFormat = 0;
+
+    xFieldProperties->setPropertyValue(getPropertyName(PROP_CONTENT), uno::makeAny(formula));
+    xFieldProperties->setPropertyValue(getPropertyName(PROP_NUMBER_FORMAT), uno::makeAny(standardFormat));
+    xFieldProperties->setPropertyValue("IsShowFormula", uno::makeAny(false));
+}
 
 void  DomainMapper_Impl::handleRubyEQField( const FieldContextPtr& pContext)
 {
@@ -3853,7 +3878,9 @@ void DomainMapper_Impl::CloseFieldCommand()
                     }
                     break;
                     case FIELD_FILESIZE     : break;
-                    case FIELD_FORMULA : break;
+                    case FIELD_FORMULA :
+                        handleFieldFormula(pContext, xFieldProperties);
+                    break;
                     case FIELD_FORMCHECKBOX :
                     case FIELD_FORMDROPDOWN :
                     case FIELD_FORMTEXT :
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index f8924f1e75f4..18ccb047d94e 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -659,6 +659,9 @@ public:
         (const FieldContextPtr& pContext,
         css::uno::Reference< css::uno::XInterface > & xFieldInterface,
         css::uno::Reference< css::beans::XPropertySet > const& xFieldProperties);
+    static void handleFieldFormula
+        (const FieldContextPtr& pContext,
+        css::uno::Reference< css::beans::XPropertySet > const& xFieldProperties);
     void handleAutoNum
         (const FieldContextPtr& pContext,
         css::uno::Reference< css::uno::XInterface > & xFieldInterface,


More information about the Libreoffice-commits mailing list