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

Vitaliy Anderson vanderson at smartru.com
Tue Mar 7 11:01:52 UTC 2017


 sw/CppunitTest_sw_ww8import.mk            |    1 
 sw/qa/extras/ww8import/data/tdf105570.doc |binary
 sw/qa/extras/ww8import/ww8import.cxx      |   42 ++++++++++++++++++++++++++++++
 sw/source/filter/ww8/ww8par2.cxx          |    9 ++----
 4 files changed, 46 insertions(+), 6 deletions(-)

New commits:
commit c4fc38a86f77d87263e78fae04a31f19c21fb017
Author: Vitaliy Anderson <vanderson at smartru.com>
Date:   Fri Mar 3 06:29:37 2017 -0800

    tdf#105570: Treat sprmTTableHeader properly.
    
    Only take into account sprmTTableHeader if all previous rows had it.
    
    Change-Id: I0f81da366c148963503b4aeba778f5d97aa72d26
    Reviewed-on: https://gerrit.libreoffice.org/34931
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>

diff --git a/sw/CppunitTest_sw_ww8import.mk b/sw/CppunitTest_sw_ww8import.mk
index db85995..d3ae08a 100644
--- a/sw/CppunitTest_sw_ww8import.mk
+++ b/sw/CppunitTest_sw_ww8import.mk
@@ -35,6 +35,7 @@ $(eval $(call gb_CppunitTest_use_externals,sw_ww8import,\
 $(eval $(call gb_CppunitTest_set_include,sw_ww8import,\
     -I$(SRCDIR)/sw/inc \
     -I$(SRCDIR)/sw/source/core/inc \
+    -I$(SRCDIR)/sw/source/uibase/inc \
     -I$(SRCDIR)/sw/qa/extras/inc \
     $$(INCLUDE) \
 ))
diff --git a/sw/qa/extras/ww8import/data/tdf105570.doc b/sw/qa/extras/ww8import/data/tdf105570.doc
new file mode 100644
index 0000000..1bace77
Binary files /dev/null and b/sw/qa/extras/ww8import/data/tdf105570.doc differ
diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx
index 3727c58..4ec5ca0 100644
--- a/sw/qa/extras/ww8import/ww8import.cxx
+++ b/sw/qa/extras/ww8import/ww8import.cxx
@@ -10,6 +10,9 @@
 #include <swmodeltestbase.hxx>
 
 #include <com/sun/star/text/XTextTablesSupplier.hpp>
+#include <ndtxt.hxx>
+#include <viscrs.hxx>
+#include <wrtsh.hxx>
 
 class Test : public SwModelTestBase
 {
@@ -65,6 +68,45 @@ DECLARE_WW8IMPORT_TEST(testTdf106291, "tdf106291.doc")
     CPPUNIT_ASSERT(cellHeight.toInt32() > 200); // height might depend on font size
 }
 
+DECLARE_WW8IMPORT_TEST( testTdf105570, "tdf105570.doc" )
+{
+    /*****
+      * MS-DOC specification ( https://msdn.microsoft.com/en-us/library/cc313153 )
+      * ch. 2.6.3, sprmTTableHeader:
+      *     A Bool8 value that specifies that the current table row is a header row.
+      *     If the value is 0x01 but sprmTTableHeader is not applied with a value of 0x01
+      *     for a previous row in the same table, then this property MUST be ignored.
+      *
+      * The document have three tables with three rows.
+      * Table 1 has { 1, 0, 0 } values of the "repeat as header row" property for each row
+      * Table 2 has { 1, 1, 0 }
+      * Table 3 has { 0, 1, 1 }
+      ****/
+    SwXTextDocument* pTextDoc     = dynamic_cast<SwXTextDocument*>(mxComponent.get());
+    SwDoc*           pDoc         = pTextDoc->GetDocShell()->GetDoc();
+    SwWrtShell*      pWrtShell    = pDoc->GetDocShell()->GetWrtShell();
+    SwShellCursor*   pShellCursor = pWrtShell->getShellCursor( false );
+    SwNodeIndex      aIdx         = SwNodeIndex( pShellCursor->Start()->nNode );
+
+    // Find first table
+    SwTableNode*     pTableNd     = aIdx.GetNode().FindTableNode();
+
+    CPPUNIT_ASSERT_EQUAL( sal_uInt16(1), pTableNd->GetTable().GetRowsToRepeat() );
+
+    // Go to next table
+    aIdx.Assign( *pTableNd->EndOfSectionNode(), 1 );
+    while ( nullptr == (pTableNd = aIdx.GetNode().GetTableNode()) ) ++aIdx;
+
+    CPPUNIT_ASSERT_EQUAL( sal_uInt16(2), pTableNd->GetTable().GetRowsToRepeat() );
+
+    // Go to next table
+    aIdx.Assign( *pTableNd->EndOfSectionNode(), 1 );
+    while ( nullptr == (pTableNd = aIdx.GetNode().GetTableNode()) ) ++aIdx;
+
+    // As first row hasn't sprmTTableHeader set, all following must be ignored, so no rows must be repeated
+    CPPUNIT_ASSERT_EQUAL( sal_uInt16(0), pTableNd->GetTable().GetRowsToRepeat() );
+}
+
 // tests should only be added to ww8IMPORT *if* they fail round-tripping in ww8EXPORT
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx
index 6b424a4..6257201 100644
--- a/sw/source/filter/ww8/ww8par2.cxx
+++ b/sw/source/filter/ww8/ww8par2.cxx
@@ -1839,7 +1839,6 @@ WW8TabDesc::WW8TabDesc(SwWW8ImplReader* pIoClass, WW8_CP nStartCp) :
 
         for (int nLoop = 0; nLoop < 2; ++nLoop)
         {
-            bool bRepeatedSprm = false;
             const sal_uInt8* pParams;
             while (aSprmIter.GetSprms() && nullptr != (pParams = aSprmIter.GetAktParams()))
             {
@@ -1870,11 +1869,9 @@ WW8TabDesc::WW8TabDesc(SwWW8ImplReader* pIoClass, WW8_CP nStartCp) :
                         pTableBorders90 = pParams; // process at end
                         break;
                     case sprmTTableHeader:
-                        if (!bRepeatedSprm)
-                        {
-                            m_nRowsToRepeat++;
-                            bRepeatedSprm = true;
-                        }
+                        // tdf#105570
+                        if ( m_nRowsToRepeat == m_nRows )
+                            m_nRowsToRepeat = (m_nRows + 1);
                         break;
                     case sprmTJc:
                         // sprmTJc  -  Justification Code


More information about the Libreoffice-commits mailing list