diff options
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx | 28 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/dmapper/data/floattable-nested-3tables.docx | bin | 0 -> 131360 bytes | |||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableHandler.cxx | 11 |
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 Binary files differnew file mode 100644 index 000000000000..f171a1150695 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/floattable-nested-3tables.docx 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; |