diff options
-rwxr-xr-x | sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx | bin | 0 -> 11252 bytes | |||
-rwxr-xr-x | sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx | bin | 0 -> 25304 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport15.cxx | 29 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableHandler.cxx | 12 |
4 files changed, 41 insertions, 0 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx Binary files differnew file mode 100755 index 000000000000..50ebe7a29770 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx diff --git a/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx Binary files differnew file mode 100755 index 000000000000..54856dea554a --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx 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 ); |