From f91775c00dfd50e89cfcbc280d90309a5d08d727 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Thu, 31 Oct 2013 17:05:57 +0100 Subject: writerfilter: implement BorderHandler::getInteropGrabBag() Change-Id: I86922585122898692dc4fb1fbbee11e1864dad29 --- writerfilter/source/dmapper/BorderHandler.cxx | 66 +++++++++++++++++++++- writerfilter/source/dmapper/BorderHandler.hxx | 6 ++ writerfilter/source/dmapper/DomainMapper.cxx | 12 +++- writerfilter/source/dmapper/TDefTableHandler.cxx | 9 ++- writerfilter/source/dmapper/TDefTableHandler.hxx | 2 + .../source/dmapper/TablePropertiesHandler.cxx | 4 ++ 6 files changed, 90 insertions(+), 9 deletions(-) (limited to 'writerfilter') diff --git a/writerfilter/source/dmapper/BorderHandler.cxx b/writerfilter/source/dmapper/BorderHandler.cxx index a5d8560f70f0..c010c13b5c37 100644 --- a/writerfilter/source/dmapper/BorderHandler.cxx +++ b/writerfilter/source/dmapper/BorderHandler.cxx @@ -17,6 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include +#include #include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include namespace writerfilter { @@ -72,16 +74,20 @@ void BorderHandler::lcl_attribute(Id rName, Value & rVal) case NS_rtf::LN_DPTLINEWIDTH: // 0x2871 // width of a single line in 1/8 pt, max of 32 pt -> twip * 5 / 2. m_nLineWidth = nIntValue * 5 / 2; + appendGrabBag("sz", OUString::number(nIntValue)); break; case NS_rtf::LN_BRCTYPE: // 0x2872 m_nLineType = nIntValue; + appendGrabBag("val", TDefTableHandler::getBorderTypeString(nIntValue)); break; case NS_ooxml::LN_CT_Border_color: case NS_rtf::LN_ICO: // 0x2873 m_nLineColor = nIntValue; + appendGrabBag("color", OStringToOUString(msfilter::util::ConvertColor(nIntValue), RTL_TEXTENCODING_UTF8)); break; case NS_rtf::LN_DPTSPACE: // border distance in points m_nLineDistance = ConversionHelper::convertTwipToMM100( nIntValue * 20 ); + appendGrabBag("space", OUString::number(nIntValue)); break; case NS_rtf::LN_FSHADOW: // 0x2875 m_bShadow = nIntValue; @@ -90,8 +96,12 @@ void BorderHandler::lcl_attribute(Id rName, Value & rVal) case NS_rtf::LN_UNUSED2_15: // 0x2877 // ignored break; - case NS_ooxml::LN_CT_Border_themeTint: break; - case NS_ooxml::LN_CT_Border_themeColor: break; + case NS_ooxml::LN_CT_Border_themeTint: + appendGrabBag("themeTint", OUString::number(nIntValue, 16)); + break; + case NS_ooxml::LN_CT_Border_themeColor: + appendGrabBag("themeColor", TDefTableHandler::getThemeColorTypeString(nIntValue)); + break; default: OSL_FAIL( "unknown attribute"); } @@ -101,31 +111,40 @@ void BorderHandler::lcl_sprm(Sprm & rSprm) { BorderPosition pos = BORDER_COUNT; // invalid pos bool rtl = false; // TODO detect + OUString aBorderPos; switch( rSprm.getId()) { case NS_ooxml::LN_CT_TblBorders_top: pos = BORDER_TOP; + aBorderPos = "top"; break; case NS_ooxml::LN_CT_TblBorders_start: pos = rtl ? BORDER_RIGHT : BORDER_LEFT; + aBorderPos = "start"; break; case NS_ooxml::LN_CT_TblBorders_left: pos = BORDER_LEFT; + aBorderPos = "left"; break; case NS_ooxml::LN_CT_TblBorders_bottom: pos = BORDER_BOTTOM; + aBorderPos = "bottom"; break; case NS_ooxml::LN_CT_TblBorders_end: pos = rtl ? BORDER_LEFT : BORDER_RIGHT; + aBorderPos = "end"; break; case NS_ooxml::LN_CT_TblBorders_right: pos = BORDER_RIGHT; + aBorderPos = "right"; break; case NS_ooxml::LN_CT_TblBorders_insideH: pos = BORDER_HORIZONTAL; + aBorderPos = "insideH"; break; case NS_ooxml::LN_CT_TblBorders_insideV: pos = BORDER_VERTICAL; + aBorderPos = "insideV"; break; default: break; @@ -134,7 +153,20 @@ void BorderHandler::lcl_sprm(Sprm & rSprm) { writerfilter::Reference::Pointer_t pProperties = rSprm.getProps(); if( pProperties.get()) + { + std::vector aSavedGrabBag; + if (!m_aInteropGrabBagName.isEmpty()) + { + aSavedGrabBag = m_aInteropGrabBag; + m_aInteropGrabBag.clear(); + } pProperties->resolve(*this); + if (!m_aInteropGrabBagName.isEmpty()) + { + aSavedGrabBag.push_back(getInteropGrabBag(aBorderPos)); + m_aInteropGrabBag = aSavedGrabBag; + } + } ConversionHelper::MakeBorderLine( m_nLineWidth, m_nLineType, m_nLineColor, m_aBorderLines[ pos ], m_bOOXML ); m_aFilledLines[ pos ] = true; @@ -180,6 +212,36 @@ bool BorderHandler::getShadow() return m_bShadow; } +void BorderHandler::enableInteropGrabBag(OUString aName) +{ + m_aInteropGrabBagName = aName; +} + +beans::PropertyValue BorderHandler::getInteropGrabBag(OUString aName) +{ + beans::PropertyValue aRet; + if (aName.isEmpty()) + aRet.Name = m_aInteropGrabBagName; + else + aRet.Name = aName; + + 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; +} + +void BorderHandler::appendGrabBag(OUString aKey, OUString aValue) +{ + beans::PropertyValue aProperty; + aProperty.Name = aKey; + aProperty.Value = uno::makeAny(aValue); + m_aInteropGrabBag.push_back(aProperty); +} + } //namespace dmapper } //namespace writerfilter diff --git a/writerfilter/source/dmapper/BorderHandler.hxx b/writerfilter/source/dmapper/BorderHandler.hxx index 3d43c4a864da..692d7ca40988 100644 --- a/writerfilter/source/dmapper/BorderHandler.hxx +++ b/writerfilter/source/dmapper/BorderHandler.hxx @@ -23,6 +23,7 @@ #include #include #include +#include namespace writerfilter { namespace dmapper @@ -55,6 +56,9 @@ private: bool m_aFilledLines[BORDER_COUNT]; ::com::sun::star::table::BorderLine2 m_aBorderLines[BORDER_COUNT]; + OUString m_aInteropGrabBagName; + std::vector m_aInteropGrabBag; + void appendGrabBag(OUString aKey, OUString aValue); // Properties virtual void lcl_attribute(Id Name, Value & val); @@ -68,6 +72,8 @@ public: ::com::sun::star::table::BorderLine2 getBorderLine(); sal_Int32 getLineDistance() const { return m_nLineDistance;} bool getShadow(); + void enableInteropGrabBag(OUString aName); + beans::PropertyValue getInteropGrabBag(OUString aName = OUString()); }; typedef boost::shared_ptr< BorderHandler > BorderHandlerPtr; }} diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index a0c4bef1d261..0d48d9998b32 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -1168,6 +1168,10 @@ void DomainMapper::lcl_attribute(Id nName, Value & val) { if (nName == NS_ooxml::LN_CT_Language_eastAsia) m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "eastAsia", sStringValue); + else if (nName == NS_ooxml::LN_CT_Language_val) + m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "val", sStringValue); + else if (nName == NS_ooxml::LN_CT_Language_bidi) + m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "bidi", sStringValue); lang::Locale aLocale( LanguageTag::convertToLocale( sStringValue)); if (m_pImpl->GetTopContext()) m_pImpl->GetTopContext()->Insert(NS_ooxml::LN_CT_Language_val== nName ? PROP_CHAR_LOCALE : @@ -2251,8 +2255,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType // Make sure char sizes defined in the stylesheets don't affect char props from direct formatting. if (!m_pImpl->IsStyleSheetImport()) m_pImpl->deferCharacterProperty( nSprmId, uno::makeAny( nIntValue )); - if (nSprmId == NS_sprm::LN_CHps) - m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "sz", OUString::number(nIntValue)); + m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, (nSprmId == NS_sprm::LN_CHps ? OUString("sz") : OUString("szCs")), OUString::number(nIntValue)); } break; case NS_sprm::LN_CHpsInc: @@ -4056,19 +4059,23 @@ void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, const ::bo { sal_Int16 nAdjust = 0; sal_Int16 nLastLineAdjust = 0; + OUString aStringValue = "left"; switch(nIntValue) { case 1: nAdjust = style::ParagraphAdjust_CENTER; + aStringValue = "center"; break; case 2: nAdjust = static_cast< sal_Int16 > (bExchangeLeftRight ? style::ParagraphAdjust_LEFT : style::ParagraphAdjust_RIGHT); + aStringValue = "right"; break; case 4: nLastLineAdjust = style::ParagraphAdjust_BLOCK; //no break; case 3: nAdjust = style::ParagraphAdjust_BLOCK; + aStringValue = "both"; break; case 0: default: @@ -4077,6 +4084,7 @@ void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, const ::bo } pContext->Insert( PROP_PARA_ADJUST, uno::makeAny( nAdjust ) ); pContext->Insert( PROP_PARA_LAST_LINE_ADJUST, uno::makeAny( nLastLineAdjust ) ); + m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "jc", aStringValue); } bool DomainMapper::getColorFromIndex(const sal_Int32 nIndex, sal_Int32 &nColor) diff --git a/writerfilter/source/dmapper/TDefTableHandler.cxx b/writerfilter/source/dmapper/TDefTableHandler.cxx index f242f2817454..737ddefb5251 100644 --- a/writerfilter/source/dmapper/TDefTableHandler.cxx +++ b/writerfilter/source/dmapper/TDefTableHandler.cxx @@ -50,7 +50,7 @@ TDefTableHandler::~TDefTableHandler() { } -OUString lcl_getBorderTypeString(sal_Int32 nType) +OUString TDefTableHandler::getBorderTypeString(sal_Int32 nType) { switch (nType) { @@ -250,7 +250,7 @@ OUString lcl_getBorderTypeString(sal_Int32 nType) return OUString(); } -OUString lcl_getThemeColorTypeString(sal_Int32 nType) +OUString TDefTableHandler::getThemeColorTypeString(sal_Int32 nType) { switch (nType) { @@ -332,7 +332,7 @@ void TDefTableHandler::lcl_attribute(Id rName, Value & rVal) break; case NS_rtf::LN_BRCTYPE: // 0x2872 m_nLineType = nIntValue; - appendGrabBag("val", lcl_getBorderTypeString(nIntValue)); + appendGrabBag("val", TDefTableHandler::getBorderTypeString(nIntValue)); break; case NS_ooxml::LN_CT_Border_color: case NS_rtf::LN_ICO: // 0x2873 @@ -350,7 +350,7 @@ void TDefTableHandler::lcl_attribute(Id rName, Value & rVal) // ignored break; case NS_ooxml::LN_CT_Border_themeColor: - appendGrabBag("themeColor", lcl_getThemeColorTypeString(nIntValue)); + appendGrabBag("themeColor", TDefTableHandler::getThemeColorTypeString(nIntValue)); break; case NS_ooxml::LN_CT_Border_themeTint: case NS_ooxml::LN_CT_Border_themeShade: @@ -373,7 +373,6 @@ void TDefTableHandler::localResolve(Id rName, writerfilter::Referenceresolve( *this ); table::BorderLine2 aBorderLine; ConversionHelper::MakeBorderLine( m_nLineWidth, m_nLineType, m_nLineColor, diff --git a/writerfilter/source/dmapper/TDefTableHandler.hxx b/writerfilter/source/dmapper/TDefTableHandler.hxx index 993baf7f5799..11be96634bc7 100644 --- a/writerfilter/source/dmapper/TDefTableHandler.hxx +++ b/writerfilter/source/dmapper/TDefTableHandler.hxx @@ -82,6 +82,8 @@ public: sal_Int32 getTableWidth() const; void enableInteropGrabBag(OUString aName); beans::PropertyValue getInteropGrabBag(OUString aName = OUString()); + static OUString getBorderTypeString(sal_Int32 nType); + static OUString getThemeColorTypeString(sal_Int32 nType); }; typedef boost::shared_ptr< TDefTableHandler > TDefTableHandlerPtr; }} diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx index fe64c4779386..824cd0bda829 100644 --- a/writerfilter/source/dmapper/TablePropertiesHandler.cxx +++ b/writerfilter/source/dmapper/TablePropertiesHandler.cxx @@ -169,7 +169,11 @@ namespace dmapper { if( pProperties.get()) { BorderHandlerPtr pBorderHandler( new BorderHandler(m_bOOXML) ); + if (m_pCurrentInteropGrabBag) + pBorderHandler->enableInteropGrabBag("tblBorders"); pProperties->resolve(*pBorderHandler); + if (m_pCurrentInteropGrabBag) + m_pCurrentInteropGrabBag->push_back(pBorderHandler->getInteropGrabBag()); TablePropertyMapPtr pTablePropMap( new TablePropertyMap ); pTablePropMap->InsertProps(pBorderHandler->getProperties()); -- cgit