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

Justin Luth (via logerrit) logerrit at kemper.freedesktop.org
Thu Jul 16 16:43:08 UTC 2020


 sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx   |binary
 sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport15.cxx                 |   29 +++++++++++++
 writerfilter/source/dmapper/DomainMapperTableHandler.cxx   |   12 +++++
 4 files changed, 41 insertions(+)

New commits:
commit 03803de58bd426eb0b726437dc205d92383e8e2e
Author:     Justin Luth <justin.luth at collabora.com>
AuthorDate: Thu Jun 4 18:46:23 2020 +0300
Commit:     Justin Luth <justin_luth at sil.org>
CommitDate: Thu Jul 16 18:42:29 2020 +0200

    tdf#132898 writerfilter: use last merged cell's bottom border
    
    Previously, this was just using the border set on the first
    cell. Obviously, the bottom merged cell should contain the
    definitive setting for the bottom border.
    
    This depends on all of the commits for tdf#129452.
    
    P.S. The top border is obviously fine defined by the top merged cell.
    
    P.S. The left/right borders are a bit more interesting.
    In MSO, each row's value applies to that section of the
    merged cell. I.E., it isn't treated as a cell border at all.
    Only noted as a comment here, since how to deal with it
    is probably best left as is - defined by the top cell.
    
    Change-Id: Ibe8d31cba5122078ce73020f7816bff0b2ae36c6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95528
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <justin_luth at sil.org>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx
new file mode 100755
index 000000000000..50ebe7a29770
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx
new file mode 100755
index 000000000000..54856dea554a
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
index f3d2df38cb3d..26c36ff9eecf 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
@@ -80,6 +80,35 @@ DECLARE_OOXMLEXPORT_TEST(testTdf129452_excessBorder, "tdf129452_excessBorder.doc
     // [Note: as humans, we would call this cell D3, but since row 4 hasn't been analyzed yet, it is considered column C.]
     table::BorderLine2 aBorder = getProperty<table::BorderLine2>(xTable->getCellByName("C3"), "BottomBorder");
     CPPUNIT_ASSERT_EQUAL_MESSAGE("No bottom border on merged cell", sal_uInt32(0), aBorder.LineWidth);
+
+    // [Note: as humans, we would call this cell C3, but since row 4 hasn't been analyzed yet, it is considered column B.]
+    aBorder = getProperty<table::BorderLine2>(xTable->getCellByName("B3"), "BottomBorder");
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("No bottom border on merged cell", sal_uInt32(0), aBorder.LineWidth);
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf132898_missingBorder, "tdf132898_missingBorder.docx")
+{
+    uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
+    uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY);
+
+    // The bottom border from the last merged cell was not showing
+    table::BorderLine2 aBorder = getProperty<table::BorderLine2>(xTable->getCellByName("A1"), "BottomBorder");
+    CPPUNIT_ASSERT_MESSAGE("Bottom border on merged cell", aBorder.LineWidth > 0);
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf132898_extraBorder, "tdf132898_extraBorder.docx")
+{
+    uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
+    uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY);
+
+    // A border defined on an earlier merged cell was showing
+    table::BorderLine2 aBorder = getProperty<table::BorderLine2>(xTable->getCellByName("C1"), "BottomBorder");
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("No bottom border on merged cell", sal_uInt32(0), aBorder.LineWidth);
+    // MS Word is interesting here. 2/3 of the merged cell has the right border, so what to do?
+    aBorder = getProperty<table::BorderLine2>(xTable->getCellByName("C1"), "RightBorder");
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("No right border on merged cell", sal_uInt32(0), aBorder.LineWidth);
 }
 
 DECLARE_OOXMLEXPORT_TEST(testTdf131561_necessaryBorder, "tdf131561_necessaryBorder.docx")
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index 2046d36db613..b56323bd3190 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -912,6 +912,7 @@ CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(Tabl
                 if ( bMergedVertically )
                 {
                     const sal_uInt32 nColumn = m_rDMapper_Impl.getTableManager().findColumn(nRow, nCell);
+                    sal_Int32 nLastMergedRow = 0;
                     for (size_t i = nRow + 1; bMergedVertically && i < m_aCellProperties.size(); i++)
                     {
                         const sal_uInt32 nColumnCell = m_rDMapper_Impl.getTableManager().findColumnCell(i, nColumn);
@@ -919,10 +920,21 @@ CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(Tabl
                         {
                             oProp = m_aCellProperties[i][nColumnCell]->getProperty(PROP_VERTICAL_MERGE);
                             bMergedVertically = oProp && !oProp->second.get<bool>(); //continuing cell
+                            if ( bMergedVertically )
+                                nLastMergedRow = i;
                         }
                         else
                             bMergedVertically = false;
                     }
+
+                    // Only consider the bottom border setting from the last merged cell.
+                    // Note: in MSO, left/right apply per-unmerged-row. Can't do that in LO, so just using the top cell's borders should be fine.
+                    if ( nRow < nLastMergedRow )
+                    {
+                        (*aCellIterator)->Erase(PROP_BOTTOM_BORDER);
+                        const sal_uInt32 nColumnCell = m_rDMapper_Impl.getTableManager().findColumnCell(nLastMergedRow, nColumn);
+                        lcl_mergeBorder( PROP_BOTTOM_BORDER, m_aCellProperties[nLastMergedRow][nColumnCell], *aCellIterator );
+                    }
                 }
 
                 lcl_computeCellBorders( rInfo.pTableBorders, *aCellIterator, nCell, nRow, bIsEndCol, bIsEndRow, bMergedVertically );


More information about the Libreoffice-commits mailing list