From 0ed8f752b4566ac427c0a48e14904907a7dac839 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Thu, 24 Oct 2013 14:34:10 +0200 Subject: writerfilter: implement CellMarginHandler::getInteropGrabBag This allows roundtrip of the whole tblCellMar XML fragment. Change-Id: I41c5afd6b1cfa7322f5f1bd8c44ed6bffe10eb41 --- writerfilter/source/dmapper/CellMarginHandler.cxx | 54 ++++++++++++++++++++++ writerfilter/source/dmapper/CellMarginHandler.hxx | 13 +++++- writerfilter/source/dmapper/MeasureHandler.cxx | 7 +++ .../source/dmapper/TablePropertiesHandler.cxx | 4 ++ 4 files changed, 77 insertions(+), 1 deletion(-) (limited to 'writerfilter/source') diff --git a/writerfilter/source/dmapper/CellMarginHandler.cxx b/writerfilter/source/dmapper/CellMarginHandler.cxx index 61198310c67d..a74e02b5e015 100644 --- a/writerfilter/source/dmapper/CellMarginHandler.cxx +++ b/writerfilter/source/dmapper/CellMarginHandler.cxx @@ -32,6 +32,8 @@ using namespace ::writerfilter; CellMarginHandler::CellMarginHandler() : LoggedProperties(dmapper_logger, "CellMarginHandler"), m_nValue( 0 ), +m_nWidth( 0 ), +m_nType( 0 ), m_nLeftMargin( 0 ), m_bLeftMarginValid( false ), m_nRightMargin( 0 ), @@ -55,16 +57,42 @@ void CellMarginHandler::lcl_attribute(Id rName, Value & rVal) switch( rName ) { case NS_ooxml::LN_CT_TblWidth_w: + m_nWidth = nIntValue; m_nValue = ConversionHelper::convertTwipToMM100( nIntValue ); break; case NS_ooxml::LN_CT_TblWidth_type: OSL_ENSURE( NS_ooxml::LN_Value_ST_TblWidth_dxa == sal::static_int_cast(nIntValue), "cell margins work for absolute values, only"); + m_nType = nIntValue; break; default: OSL_FAIL( "unknown attribute"); } } +void CellMarginHandler::createGrabBag(OUString aName) +{ + if (m_aInteropGrabBagName.isEmpty()) + return; + + beans::PropertyValue aRet; + aRet.Name = aName; + + uno::Sequence aSeq(2); + aSeq[0].Name = "w"; + aSeq[0].Value = uno::makeAny(m_nWidth); + aSeq[1].Name = "type"; + switch (m_nType) + { + case NS_ooxml::LN_Value_ST_TblWidth_nil: aSeq[1].Value = uno::makeAny(OUString("nil")); break; + case NS_ooxml::LN_Value_ST_TblWidth_pct: aSeq[1].Value = uno::makeAny(OUString("pct")); break; + case NS_ooxml::LN_Value_ST_TblWidth_dxa: aSeq[1].Value = uno::makeAny(OUString("dxa")); break; + case NS_ooxml::LN_Value_ST_TblWidth_auto: aSeq[1].Value = uno::makeAny(OUString("auto")); break; + } + + aRet.Value = uno::makeAny(aSeq); + m_aInteropGrabBag.push_back(aRet); +} + void CellMarginHandler::lcl_sprm(Sprm & rSprm) { writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); @@ -78,6 +106,7 @@ void CellMarginHandler::lcl_sprm(Sprm & rSprm) case NS_ooxml::LN_CT_TcMar_top: m_nTopMargin = m_nValue; m_bTopMarginValid = true; + createGrabBag("top"); break; case NS_ooxml::LN_CT_TblCellMar_start: if( rtl ) @@ -90,16 +119,19 @@ void CellMarginHandler::lcl_sprm(Sprm & rSprm) m_nLeftMargin = m_nValue; m_bLeftMarginValid = true; } + createGrabBag("start"); break; case NS_ooxml::LN_CT_TblCellMar_left: case NS_ooxml::LN_CT_TcMar_left: m_nLeftMargin = m_nValue; m_bLeftMarginValid = true; + createGrabBag("left"); break; case NS_ooxml::LN_CT_TblCellMar_bottom: case NS_ooxml::LN_CT_TcMar_bottom: m_nBottomMargin = m_nValue; m_bBottomMarginValid = true; + createGrabBag("bottom"); break; case NS_ooxml::LN_CT_TblCellMar_end: if( rtl ) @@ -112,11 +144,13 @@ void CellMarginHandler::lcl_sprm(Sprm & rSprm) m_nRightMargin = m_nValue; m_bRightMarginValid = true; } + createGrabBag("end"); break; case NS_ooxml::LN_CT_TblCellMar_right: case NS_ooxml::LN_CT_TcMar_right: m_nRightMargin = m_nValue; m_bRightMarginValid = true; + createGrabBag("right"); break; default: OSL_FAIL( "unknown sprm"); @@ -124,6 +158,26 @@ void CellMarginHandler::lcl_sprm(Sprm & rSprm) } m_nValue = 0; } + +void CellMarginHandler::enableInteropGrabBag(OUString aName) +{ + m_aInteropGrabBagName = aName; +} + +beans::PropertyValue CellMarginHandler::getInteropGrabBag() +{ + beans::PropertyValue aRet; + aRet.Name = m_aInteropGrabBagName; + + uno::Sequence aSeq(m_aInteropGrabBag.size()); + beans::PropertyValue* pSeq = aSeq.getArray(); + for (std::vector::iterator i = m_aInteropGrabBag.begin(); i != m_aInteropGrabBag.end(); ++i) + *pSeq++ = *i; + + aRet.Value = uno::makeAny(aSeq); + return aRet; +} + } //namespace dmapper } //namespace writerfilter diff --git a/writerfilter/source/dmapper/CellMarginHandler.hxx b/writerfilter/source/dmapper/CellMarginHandler.hxx index 17b770f459f4..abde1688b403 100644 --- a/writerfilter/source/dmapper/CellMarginHandler.hxx +++ b/writerfilter/source/dmapper/CellMarginHandler.hxx @@ -22,6 +22,7 @@ #include #include #include +#include namespace writerfilter { namespace dmapper @@ -30,12 +31,19 @@ class TablePropertyMap; class WRITERFILTER_DLLPRIVATE CellMarginHandler : public LoggedProperties { private: - sal_Int32 m_nValue; + sal_Int32 m_nValue; ///< Converted value. + sal_Int32 m_nWidth; ///< Original value. + sal_Int32 m_nType; ///< Unit of the value (dxa, etc). + + OUString m_aInteropGrabBagName; + std::vector m_aInteropGrabBag; // Properties virtual void lcl_attribute(Id Name, Value & val); virtual void lcl_sprm(Sprm & sprm); + void createGrabBag(OUString aName); + public: sal_Int32 m_nLeftMargin; bool m_bLeftMarginValid; @@ -52,6 +60,9 @@ public: ::boost::shared_ptr getProperties(); + void enableInteropGrabBag(OUString aName); + beans::PropertyValue getInteropGrabBag(); + }; typedef boost::shared_ptr< CellMarginHandler > CellMarginHandlerPtr; }} diff --git a/writerfilter/source/dmapper/MeasureHandler.cxx b/writerfilter/source/dmapper/MeasureHandler.cxx index 57ffec52cc3a..0875a89990c9 100644 --- a/writerfilter/source/dmapper/MeasureHandler.cxx +++ b/writerfilter/source/dmapper/MeasureHandler.cxx @@ -84,6 +84,13 @@ void MeasureHandler::lcl_attribute(Id rName, Value & rVal) case NS_rtf::LN_preferredWidth: case NS_ooxml::LN_CT_TblWidth_w:// = 90667; m_nMeasureValue = nIntValue; + if (!m_aInteropGrabBagName.isEmpty()) + { + beans::PropertyValue aValue; + aValue.Name = "w"; + aValue.Value = uno::makeAny(nIntValue); + m_aInteropGrabBag.push_back(aValue); + } break; case NS_ooxml::LN_CT_Height_val: // 90665 -- a string value { diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx index cf3a15a8f888..3749a87ee60b 100644 --- a/writerfilter/source/dmapper/TablePropertiesHandler.cxx +++ b/writerfilter/source/dmapper/TablePropertiesHandler.cxx @@ -242,7 +242,11 @@ namespace dmapper { if( pProperties.get()) { CellMarginHandlerPtr pCellMarginHandler( new CellMarginHandler ); + if (m_pCurrentInteropGrabBag) + pCellMarginHandler->enableInteropGrabBag("tblCellMar"); pProperties->resolve( *pCellMarginHandler ); + if (m_pCurrentInteropGrabBag) + m_pCurrentInteropGrabBag->push_back(pCellMarginHandler->getInteropGrabBag()); TablePropertyMapPtr pMarginProps( new TablePropertyMap ); if( pCellMarginHandler->m_bTopMarginValid ) pMarginProps->setValue( TablePropertyMap::CELL_MAR_TOP, pCellMarginHandler->m_nTopMargin ); -- cgit v1.2.3