[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - sw/qa writerfilter/source

Tamás Zolnai (via logerrit) logerrit at kemper.freedesktop.org
Mon Aug 5 13:14:20 UTC 2019


 sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx                     |   42 ++++++++++
 writerfilter/source/dmapper/DomainMapper.cxx                      |   25 ++---
 writerfilter/source/dmapper/DomainMapper.hxx                      |    2 
 writerfilter/source/dmapper/SdtHelper.cxx                         |    7 +
 writerfilter/source/dmapper/SdtHelper.hxx                         |    2 
 6 files changed, 62 insertions(+), 16 deletions(-)

New commits:
commit e4680c2b746dd8607a92a8470cefd1109caae66f
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Mon Aug 5 03:37:34 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Mon Aug 5 15:13:41 2019 +0200

    tdf126701: MSForms: Fix import of date field at the end of the paragraph.
    
    We need to create date field before the paragraph is finished
    (line break is inserted). A date field can not span between
    paragraphs.
    Extend other related unit tests too. In other use cases, the field
    content changes to an invalid data.
    
    Reviewed-on: https://gerrit.libreoffice.org/76971
    Tested-by: Jenkins
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>
    (cherry picked from commit b36ef83ea59eeaca239e58b95aa0b1acdcb99efc)
    
    Change-Id: Id274649e0aaaf6e3c31e042afd126cefc368c858
    Reviewed-on: https://gerrit.libreoffice.org/76977
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>

diff --git a/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx b/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx
new file mode 100644
index 000000000000..6514b2a53089
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
index dc59f5a384eb..a4c811695412 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
@@ -8,6 +8,9 @@
  */
 
 #include <swmodeltestbase.hxx>
+#include <xmloff/odffields.hxx>
+#include <IDocumentMarkAccess.hxx>
+#include <IMark.hxx>
 
 #include <com/sun/star/awt/XBitmap.hpp>
 #include <com/sun/star/graphic/XGraphic.hpp>
@@ -557,6 +560,18 @@ DECLARE_OOXMLEXPORT_TEST(testSdtDateDuplicate, "sdt-date-duplicate.docx")
         // Single <w:sdt> was exported as 2 <w:sdt> elements.
         assertXPath(pXmlDoc, "//w:sdt", 1);
     }
+
+    SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
+    CPPUNIT_ASSERT(pTextDoc);
+    SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
+    IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+
+    ::sw::mark::IDateFieldmark* pFieldmark
+          = dynamic_cast<::sw::mark::IDateFieldmark*>(pMarkAccess->getAllMarksBegin()->get());
+    CPPUNIT_ASSERT(pFieldmark);
+    CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname());
+    CPPUNIT_ASSERT_EQUAL(OUString("4/26/2012"), pFieldmark->GetContent());
 }
 
 DECLARE_OOXMLEXPORT_TEST(testFdo81492, "fdo81492.docx")
@@ -707,6 +722,33 @@ DECLARE_OOXMLEXPORT_TEST( testTdf66401, "tdf66401.docx")
 DECLARE_OOXMLEXPORT_TEST( testDateFieldInShape, "date_field_in_shape.docx" )
 {
     // This was crashed on export.
+    SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
+    CPPUNIT_ASSERT(pTextDoc);
+    SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
+    IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+
+    ::sw::mark::IDateFieldmark* pFieldmark
+          = dynamic_cast<::sw::mark::IDateFieldmark*>(pMarkAccess->getAllMarksBegin()->get());
+    CPPUNIT_ASSERT(pFieldmark);
+    CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname());
+    CPPUNIT_ASSERT_EQUAL(OUString("Click here to enter a date."), pFieldmark->GetContent());
+}
+
+DECLARE_OOXMLEXPORT_TEST( testDateFieldAtEndOfParagraph, "date_field_at_end_of_paragraph.docx" )
+{
+    // Additional line end was added by import and it was crashed on export
+    SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
+    CPPUNIT_ASSERT(pTextDoc);
+    SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
+    IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount());
+
+    ::sw::mark::IDateFieldmark* pFieldmark
+          = dynamic_cast<::sw::mark::IDateFieldmark*>(pMarkAccess->getAllMarksBegin()->get());
+    CPPUNIT_ASSERT(pFieldmark);
+    CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname());
+    CPPUNIT_ASSERT_EQUAL(OUString("Click here to enter a date."), pFieldmark->GetContent());
 }
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 6a0095651ffd..0c788dbb9c41 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3055,7 +3055,7 @@ void DomainMapper::lcl_text(const sal_uInt8 * data_, size_t len)
                         pContext->Insert(PROP_BREAK_TYPE, uno::makeAny(style::BreakType_COLUMN_BEFORE));
                         m_pImpl->clearDeferredBreak(COLUMN_BREAK);
                     }
-                    m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH));
+                    finishParagraph();
                     return;
                 }
                 case cFieldStart:
