diff options
Diffstat (limited to 'writerfilter')
7 files changed, 36 insertions, 18 deletions
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<text::XTextRangeCompare> xTextRangeCompare(rStartPara->getText(), uno::UNO_QUERY); bool bApply = false; // search paragraphs of the cell - std::vector<TableParagraph>::iterator aIt = m_rDMapper_Impl.m_aParagraphsToEndTable.begin(); - while ( aIt != m_rDMapper_Impl.m_aParagraphsToEndTable.end() ) try + std::vector<TableParagraph>::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<css::text::XTextRange> m_rStartParagraph; - css::uno::Reference<css::text::XTextRange> m_rEndParagraph; - PropertyMapPtr m_pPropertyMap; - css::uno::Reference<css::beans::XPropertySet> 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<TableParagraph> 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<vector<sal_Int32>>(); IntVectorPtr pNewSpans = std::make_shared<vector<sal_Int32>>(); @@ -460,10 +472,14 @@ void DomainMapperTableManager::startLevel( ) m_aGridBefore.push_back( 0 ); m_nTableWidth = 0; m_nLayoutType = 0; + TableParagraphVectorPtr pNewParagraphs = std::make_shared<vector<TableParagraph>>(); + 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<TablePropertiesHandler> 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<css::uno::Any> aFramedRedlines; - /// Table paragraph properties may need style update based on table style - std::vector<TableParagraph> 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<css::text::XTextRange> m_rStartParagraph; + css::uno::Reference<css::text::XTextRange> m_rEndParagraph; + PropertyMapPtr m_pPropertyMap; + css::uno::Reference<css::beans::XPropertySet> m_rPropertySet; +}; + +typedef std::shared_ptr< std::vector<TableParagraph> > TableParagraphVectorPtr; + } // namespace dmapper } // namespace writerfilter |