diff options
Diffstat (limited to 'writerfilter/source/dmapper/DomainMapperTableHandler.cxx')
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableHandler.cxx | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 2a701dc9bd8b..287028cff621 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -1030,21 +1030,48 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab { if (!aMerges.empty()) { + static const std::vector<OUStringLiteral> aBorderNames + = { "TopBorder", "LeftBorder", "BottomBorder", "RightBorder" }; + // Perform horizontal merges in reverse order, so the fact that merging changes the position of cells won't cause a problem for us. for (std::vector<HorizontallyMergedCell>::reverse_iterator it = aMerges.rbegin(); it != aMerges.rend(); ++it) { uno::Reference<table::XCellRange> xCellRange(xTable, uno::UNO_QUERY_THROW); - uno::Reference<beans::XPropertySet> xCell(xCellRange->getCellByPosition(it->m_nFirstCol, it->m_nFirstRow), uno::UNO_QUERY_THROW); - OUString aFirst = xCell->getPropertyValue("CellName").get<OUString>(); + uno::Reference<beans::XPropertySet> xFirstCell( + xCellRange->getCellByPosition(it->m_nFirstCol, it->m_nFirstRow), + uno::UNO_QUERY_THROW); + OUString aFirst + = xFirstCell->getPropertyValue("CellName").get<OUString>(); // tdf#105852: Only try to merge if m_nLastCol is set (i.e. there were some merge continuation cells) if (it->m_nLastCol != -1) { - xCell.set(xCellRange->getCellByPosition(it->m_nLastCol, it->m_nLastRow), uno::UNO_QUERY_THROW); - OUString aLast = xCell->getPropertyValue("CellName").get<OUString>(); + // Save border properties of the first cell + // before merge. + table::BorderLine2 aBorderValues[4]; + for (size_t i = 0; i < aBorderNames.size(); ++i) + xFirstCell->getPropertyValue(aBorderNames[i]) + >>= aBorderValues[i]; + + uno::Reference<beans::XPropertySet> xLastCell( + xCellRange->getCellByPosition(it->m_nLastCol, it->m_nLastRow), + uno::UNO_QUERY_THROW); + OUString aLast + = xLastCell->getPropertyValue("CellName").get<OUString>(); uno::Reference<text::XTextTableCursor> xCursor = xTable->createCursorByCellName(aFirst); xCursor->gotoCellByName(aLast, true); + xCursor->mergeRange(); + + // Handle conflicting properties: mergeRange() + // takes the last cell, Word takes the first + // cell. + for (size_t i = 0; i < aBorderNames.size(); ++i) + { + if (aBorderValues[i].LineStyle != table::BorderLineStyle::NONE) + xFirstCell->setPropertyValue( + aBorderNames[i], uno::makeAny(aBorderValues[i])); + } } } } |