@@ -3248,15 +3248,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
             m_pImpl->m_pSdtHelper->getLocale().truncate();
             return;
         }
-        bool bIsInTable = (m_pImpl->hasTableManager() && m_pImpl->getTableManager().isInTable()) ||
-                          (m_pImpl->m_nTableDepth > 0);
-        if(bIsInTable || m_pImpl->IsInShape())
-        {
-            // Inside an object we need to import date field earlier
-            m_pImpl->m_pSdtHelper->createDateContentControl(bIsInTable);
-        }
     }
-
     if (!m_pImpl->hasTableManager())
         return;
 
@@ -3289,7 +3281,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
                     if ( m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun() )
                     {
                         mbIsSplitPara = true;
-                        m_pImpl->finishParagraph( m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH) );
+                        finishParagraph();
                         lcl_startParagraphGroup();
                     }
 
@@ -3319,7 +3311,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
                 xContext->Erase(PROP_NUMBERING_LEVEL);
             }
             m_pImpl->SetParaSectpr(false);
-            m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH), bRemove);
+            finishParagraph(bRemove);
             if (bRemove)
                 m_pImpl->RemoveLastParagraph();
         }
@@ -3338,7 +3330,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
                     if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun())
                     {
                         m_pImpl->m_bIsSplitPara = true;
-                        m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH));
+                        finishParagraph();
                         lcl_startParagraphGroup();
                     }
                     m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::makeAny(style::BreakType_PAGE_BEFORE));
@@ -3348,7 +3340,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
                     if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun())
                     {
                         mbIsSplitPara = true;
-                        m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH));
+                        finishParagraph();
                         lcl_startParagraphGroup();
                     }
                     m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::makeAny(style::BreakType_COLUMN_BEFORE));
@@ -3793,6 +3785,13 @@ void DomainMapper::HandleRedline( Sprm& rSprm )
     m_pImpl->SetCurrentRedlineIsRead();
 }
 
+void DomainMapper::finishParagraph(const bool bRemove)
+{
+    if (m_pImpl->m_pSdtHelper->validateDateFormat())
+        m_pImpl->m_pSdtHelper->createDateContentControl();
+    m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH), bRemove);
+}
+
 } //namespace dmapper
 } //namespace writerfilter
 
diff --git a/writerfilter/source/dmapper/DomainMapper.hxx b/writerfilter/source/dmapper/DomainMapper.hxx
index e6b082cfcd47..e7a52764bf94 100644
--- a/writerfilter/source/dmapper/DomainMapper.hxx
+++ b/writerfilter/source/dmapper/DomainMapper.hxx
@@ -159,6 +159,8 @@ private:
     // Table
     virtual void lcl_entry(int pos, writerfilter::Reference<Properties>::Pointer_t ref) override;
 
+    void finishParagraph(const bool bRemove = false);
+
     static void handleUnderlineType(const Id nId, const ::tools::SvRef<PropertyMap>& rContext);
     void handleParaJustification(const sal_Int32 nIntValue, const ::tools::SvRef<PropertyMap>& rContext, const bool bExchangeLeftRight);
     static bool getColorFromId(const Id, sal_Int32 &nColor);
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx
index 0a109c53d000..5e56340e0b80 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -98,7 +98,7 @@ bool SdtHelper::validateDateFormat()
     return !m_sDateFormat.toString().isEmpty() && !m_sLocale.toString().isEmpty();
 }
 
-void SdtHelper::createDateContentControl(bool bInsideTable)
+void SdtHelper::createDateContentControl()
 {
     if(!m_xDateFieldStartRange.is())
         return;
@@ -117,7 +117,10 @@ void SdtHelper::createDateContentControl(bool bInsideTable)
         try
         {
             xCrsr->gotoRange(m_xDateFieldStartRange, false);
-            if(bInsideTable)
+            bool bIsInTable
+                = (m_rDM_Impl.hasTableManager() && m_rDM_Impl.getTableManager().isInTable())
+                  || (m_rDM_Impl.m_nTableDepth > 0);
+            if (bIsInTable)
                 xCrsr->goRight(1, false);
             xCrsr->gotoEnd(true);
         }
diff --git a/writerfilter/source/dmapper/SdtHelper.hxx b/writerfilter/source/dmapper/SdtHelper.hxx
index 5efb397edd8a..8f8f3ef9ba7b 100644
--- a/writerfilter/source/dmapper/SdtHelper.hxx
+++ b/writerfilter/source/dmapper/SdtHelper.hxx
@@ -124,7 +124,7 @@ public:
     /// Create drop-down control from w:sdt's w:dropDownList.
     void createDropDownControl();
     /// Create date control from w:sdt's w:date.
-    void createDateContentControl(bool bInsideTable = false);
+    void createDateContentControl();
 
     void appendToInteropGrabBag(const css::beans::PropertyValue& rValue);
     css::uno::Sequence<css::beans::PropertyValue> getInteropGrabBagAndClear();


More information about the Libreoffice-commits mailing list