sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt |binary sw/qa/extras/odfexport/odfexport.cxx | 14 +++ sw/source/filter/xml/xmltble.cxx | 40 ++++++---- sw/source/filter/xml/xmltexte.hxx | 4 + xmloff/source/text/txtparae.cxx | 6 + 5 files changed, 47 insertions(+), 17 deletions(-)
New commits: commit 58cb4fc7d17ae5b339c5ed6ae139e6ef2433c927 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Tue Sep 13 20:42:22 2022 +0300 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Wed Sep 14 10:38:31 2022 +0200 tdf#150927: properly handle nesting in tables This re-implements the relevant part of commit 35021cd56b3b4e38035804087f215c80085564be, to follow the same recursion logic that is used in SwXMLExport::ExportTable. Additionally, it found a place where XML was still emitted when collecting autostyles (breaks were exported); fixed. Change-Id: I3b7eed06e0eca9ad20304b45db4c3e9d72478c9b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139901 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt b/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt new file mode 100644 index 000000000000..44dbf0bdec69 Binary files /dev/null and b/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt differ diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx index 84cd056d3e1d..fb3aa5e3412b 100644 --- a/sw/qa/extras/odfexport/odfexport.cxx +++ b/sw/qa/extras/odfexport/odfexport.cxx @@ -3204,6 +3204,20 @@ CPPUNIT_TEST_FIXTURE(Test, tdf135942) assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']", 2); } +CPPUNIT_TEST_FIXTURE(Test, tdf150927) +{ + // Similar to tdf135942 + + loadAndReload("table-in-frame-in-table-in-header-base.odt"); + // All table autostyles should be collected, including nested, and must not crash. + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']", 2); +} + DECLARE_ODFEXPORT_TEST(testGutterLeft, "gutter-left.odt") { CPPUNIT_ASSERT_EQUAL(1, getPages()); diff --git a/sw/source/filter/xml/xmltble.cxx b/sw/source/filter/xml/xmltble.cxx index 4cfc25736250..2bb7a564a48a 100644 --- a/sw/source/filter/xml/xmltble.cxx +++ b/sw/source/filter/xml/xmltble.cxx @@ -1173,6 +1173,30 @@ void SwXMLTextParagraphExport::exportTableAutoStyles() { } } +void SwXMLTextParagraphExport::CollectTableLinesAutoStyles(const SwTableLines& rLines, + SwFrameFormat& rFormat, bool _bProgress) +{ + // Follow SwXMLExport::ExportTableLines/ExportTableLine/ExportTableBox + for (const SwTableLine* pLine : rLines) + { + for (SwTableBox* pBox : pLine->GetTabBoxes()) + { + if (pBox->getRowSpan() <= 0) + continue; + if (pBox->GetSttNd()) + { + if (rtl::Reference<SwXCell> xCell = SwXCell::CreateXCell(&rFormat, pBox)) + exportText(xCell, true /*bAutoStyles*/, _bProgress, true /*bExportParagraph*/); + } + else + { + // no start node -> merged cells: export subtable in cell + CollectTableLinesAutoStyles(pBox->GetTabLines(), rFormat, _bProgress); + } + } + } +} + void SwXMLTextParagraphExport::exportTable( const Reference < XTextContent > & rTextContent, bool bAutoStyles, bool _bProgress ) @@ -1208,21 +1232,7 @@ void SwXMLTextParagraphExport::exportTable( maTableNodes.push_back(pTableNd); m_TableFormats.emplace(pTableNd, ::std::make_pair(SwXMLTextParagraphExport::FormatMap(), SwXMLTextParagraphExport::FormatMap())); // Collect all tables inside cells of this table, too - const auto aCellNames = pXTable->getCellNames(); - for (const OUString& rCellName : aCellNames) - { - css::uno::Reference<css::container::XEnumerationAccess> xCell( - pXTable->getCellByName(rCellName), css::uno::UNO_QUERY); - if (!xCell) - continue; - auto xEnumeration = xCell->createEnumeration(); - while (xEnumeration->hasMoreElements()) - { - if (css::uno::Reference<css::text::XTextTable> xInnerTable{ - xEnumeration->nextElement(), css::uno::UNO_QUERY }) - exportTable(xInnerTable, bAutoStyles, _bProgress); - } - } + CollectTableLinesAutoStyles(pTable->GetTabLines(), *pFormat, _bProgress); } } else diff --git a/sw/source/filter/xml/xmltexte.hxx b/sw/source/filter/xml/xmltexte.hxx index 65f26040651c..09ce6c46f4ca 100644 --- a/sw/source/filter/xml/xmltexte.hxx +++ b/sw/source/filter/xml/xmltexte.hxx @@ -32,6 +32,7 @@ class SwXMLExport; class SvXMLAutoStylePoolP; class SwNoTextNode; class SwTableNode; +class SwTableLines; namespace com::sun::star::style { class XStyle; } class SwXMLTextParagraphExport : public XMLTextParagraphExport @@ -50,6 +51,9 @@ private: static SwNoTextNode *GetNoTextNode( const css::uno::Reference < css::beans::XPropertySet >& rPropSet ); + void CollectTableLinesAutoStyles(const SwTableLines& rLines, SwFrameFormat& rFormat, + bool bProgress); + protected: virtual void _collectTextEmbeddedAutoStyles( const css::uno::Reference< css::beans::XPropertySet > & rPropSet ) override; diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx index 78390194ba69..ec0457feb755 100644 --- a/xmloff/source/text/txtparae.cxx +++ b/xmloff/source/text/txtparae.cxx @@ -2531,11 +2531,13 @@ void XMLTextParagraphExport::exportTextRangeEnumeration( } else if (sType == gsSoftPageBreak) { - exportSoftPageBreak(); + if (!bAutoStyles) + exportSoftPageBreak(); } else if (sType == "LineBreak") { - exportTextLineBreak(xPropSet); + if (!bAutoStyles) + exportTextLineBreak(xPropSet); } else { OSL_FAIL("unknown text portion type");