[Libreoffice-commits] core.git: sw/qa writerfilter/source
Mike Kaganski
mike.kaganski at collabora.com
Thu Feb 9 15:23:54 UTC 2017
sw/qa/extras/rtfimport/data/tdf105852.rtf | 50 +++++++++++++++
sw/qa/extras/rtfimport/rtfimport.cxx | 14 ++++
writerfilter/source/dmapper/DomainMapperTableHandler.cxx | 14 ++--
writerfilter/source/dmapper/DomainMapperTableHandler.hxx | 4 -
4 files changed, 75 insertions(+), 7 deletions(-)
New commits:
commit d48b805794a6317e13826d52bbeaa37576ac57bb
Author: Mike Kaganski <mike.kaganski at collabora.com>
Date: Thu Feb 9 15:00:33 2017 +0300
tdf#105852: don't merge cells if there were no merge continuation
In RTF, it's possible to start a cells merge using \clmgf, and simply
omit following cells in the row - they must merge automatically.
This makes HorizontallyMergedCell::m_nLastCol/Row uninitialized.
Previously, the uninitialized values arrived as 0,0 - thus the first
range's cell got merged with cell 0,0.
This change prevents the merge; in scenario above, absence of additional
cells in row will create merged cell automatically.
Change-Id: I68b84b7ec70d9512c541a077689369fa4a8dc0c5
Reviewed-on: https://gerrit.libreoffice.org/34079
Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
Tested-by: Mike Kaganski <mike.kaganski at collabora.com>
diff --git a/sw/qa/extras/rtfimport/data/tdf105852.rtf b/sw/qa/extras/rtfimport/data/tdf105852.rtf
new file mode 100644
index 0000000..bf3e073
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/tdf105852.rtf
@@ -0,0 +1,50 @@
+{\rtf1\ansicpg1251
+
+{\trowd
+\cellx720
+\cellx6240
+\cellx7680
+\cellx9360
+A1\cell
+A2\cell
+A3\cell
+A4\cell
+\row}
+{\trowd
+\cellx720
+\cellx6240
+\cellx7680
+\cellx9360
+B1\cell
+B2\cell
+B3\cell
+B4\cell
+\row}
+{\trowd
+\clmgf\cellx9360
+C1\cell
+\row}
+{\trowd
+\cellx720
+\cellx6240
+\cellx7680
+\cellx9360
+D1\cell
+D2\cell
+D3\cell
+D4\cell
+\row}
+{\trowd
+\clmgf\cellx9360
+E1\cell
+\row}
+{\trowd
+\cellx720
+\cellx6240
+\cellx7680
+\cellx9360
+F1\cell
+F2\cell
+F3\cell
+F4\cell
+\row}\par}
\ No newline at end of file
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 63608a0..855b2da 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -2765,6 +2765,20 @@ DECLARE_RTFIMPORT_TEST(testTdf104744, "tdf104744.rtf")
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), getProperty<sal_Int32>(getParagraph(1), "ParaLeftMargin"));
}
+DECLARE_RTFIMPORT_TEST(testTdf105852, "tdf105852.rtf")
+{
+ uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY);
+ uno::Reference<text::XTextTable> xTextTable(xTables->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<table::XTableRows> xTableRows(xTextTable->getRows(), uno::UNO_QUERY);
+ // All rows but last were merged -> there were only 2 rows
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTableRows->getCount());
+ // The first row must have 4 cells.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(0), "TableColumnSeparators").getLength());
+ // The third row must have 1 merged cell.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty< uno::Sequence<text::TableColumnSeparator> >(xTableRows->getByIndex(2), "TableColumnSeparators").getLength());
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index 975f6d8..2ce6301 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -1042,12 +1042,16 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
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>();
- xCell.set(xCellRange->getCellByPosition(it->m_nLastCol, it->m_nLastRow), uno::UNO_QUERY_THROW);
- OUString aLast = xCell->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>();
- uno::Reference<text::XTextTableCursor> xCursor = xTable->createCursorByCellName(aFirst);
- xCursor->gotoCellByName(aLast, true);
- xCursor->mergeRange();
+ uno::Reference<text::XTextTableCursor> xCursor = xTable->createCursorByCellName(aFirst);
+ xCursor->gotoCellByName(aLast, true);
+ xCursor->mergeRange();
+ }
}
}
}
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
index 6097be3..83dafa4 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
@@ -50,8 +50,8 @@ struct HorizontallyMergedCell
HorizontallyMergedCell(sal_Int32 nFirstRow, sal_Int32 nFirstCol)
: m_nFirstRow(nFirstRow)
, m_nFirstCol(nFirstCol)
- , m_nLastRow(0)
- , m_nLastCol(0)
+ , m_nLastRow(nFirstRow)
+ , m_nLastCol(-1)
{
}
};
More information about the Libreoffice-commits
mailing list