From fd155af5369e3ec782c768f54781658d210e375c Mon Sep 17 00:00:00 2001 From: Cédric Bosdonnat Date: Wed, 20 Feb 2013 11:04:16 +0100 Subject: n#779642: Fixed floating tables import in writerfilter (cherry picked from commit d0cde9640b52ccfbb28ed1f65bba0927afd7b69b) Change-Id: Id60a08811f238db505d51b0e1381427a8f5df9cf Reviewed-on: https://gerrit.libreoffice.org/2307 Reviewed-by: Miklos Vajna Tested-by: Miklos Vajna --- .../source/dmapper/DomainMapperTableHandler.cxx | 46 ++------ .../source/dmapper/DomainMapperTableManager.cxx | 9 +- .../source/dmapper/DomainMapperTableManager.hxx | 4 +- .../source/dmapper/TablePositionHandler.cxx | 117 ++++++++++++++++++++- .../source/dmapper/TablePositionHandler.hxx | 14 ++- 5 files changed, 136 insertions(+), 54 deletions(-) (limited to 'writerfilter/source/dmapper') diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx index b5c993bb789b..3b8177372867 100644 --- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx @@ -715,7 +715,8 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) uno::Reference xStart; uno::Reference xEnd; // If we want to make this table a floating one. - bool bFloating = !m_rDMapper_Impl.getTableManager().getTableVertAnchor().isEmpty(); + uno::Sequence aFrameProperties = m_rDMapper_Impl.getTableManager().getTablePosition(); + bool bFloating = aFrameProperties.hasElements(); // Additional checks: if we can do this. if (bFloating && (*m_pTableSeq)[0].getLength() > 0 && (*m_pTableSeq)[0][0].getLength() > 0) { @@ -762,46 +763,11 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) if (xTable.is() && xStart.is() && xEnd.is()) { uno::Reference xTableProperties(xTable, uno::UNO_QUERY); - uno::Sequence< beans::PropertyValue > aFrameProperties(16); - beans::PropertyValue* pFrameProperties = aFrameProperties.getArray(); - pFrameProperties[0].Name = "Width"; - pFrameProperties[0].Value = xTableProperties->getPropertyValue("Width"); - - pFrameProperties[1].Name = "LeftBorderDistance"; - pFrameProperties[1].Value <<= sal_Int32(0); - pFrameProperties[2].Name = "RightBorderDistance"; - pFrameProperties[2].Value <<= sal_Int32(0); - pFrameProperties[3].Name = "TopBorderDistance"; - pFrameProperties[3].Value <<= sal_Int32(0); - pFrameProperties[4].Name = "BottomBorderDistance"; - pFrameProperties[4].Value <<= sal_Int32(0); - - pFrameProperties[5].Name = "LeftMargin"; - pFrameProperties[5].Value <<= sal_Int32(0); - pFrameProperties[6].Name = "RightMargin"; - pFrameProperties[6].Value <<= sal_Int32(0); - pFrameProperties[7].Name = "TopMargin"; - pFrameProperties[7].Value <<= sal_Int32(0); - pFrameProperties[8].Name = "BottomMargin"; - pFrameProperties[8].Value <<= sal_Int32(0); - - table::BorderLine2 aEmptyBorder; - pFrameProperties[9].Name = "TopBorder"; - pFrameProperties[9].Value <<= aEmptyBorder; - pFrameProperties[10].Name = "BottomBorder"; - pFrameProperties[10].Value <<= aEmptyBorder; - pFrameProperties[11].Name = "LeftBorder"; - pFrameProperties[11].Value <<= aEmptyBorder; - pFrameProperties[12].Name = "RightBorder"; - pFrameProperties[12].Value <<= aEmptyBorder; - - pFrameProperties[13].Name = "HoriOrient"; - pFrameProperties[13].Value <<= text::HoriOrientation::NONE; - pFrameProperties[14].Name = "HoriOrientRelation"; - pFrameProperties[14].Value <<= text::RelOrientation::FRAME; + aFrameProperties.realloc(aFrameProperties.getLength() + 1); + aFrameProperties[aFrameProperties.getLength() - 1].Name = "Width"; + aFrameProperties[aFrameProperties.getLength() - 1].Value = xTableProperties->getPropertyValue("Width"); + // A non-zero left margin would move the table out of the frame, move the frame itself instead. - pFrameProperties[15].Name = "HoriOrientPosition"; - pFrameProperties[15].Value <<= xTableProperties->getPropertyValue("LeftMargin"); xTableProperties->setPropertyValue("LeftMargin", uno::makeAny(sal_Int32(0))); uno::Reference< text::XTextContent > xFrame = m_xText->convertToTextFrame(xStart, xEnd, aFrameProperties); diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx index 52fbd0ccb749..80bd683e25a3 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -325,7 +325,7 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) { TablePositionHandlerPtr pHandler( new TablePositionHandler ); pProperties->resolve(*pHandler); - m_sTableVertAnchor = pHandler->getVertAnchor(); + m_aTablePosition = pHandler->getTablePosition(); } } break; @@ -361,11 +361,6 @@ boost::shared_ptr< vector< sal_Int32 > > DomainMapperTableManager::getCurrentCel return m_aCellWidths.back( ); } -const OUString& DomainMapperTableManager::getTableVertAnchor() const -{ - return m_sTableVertAnchor; -} - void DomainMapperTableManager::startLevel( ) { DomainMapperTableManager_Base_t::startLevel( ); @@ -581,8 +576,8 @@ void DomainMapperTableManager::clearData() { m_nRow = m_nCellBorderIndex = m_nHeaderRepeat = m_nTableWidth = 0; m_sTableStyleName = OUString(); - m_sTableVertAnchor = OUString(); m_pTableStyleTextProperies.reset(); + m_aTablePosition = uno::Sequence(0); } diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx index bba5b5e56fd3..e18dcea69295 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.hxx @@ -44,7 +44,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; - OUString m_sTableVertAnchor; + com::sun::star::uno::Sequence m_aTablePosition; PropertyMapPtr m_pTableStyleTextProperies; ::std::vector< IntVectorPtr > m_aTableGrid; @@ -81,7 +81,7 @@ public: IntVectorPtr getCurrentCellWidths( ); const OUString& getTableStyleName() const { return m_sTableStyleName; } - const OUString& getTableVertAnchor() const; + const com::sun::star::uno::Sequence getTablePosition() { return m_aTablePosition; } /// copy the text properties of the table style and its parent into pContext void CopyTextProperties(PropertyMapPtr pContext, StyleSheetTablePtr pStyleSheetTable); diff --git a/writerfilter/source/dmapper/TablePositionHandler.cxx b/writerfilter/source/dmapper/TablePositionHandler.cxx index e7d872a24059..8ae6ac20e6a4 100644 --- a/writerfilter/source/dmapper/TablePositionHandler.cxx +++ b/writerfilter/source/dmapper/TablePositionHandler.cxx @@ -11,7 +11,9 @@ #include #include #include -#include +#include +#include +#include #include "dmapperLoggers.hxx" namespace writerfilter { @@ -20,7 +22,13 @@ namespace dmapper { using namespace ::com::sun::star; TablePositionHandler::TablePositionHandler() : -LoggedProperties(dmapper_logger, "TablePositionHandler") + LoggedProperties(dmapper_logger, "TablePositionHandler"), + m_aVertAnchor( "margin" ), + m_aYSpec( ), + m_aHorzAnchor( "text" ), + m_aXSpec( ), + m_nY( 0 ), + m_nX( 0 ) { } @@ -36,6 +44,21 @@ void TablePositionHandler::lcl_attribute(Id rName, Value& rVal) case NS_ooxml::LN_CT_TblPPr_vertAnchor: m_aVertAnchor = rVal.getString(); break; + case NS_ooxml::LN_CT_TblPPr_tblpYSpec: + m_aYSpec = rVal.getString(); + break; + case NS_ooxml::LN_CT_TblPPr_horzAnchor: + m_aHorzAnchor = rVal.getString(); + break; + case NS_ooxml::LN_CT_TblPPr_tblpXSpec: + m_aXSpec = rVal.getString(); + break; + case NS_ooxml::LN_CT_TblPPr_tblpY: + m_nY = rVal.getInt(); + break; + case NS_ooxml::LN_CT_TblPPr_tblpX: + m_nX = rVal.getInt(); + break; default: #ifdef DEBUG_DOMAINMAPPER dmapper_logger->element("unhandled"); @@ -50,9 +73,95 @@ void TablePositionHandler::lcl_sprm(Sprm& /*rSprm*/) } -OUString TablePositionHandler::getVertAnchor() const +uno::Sequence TablePositionHandler::getTablePosition() const { - return m_aVertAnchor; + uno::Sequence< beans::PropertyValue > aFrameProperties(18); + beans::PropertyValue* pFrameProperties = aFrameProperties.getArray(); + + pFrameProperties[0].Name = "LeftBorderDistance"; + pFrameProperties[0].Value <<= sal_Int32(0); + pFrameProperties[1].Name = "RightBorderDistance"; + pFrameProperties[1].Value <<= sal_Int32(0); + pFrameProperties[2].Name = "TopBorderDistance"; + pFrameProperties[2].Value <<= sal_Int32(0); + pFrameProperties[3].Name = "BottomBorderDistance"; + pFrameProperties[3].Value <<= sal_Int32(0); + + pFrameProperties[4].Name = "LeftMargin"; + pFrameProperties[4].Value <<= sal_Int32(0); + pFrameProperties[5].Name = "RightMargin"; + pFrameProperties[5].Value <<= sal_Int32(0); + pFrameProperties[6].Name = "TopMargin"; + pFrameProperties[6].Value <<= sal_Int32(0); + pFrameProperties[7].Name = "BottomMargin"; + pFrameProperties[7].Value <<= sal_Int32(0); + + table::BorderLine2 aEmptyBorder; + pFrameProperties[8].Name = "TopBorder"; + pFrameProperties[8].Value <<= aEmptyBorder; + pFrameProperties[9].Name = "BottomBorder"; + pFrameProperties[9].Value <<= aEmptyBorder; + pFrameProperties[10].Name = "LeftBorder"; + pFrameProperties[10].Value <<= aEmptyBorder; + pFrameProperties[11].Name = "RightBorder"; + pFrameProperties[11].Value <<= aEmptyBorder; + + // Horizontal positioning + sal_Int16 nHoriOrient = text::HoriOrientation::NONE; + if ( m_aXSpec == "center" ) + nHoriOrient = text::HoriOrientation::CENTER; + else if ( m_aXSpec == "inside" ) + nHoriOrient = text::HoriOrientation::INSIDE; + else if ( m_aXSpec == "left" ) + nHoriOrient = text::HoriOrientation::LEFT; + else if ( m_aXSpec == "outside" ) + nHoriOrient = text::HoriOrientation::OUTSIDE; + else if ( m_aXSpec == "right" ) + nHoriOrient = text::HoriOrientation::RIGHT; + + sal_Int16 nHoriOrientRelation; + if ( m_aHorzAnchor == "margin" ) + nHoriOrientRelation = text::RelOrientation::PAGE_PRINT_AREA; + else if ( m_aHorzAnchor == "page" ) + nHoriOrientRelation = text::RelOrientation::PAGE_FRAME; + else if ( m_aHorzAnchor == "text" ) + nHoriOrientRelation = text::RelOrientation::FRAME; + + pFrameProperties[12].Name = "HoriOrient"; + pFrameProperties[12].Value <<= nHoriOrient; + pFrameProperties[13].Name = "HoriOrientRelation"; + pFrameProperties[13].Value <<= nHoriOrientRelation; + pFrameProperties[14].Name = "HoriOrientPosition"; + pFrameProperties[14].Value <<= m_nX; + + + // Vertical positioning + sal_Int16 nVertOrient = text::VertOrientation::NONE; + if ( m_aYSpec == "bottom" ) + nVertOrient = text::VertOrientation::BOTTOM; + else if ( m_aYSpec == "center" ) + nVertOrient = text::VertOrientation::CENTER; + else if ( m_aYSpec == "top" ) + nVertOrient = text::VertOrientation::TOP; + // TODO There are a few cases we can't map ATM. + + + sal_Int16 nVertOrientRelation; + if ( m_aVertAnchor == "margin" ) + nVertOrientRelation = text::RelOrientation::PAGE_PRINT_AREA; + else if ( m_aVertAnchor == "page" ) + nVertOrientRelation = text::RelOrientation::PAGE_FRAME; + else if ( m_aVertAnchor == "text" ) + nVertOrientRelation = text::RelOrientation::FRAME; + + pFrameProperties[15].Name = "VertOrient"; + pFrameProperties[15].Value <<= nVertOrient; + pFrameProperties[16].Name = "VertOrientRelation"; + pFrameProperties[16].Value <<= nVertOrientRelation; + pFrameProperties[17].Name = "VertOrientPosition"; + pFrameProperties[17].Value <<= m_nY; + + return aFrameProperties; } } // namespace dmapper diff --git a/writerfilter/source/dmapper/TablePositionHandler.hxx b/writerfilter/source/dmapper/TablePositionHandler.hxx index ea4b15497283..dc096e687d26 100644 --- a/writerfilter/source/dmapper/TablePositionHandler.hxx +++ b/writerfilter/source/dmapper/TablePositionHandler.hxx @@ -12,6 +12,7 @@ #include #include #include +#include namespace writerfilter { namespace dmapper { @@ -21,6 +22,11 @@ namespace writerfilter { : public LoggedProperties { OUString m_aVertAnchor; + OUString m_aYSpec; + OUString m_aHorzAnchor; + OUString m_aXSpec; + sal_Int32 m_nY; + sal_Int32 m_nX; // Properties virtual void lcl_attribute(Id Name, Value & val); @@ -30,7 +36,13 @@ namespace writerfilter { TablePositionHandler(); virtual ~TablePositionHandler(); - OUString getVertAnchor() const; + /** Compute the UNO properties for the frame containing the table based + on the received tokens. + + Note that the properties will need to be adjusted with the table + properties before actually using them. + */ + com::sun::star::uno::Sequence getTablePosition() const; }; typedef boost::shared_ptr TablePositionHandlerPtr; -- cgit v1.2.3