summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx28
-rw-r--r--writerfilter/qa/cppunittests/dmapper/data/floattable-nested-3tables.docxbin0 -> 131360 bytes
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableHandler.cxx11
3 files changed, 23 insertions, 16 deletions
diff --git a/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx b/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx
index 0650e48fe607..803f2cd938b6 100644
--- a/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx
@@ -50,14 +50,11 @@ CPPUNIT_TEST_FIXTURE(Test, test1cellInsidevRightborder)
CPPUNIT_TEST_FIXTURE(Test, testNestedFloatingTable)
{
loadFromURL(u"nested-floating-table.docx");
- uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xDrawPage = xDrawPageSupplier->getDrawPage();
- uno::Reference<beans::XPropertySet> xFrame(xDrawPage->getByIndex(0), uno::UNO_QUERY);
- bool bIsFollowingTextFlow = false;
- xFrame->getPropertyValue("IsFollowingTextFlow") >>= bIsFollowingTextFlow;
- // Without the accompanying fix in place, this test would have failed, the nested floating table
- // was partly positioned outside the table cell, leading to overlapping text.
- CPPUNIT_ASSERT(bIsFollowingTextFlow);
+ // Normal outer table, floating inner tables.
+ uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndexAccess->getCount());
}
CPPUNIT_TEST_FIXTURE(Test, testFloatingTableBreakBefore)
@@ -82,6 +79,21 @@ CPPUNIT_TEST_FIXTURE(Test, testFloatingTableBreakBefore)
// i.e. the page break was lost.
CPPUNIT_ASSERT_EQUAL(style::BreakType_PAGE_BEFORE, eBreakType);
}
+
+CPPUNIT_TEST_FIXTURE(Test, test3NestedFloatingTables)
+{
+ // Given a document with nested tables: outer and inner one is normal, middle one is floating:
+ // When laying out that document:
+ loadFromURL(u"floattable-nested-3tables.docx");
+
+ // Then make sure we don't crash and create the 3 tables:
+ // Without the accompanying fix in place, this would have crashed, layout can't handle nested
+ // floating tables currently.
+ uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(),
+ uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndexAccess->getCount());
+}
}
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/qa/cppunittests/dmapper/data/floattable-nested-3tables.docx b/writerfilter/qa/cppunittests/dmapper/data/floattable-nested-3tables.docx
new file mode 100644
index 000000000000..f171a1150695
--- /dev/null
+++ b/writerfilter/qa/cppunittests/dmapper/data/floattable-nested-3tables.docx
Binary files differ
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
index e36404b8f68c..8c52f8269706 100644
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
@@ -1330,7 +1330,7 @@ static void lcl_convertFormulaRanges(const uno::Reference<text::XTextTable> & xT
}
}
-void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTableStartsAtCellStart)
+void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool /*bTableStartsAtCellStart*/)
{
#ifdef DBG_UTIL
TagLogger::getInstance().startElement("tablehandler.endTable");
@@ -1577,14 +1577,9 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab
m_aTableProperties->getValue(TablePropertyMap::TABLE_WIDTH_TYPE, nTableWidthType);
// m_xText points to the body text, get the current xText from m_rDMapper_Impl, in case e.g. we would be in a header.
uno::Reference<text::XTextAppendAndConvert> xTextAppendAndConvert(m_rDMapper_Impl.GetTopTextAppend(), uno::UNO_QUERY);
- // Only execute the conversion if the table is not anchored at
- // the start of an outer table cell, that's not yet
- // implemented.
- // Multi-page floating tables works if an outer/toplevel table is floating, but not
- // when an inner table would float.
- bool bToplevelSplitFly = nestedTableLevel <= 1;
+ // Only execute the conversion for top-level tables.
uno::Reference<beans::XPropertySet> xFrameAnchor;
- if (xTextAppendAndConvert.is() && (!bTableStartsAtCellStart || bToplevelSplitFly))
+ if (xTextAppendAndConvert.is() && nestedTableLevel <= 1)
{
std::deque<css::uno::Any> aFramedRedlines = m_rDMapper_Impl.m_aStoredRedlines[StoredRedlines::FRAME];
std::vector<sal_Int32> redPos, redLen;