diff options
author | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-02-21 10:27:31 +0100 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-02-21 11:00:42 +0100 |
commit | 9965b124b5631bb0e1bf5be394224251c72fe0e5 (patch) | |
tree | 68f6387924d18405b83c8afad65198423464ab9a /writerfilter/source | |
parent | fca2522c576a386535067ed422a90a05ca648f63 (diff) |
n#779642: table positions need to be stacked to handle nested table
(cherry picked from commit 36c64bc194714d60a5c18f63bcfc0f721c2056db)
Conflicts:
writerfilter/source/dmapper/DomainMapperTableManager.hxx
Change-Id: If592f5a2f29c207daf9a603a4332da9bc8c5ae3b
Diffstat (limited to 'writerfilter/source')
3 files changed, 27 insertions, 6 deletions
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index 65a26f9b8c58..9c2d298d4037 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -720,7 +720,7 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) uno::Reference<text::XTextRange> xStart; uno::Reference<text::XTextRange> xEnd; // If we want to make this table a floating one. - uno::Sequence<beans::PropertyValue> aFrameProperties = m_rDMapper_Impl.getTableManager().getTablePosition(); + uno::Sequence<beans::PropertyValue> 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 43a82388ef59..a396d69fac35 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -33,7 +33,6 @@ #include <CellMarginHandler.hxx> #include <ConversionHelper.hxx> #include <MeasureHandler.hxx> -#include <TablePositionHandler.hxx> #include <TDefTableHandler.hxx> #include <com/sun/star/text/HoriOrientation.hpp> #include <com/sun/star/text/SizeType.hpp> @@ -330,9 +329,14 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) writerfilter::Reference<Properties>::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; @@ -368,6 +372,14 @@ boost::shared_ptr< vector< sal_Int32 > > DomainMapperTableManager::getCurrentCel return m_aCellWidths.back( ); } +const uno::Sequence<beans::PropertyValue> 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( ); @@ -383,9 +395,11 @@ void DomainMapperTableManager::startLevel( ) IntVectorPtr pNewGrid( new vector<sal_Int32> ); IntVectorPtr pNewSpans( new vector<sal_Int32> ); IntVectorPtr pNewCellWidths( new vector<sal_Int32> ); + 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; @@ -402,6 +416,7 @@ void DomainMapperTableManager::endLevel( ) m_nCell.pop_back( ); m_nTableWidth = 0; + DomainMapperTableManager_Base_t::endLevel( ); #ifdef DEBUG_DOMAINMAPPER dmapper_logger->startElement("dmappertablemanager.endLevel"); @@ -411,6 +426,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(); } @@ -612,7 +631,6 @@ void DomainMapperTableManager::clearData() m_nRow = m_nCellBorderIndex = m_nHeaderRepeat = m_nTableWidth = 0; m_sTableStyleName = ::rtl::OUString(); m_pTableStyleTextProperies.reset(); - m_aTablePosition = uno::Sequence<beans::PropertyValue>(0); } diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx index 34a8df596b2b..97866b0f8cc7 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx @@ -29,6 +29,7 @@ #define INCLUDED_DOMAIN_MAPPER_TABLE_MANAGER_HXX #include "TablePropertiesHandler.hxx" +#include <TablePositionHandler.hxx> #include <resourcemodel/TableManager.hxx> #include <PropertyMap.hxx> @@ -54,7 +55,7 @@ class DomainMapperTableManager : public DomainMapperTableManager_Base_t bool m_bOOXML; bool m_bImplicitMerges; ::rtl::OUString m_sTableStyleName; - com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> m_aTablePosition; + std::vector< TablePositionHandlerPtr > m_aTablePositions; PropertyMapPtr m_pTableStyleTextProperies; ::std::vector< IntVectorPtr > m_aTableGrid; @@ -92,6 +93,8 @@ public: const ::rtl::OUString& getTableStyleName() const { return m_sTableStyleName; } const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> getTablePosition() { return m_aTablePosition; } + const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> getCurrentTablePosition(); + /// copy the text properties of the table style and its parent into pContext void CopyTextProperties(PropertyMapPtr pContext, StyleSheetTablePtr pStyleSheetTable); |