From 36c64bc194714d60a5c18f63bcfc0f721c2056db Mon Sep 17 00:00:00 2001 From: Cédric Bosdonnat Date: Thu, 21 Feb 2013 10:27:31 +0100 Subject: n#779642: table positions need to be stacked to handle nested table --- .../source/dmapper/DomainMapperTableHandler.cxx | 2 +- .../source/dmapper/DomainMapperTableManager.cxx | 26 ++++++++++++++++++---- .../source/dmapper/DomainMapperTableManager.hxx | 6 +++-- 3 files changed, 27 insertions(+), 7 deletions(-) (limited to 'writerfilter') diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 6f1a400acf08..8474a2fc5ffe 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -717,7 +717,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) uno::Reference xStart; uno::Reference xEnd; // If we want to make this table a floating one. - uno::Sequence aFrameProperties = m_rDMapper_Impl.getTableManager().getTablePosition(); + uno::Sequence aFrameProperties = m_rDMapper_Impl.getTableManager().getCurrentTablePosition(); bool bFloating = aFrameProperties.hasElements(); // Additional checks: if we can do this. if (bFloating && (*m_pTableSeq)[0].getLength() > 0 && (*m_pTableSeq)[0][0].getLength() > 0) diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx index f09a3e27b9c9..d3ddf82f9fe8 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -322,9 +321,14 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); if (pProperties.get()) { - TablePositionHandlerPtr pHandler( new TablePositionHandler ); + TablePositionHandlerPtr pHandler = m_aTablePositions.back(); + if ( !pHandler ) + { + m_aTablePositions.pop_back(); + pHandler.reset( new TablePositionHandler ); + m_aTablePositions.push_back( pHandler ); + } pProperties->resolve(*pHandler); - m_aTablePosition = pHandler->getTablePosition(); } } break; @@ -360,6 +364,14 @@ boost::shared_ptr< vector< sal_Int32 > > DomainMapperTableManager::getCurrentCel return m_aCellWidths.back( ); } +const uno::Sequence DomainMapperTableManager::getCurrentTablePosition( ) +{ + if ( !m_aTablePositions.empty( ) && m_aTablePositions.back() ) + return m_aTablePositions.back( )->getTablePosition(); + else + return uno::Sequence< beans::PropertyValue >( 0 ); +} + void DomainMapperTableManager::startLevel( ) { DomainMapperTableManager_Base_t::startLevel( ); @@ -375,9 +387,11 @@ void DomainMapperTableManager::startLevel( ) IntVectorPtr pNewGrid( new vector ); IntVectorPtr pNewSpans( new vector ); IntVectorPtr pNewCellWidths( new vector ); + TablePositionHandlerPtr pNewPositionHandler; m_aTableGrid.push_back( pNewGrid ); m_aGridSpans.push_back( pNewSpans ); m_aCellWidths.push_back( pNewCellWidths ); + m_aTablePositions.push_back( pNewPositionHandler ); m_nCell.push_back( 0 ); m_nTableWidth = 0; @@ -394,6 +408,7 @@ void DomainMapperTableManager::endLevel( ) m_nCell.pop_back( ); m_nTableWidth = 0; + DomainMapperTableManager_Base_t::endLevel( ); #ifdef DEBUG_DOMAINMAPPER dmapper_logger->startElement("dmappertablemanager.endLevel"); @@ -403,6 +418,10 @@ void DomainMapperTableManager::endLevel( ) dmapper_logger->endElement(); #endif + + // Pop back the table position after endLevel as it's used + // in the endTable method called in endLevel. + m_aTablePositions.pop_back(); } @@ -576,7 +595,6 @@ void DomainMapperTableManager::clearData() m_nRow = m_nCellBorderIndex = m_nHeaderRepeat = m_nTableWidth = 0; m_sTableStyleName = OUString(); m_pTableStyleTextProperies.reset(); - m_aTablePosition = uno::Sequence(0); } diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx index e18dcea69295..d3164eaf3ee3 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx @@ -20,6 +20,7 @@ #define INCLUDED_DOMAIN_MAPPER_TABLE_MANAGER_HXX #include "TablePropertiesHandler.hxx" +#include #include #include @@ -44,7 +45,7 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t sal_Int32 m_nTableWidth; //might be set directly or has to be calculated from the column positions bool m_bOOXML; OUString m_sTableStyleName; - com::sun::star::uno::Sequence m_aTablePosition; + std::vector< TablePositionHandlerPtr > m_aTablePositions; PropertyMapPtr m_pTableStyleTextProperies; ::std::vector< IntVectorPtr > m_aTableGrid; @@ -81,7 +82,8 @@ public: IntVectorPtr getCurrentCellWidths( ); const OUString& getTableStyleName() const { return m_sTableStyleName; } - const com::sun::star::uno::Sequence getTablePosition() { return m_aTablePosition; } + const com::sun::star::uno::Sequence getCurrentTablePosition(); + /// copy the text properties of the table style and its parent into pContext void CopyTextProperties(PropertyMapPtr pContext, StyleSheetTablePtr pStyleSheetTable); -- cgit