From 81ce88aa80f8e7cde4fdc5b211e9500a3599643c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= Date: Mon, 4 May 2020 13:42:14 +0200 Subject: [PATCH] tdf#132514 DOCX import: fix lost table style with footer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Table paragraphs collected for table style processing were mixed when both body text and footer contain tables, i.e. clearing paragraph vector at processing the first table resulted missing paragraph vector and table style processing for the other one. Now tables in footer, also nested tables collect their paragraphs in separated table paragraph vectors. Regression from commit 6c5da2cd7af5c2d90e4d8e9635ba8c9989c87923 (tdf#119054 DOCX: fix not table style based bottom margin). Change-Id: Ib8568d8379cfb7da869120cdc7fe12895252d661 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93415 Tested-by: Jenkins Reviewed-by: László Németh --- sw/qa/extras/ooxmlexport/data/tdf132514.docx | Bin 0 -> 16787 bytes sw/qa/extras/ooxmlexport/ooxmlexport6.cxx | 8 ++++++++ .../dmapper/DomainMapperTableHandler.cxx | 9 ++++----- .../dmapper/DomainMapperTableHandler.hxx | 9 --------- .../dmapper/DomainMapperTableManager.cxx | 17 +++++++++++++++++ .../dmapper/DomainMapperTableManager.hxx | 3 +++ .../source/dmapper/DomainMapper_Impl.cxx | 2 +- .../source/dmapper/DomainMapper_Impl.hxx | 3 --- writerfilter/source/dmapper/PropertyMap.hxx | 11 +++++++++++ 9 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132514.docx diff --git a/sw/qa/extras/ooxmlexport/data/tdf132514.docx b/sw/qa/extras/ooxmlexport/data/tdf132514.docx new file mode 100644 index 0000000000000000000000000000000000000000..d32f84104e2662ea777aafd8e34a66b4c35d09a1 GIT binary patch literal 16787 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�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 literal 0 HcmV?d00001 diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport6.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport6.cxx index 9b416057ecf0..e262303d1dee 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport6.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport6.cxx @@ -474,6 +474,14 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf131258, "tdf131258.docx") assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:p/w:pPr/w:spacing", "after", "0"); } +DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf132514, "tdf132514.docx") +{ + xmlDocPtr pXmlDoc = parseExport(); + // Keep table style setting, when the footer also contain a table + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[2]/w:p[2]/w:pPr/w:spacing", "before", "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[2]/w:p[2]/w:pPr/w:spacing", "after", "0"); +} + DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testFdo69636, "fdo69636.docx") { /* diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 0c73bb60f23a..a3548cde909c 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -1252,6 +1252,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab if ( !aAllTableParaProperties.empty() ) { + TableParagraphVectorPtr pTableParagraphs = m_rDMapper_Impl.getTableManager().getCurrentParagraphs(); for (size_t nRow = 0; nRow < m_aTableRanges.size(); ++nRow) { for (size_t nCell = 0; nCell < m_aTableRanges[nRow].size(); ++nCell) @@ -1263,8 +1264,8 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab uno::Reference xTextRangeCompare(rStartPara->getText(), uno::UNO_QUERY); bool bApply = false; // search paragraphs of the cell - std::vector::iterator aIt = m_rDMapper_Impl.m_aParagraphsToEndTable.begin(); - while ( aIt != m_rDMapper_Impl.m_aParagraphsToEndTable.end() ) try + std::vector::iterator aIt = pTableParagraphs->begin(); + while ( aIt != pTableParagraphs->end() ) try { if (!bApply && xTextRangeCompare->compareRegionStarts(rStartPara, aIt->m_rStartParagraph) == 0) bApply = true; @@ -1273,7 +1274,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab bool bEndOfApply = (xTextRangeCompare->compareRegionEnds(rEndPara, aIt->m_rEndParagraph) == 0); ApplyParagraphPropertiesFromTableStyle(*aIt, aAllTableParaProperties, aCellProperties[nRow][nCell]); // erase processed paragraph from list of pending paragraphs - aIt = m_rDMapper_Impl.m_aParagraphsToEndTable.erase(aIt); + aIt = pTableParagraphs->erase(aIt); if (bEndOfApply) break; } @@ -1435,8 +1436,6 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel, bool bTab m_aCellProperties.clear(); m_aRowProperties.clear(); m_bHadFootOrEndnote = false; - if (nestedTableLevel <= 1 && m_rDMapper_Impl.m_bConvertedTable) - m_rDMapper_Impl.m_aParagraphsToEndTable.clear(); #ifdef DBG_UTIL TagLogger::getInstance().endElement(); diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx index 142b7817cc37..545f60919c46 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx @@ -55,15 +55,6 @@ struct HorizontallyMergedCell } }; -/// Information about a paragraph to be finished after a table end. -struct TableParagraph -{ - css::uno::Reference m_rStartParagraph; - css::uno::Reference m_rEndParagraph; - PropertyMapPtr m_pPropertyMap; - css::uno::Reference m_rPropertySet; -}; - /// Class to handle events generated by TableManager::resolveCurrentTable(). class DomainMapperTableHandler final : public virtual SvRefBase { diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx index a1bb10e74850..9e7cf46cca40 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -50,6 +50,7 @@ DomainMapperTableManager::DomainMapperTableManager() : m_bPushCurrentWidth(false), m_bTableSizeTypeInserted(false), m_nLayoutType(0), + m_aParagraphsToEndTable(), m_pTablePropsHandler(new TablePropertiesHandler()) { m_pTablePropsHandler->SetTableManager( this ); @@ -424,6 +425,11 @@ TablePositionHandler* DomainMapperTableManager::getCurrentTableRealPosition() return nullptr; } +TableParagraphVectorPtr DomainMapperTableManager::getCurrentParagraphs( ) +{ + return m_aParagraphsToEndTable.top( ); +} + void DomainMapperTableManager::setIsInShape(bool bIsInShape) { m_bIsInShape = bIsInShape; @@ -440,6 +446,12 @@ void DomainMapperTableManager::startLevel( ) oCurrentWidth = m_aCellWidths.back()->back(); m_aCellWidths.back()->pop_back(); } + std::optional oParagraph; + if (getTableDepthDifference() > 0 && !m_aParagraphsToEndTable.empty() && !m_aParagraphsToEndTable.top()->empty()) + { + oParagraph = m_aParagraphsToEndTable.top()->back(); + m_aParagraphsToEndTable.top()->pop_back(); + } IntVectorPtr pNewGrid = std::make_shared>(); IntVectorPtr pNewSpans = std::make_shared>(); @@ -460,10 +472,14 @@ void DomainMapperTableManager::startLevel( ) m_aGridBefore.push_back( 0 ); m_nTableWidth = 0; m_nLayoutType = 0; + TableParagraphVectorPtr pNewParagraphs = std::make_shared>(); + m_aParagraphsToEndTable.push( pNewParagraphs ); // And push it back to the right level. if (oCurrentWidth) m_aCellWidths.back()->push_back(*oCurrentWidth); + if (oParagraph) + m_aParagraphsToEndTable.top()->push_back(*oParagraph); } void DomainMapperTableManager::endLevel( ) @@ -508,6 +524,7 @@ void DomainMapperTableManager::endLevel( ) // in the endTable method called in endLevel. m_aTablePositions.pop_back(); m_aTableStyleNames.pop_back(); + m_aParagraphsToEndTable.pop(); } void DomainMapperTableManager::endOfCellAction() diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx index 0801e9dd9280..cb298e12a4f2 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx @@ -63,6 +63,8 @@ class DomainMapperTableManager : public TableManager bool m_bTableSizeTypeInserted; /// Table layout algorithm, IOW if we should consider fixed column width or not. sal_uInt32 m_nLayoutType; + /// Collected table paragraphs for table style handling + std::stack< TableParagraphVectorPtr > m_aParagraphsToEndTable; std::unique_ptr m_pTablePropsHandler; PropertyMapPtr m_pStyleProps; @@ -93,6 +95,7 @@ public: IntVectorPtr const & getCurrentSpans( ); IntVectorPtr const & getCurrentCellWidths( ); sal_uInt32 getCurrentGridBefore( ); + TableParagraphVectorPtr getCurrentParagraphs( ); /// Turn the attributes collected so far in m_aTableLook into a property and clear the container. void finishTableLook(); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 4ef7b844d58b..f385565c8429 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -1786,7 +1786,7 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con if (m_nTableDepth > 0) { TableParagraph aPending{xParaCursor, xCur, pParaContext, xParaProps}; - m_aParagraphsToEndTable.push_back(aPending); + getTableManager().getCurrentParagraphs()->push_back(aPending); } // hidden empty paragraph with a not hidden shape, set as not hidden diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 33a4eb5fa95f..ddce87060a6e 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -1058,9 +1058,6 @@ public: bool m_bIsActualParagraphFramed; std::vector aFramedRedlines; - /// Table paragraph properties may need style update based on table style - std::vector m_aParagraphsToEndTable; - private: void PushPageHeaderFooter(bool bHeader, SectionPropertyMap::PageType eType); // Start a new index section; if needed, finish current paragraph diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index 6bfc1fed3a04..f3b7f828b5d1 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -592,6 +592,17 @@ public: typedef tools::SvRef< TablePropertyMap > TablePropertyMapPtr; +/// Information about a paragraph to be finished after a table end. +struct TableParagraph +{ + css::uno::Reference m_rStartParagraph; + css::uno::Reference m_rEndParagraph; + PropertyMapPtr m_pPropertyMap; + css::uno::Reference m_rPropertySet; +}; + +typedef std::shared_ptr< std::vector > TableParagraphVectorPtr; + } // namespace dmapper } // namespace writerfilter