diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2013-05-30 11:55:37 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2013-05-30 17:00:22 +0200 |
commit | f74e7998ce04d54e10aa25eae45d94315768b120 (patch) | |
tree | 60b979ff9c56305a75f5446f8212cdfe57ccc52e | |
parent | 429b722cb63e3da76527540fb3754e11531e2cf6 (diff) |
bnc#817956 DOCX import of page border shadow
See the comment in SectionPropertyMap::ApplyBorderToPageStyles() on what and
how is mapped. The control flow is like this: BorderHandler::lcl_attribute()
notices w:shadow, then PageBordersHandler::lcl_sprm() gets it, passes it to
SectionPropertyMap::SetBorder(), finally
SectionPropertyMap::ApplyBorderToPageStyles() uses the UNO API.
(cherry picked from commit f0aa209390aea68f4c23cf16df9d1577aaea91b5)
Change-Id: Ib0aef3245f58c62655769357f1f4dd07eef77f62
-rw-r--r-- | writerfilter/source/dmapper/BorderHandler.cxx | 9 | ||||
-rw-r--r-- | writerfilter/source/dmapper/BorderHandler.hxx | 2 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 2 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PageBordersHandler.cxx | 6 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PageBordersHandler.hxx | 1 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyIds.cxx | 1 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyIds.hxx | 1 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.cxx | 23 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.hxx | 3 |
9 files changed, 42 insertions, 6 deletions
diff --git a/writerfilter/source/dmapper/BorderHandler.cxx b/writerfilter/source/dmapper/BorderHandler.cxx index 5bb53fd2e06d..9e661475733e 100644 --- a/writerfilter/source/dmapper/BorderHandler.cxx +++ b/writerfilter/source/dmapper/BorderHandler.cxx @@ -48,6 +48,7 @@ m_nLineWidth(15), // Word default, in twips m_nLineType(0), m_nLineColor(0), m_nLineDistance(0), +m_bShadow(false), m_bOOXML( bOOXML ) { const int nBorderCount(BORDER_COUNT); @@ -92,7 +93,8 @@ void BorderHandler::lcl_attribute(Id rName, Value & rVal) m_nLineDistance = ConversionHelper::convertTwipToMM100( nIntValue * 20 ); break; case NS_rtf::LN_FSHADOW: // 0x2875 - //if 1 then line has shadow - unsupported + m_bShadow = nIntValue; + break; case NS_rtf::LN_FFRAME: // 0x2876 case NS_rtf::LN_UNUSED2_15: // 0x2877 // ignored @@ -182,6 +184,11 @@ table::BorderLine2 BorderHandler::getBorderLine() return aBorderLine; } +bool BorderHandler::getShadow() +{ + return m_bShadow; +} + } //namespace dmapper } //namespace writerfilter diff --git a/writerfilter/source/dmapper/BorderHandler.hxx b/writerfilter/source/dmapper/BorderHandler.hxx index 6d23f123c2aa..8214bdbf4293 100644 --- a/writerfilter/source/dmapper/BorderHandler.hxx +++ b/writerfilter/source/dmapper/BorderHandler.hxx @@ -59,6 +59,7 @@ private: sal_Int32 m_nLineType; sal_Int32 m_nLineColor; sal_Int32 m_nLineDistance; + bool m_bShadow; bool m_bOOXML; bool m_aFilledLines[BORDER_COUNT]; @@ -75,6 +76,7 @@ public: ::boost::shared_ptr<PropertyMap> getProperties(); ::com::sun::star::table::BorderLine2 getBorderLine(); sal_Int32 getLineDistance() const { return m_nLineDistance;} + bool getShadow(); }; typedef boost::shared_ptr< BorderHandler > BorderHandlerPtr; }} diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 1dd4acf3e94a..3defa796127e 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -2718,7 +2718,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType BORDER_BOTTOM, BORDER_RIGHT }; - pSectionContext->SetBorder( aPositions[nSprmId - NS_sprm::LN_SBrcTop], nLineDistance, aBorderLine ); + pSectionContext->SetBorder( aPositions[nSprmId - NS_sprm::LN_SBrcTop], nLineDistance, aBorderLine, /*bShadow =*/ false ); } } break; diff --git a/writerfilter/source/dmapper/PageBordersHandler.cxx b/writerfilter/source/dmapper/PageBordersHandler.cxx index 41469d6cf507..ea6e450c9821 100644 --- a/writerfilter/source/dmapper/PageBordersHandler.cxx +++ b/writerfilter/source/dmapper/PageBordersHandler.cxx @@ -10,7 +10,8 @@ namespace dmapper { _PgBorder::_PgBorder( ) : m_nDistance( 0 ), - m_ePos( BORDER_RIGHT ) + m_ePos( BORDER_RIGHT ), + m_bShadow(false) { } @@ -105,6 +106,7 @@ void PageBordersHandler::lcl_sprm( Sprm& rSprm ) aPgBorder.m_rLine = pBorderHandler->getBorderLine( ); aPgBorder.m_nDistance = pBorderHandler->getLineDistance( ); aPgBorder.m_ePos = ePos; + aPgBorder.m_bShadow = pBorderHandler->getShadow(); m_aBorders.push_back( aPgBorder ); } } @@ -118,7 +120,7 @@ void PageBordersHandler::SetBorders( SectionPropertyMap* pSectContext ) for ( int i = 0, length = m_aBorders.size( ); i < length; i++ ) { _PgBorder aBorder = m_aBorders[i]; - pSectContext->SetBorder( aBorder.m_ePos, aBorder.m_nDistance, aBorder.m_rLine ); + pSectContext->SetBorder( aBorder.m_ePos, aBorder.m_nDistance, aBorder.m_rLine, aBorder.m_bShadow ); } } diff --git a/writerfilter/source/dmapper/PageBordersHandler.hxx b/writerfilter/source/dmapper/PageBordersHandler.hxx index d238a71981d7..6f4ce9ec7a9f 100644 --- a/writerfilter/source/dmapper/PageBordersHandler.hxx +++ b/writerfilter/source/dmapper/PageBordersHandler.hxx @@ -23,6 +23,7 @@ public: com::sun::star::table::BorderLine2 m_rLine; sal_Int32 m_nDistance; BorderPosition m_ePos; + bool m_bShadow; _PgBorder( ); ~_PgBorder( ); diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx index 0a2a313b30dc..2189f4de74fb 100644 --- a/writerfilter/source/dmapper/PropertyIds.cxx +++ b/writerfilter/source/dmapper/PropertyIds.cxx @@ -327,6 +327,7 @@ const rtl::OUString& PropertyNameSupplier::GetName( PropertyIds eId ) const case PROP_Z_ORDER: sName = "ZOrder"; break; case PROP_RELATIVE_WIDTH: sName = "RelativeWidth"; break; case PROP_IS_WIDTH_RELATIVE: sName = "IsWidthRelative"; break; + case PROP_SHADOW_FORMAT: sName = "ShadowFormat"; break; } ::std::pair<PropertyNameMap_t::iterator,bool> aInsertIt = m_pImpl->aNameMap.insert( PropertyNameMap_t::value_type( eId, sName )); diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx index 1d39dbb024a1..4e33082dfa37 100644 --- a/writerfilter/source/dmapper/PropertyIds.hxx +++ b/writerfilter/source/dmapper/PropertyIds.hxx @@ -300,6 +300,7 @@ enum PropertyIds ,PROP_Z_ORDER ,PROP_RELATIVE_WIDTH ,PROP_IS_WIDTH_RELATIVE + ,PROP_SHADOW_FORMAT }; struct PropertyNameSupplier_Impl; class PropertyNameSupplier diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index 4781a671daa2..5f34542137ce 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -40,6 +40,7 @@ #include <com/sun/star/container/XNameContainer.hpp> #include <com/sun/star/style/BreakType.hpp> #include <com/sun/star/style/PageStyleLayout.hpp> +#include <com/sun/star/table/ShadowFormat.hpp> #include <com/sun/star/text/RelOrientation.hpp> #include <com/sun/star/text/WritingMode.hpp> #include <com/sun/star/text/XTextColumns.hpp> @@ -296,7 +297,10 @@ SectionPropertyMap::SectionPropertyMap(bool bIsFirstSection) : nSectionNumber = nNumber++; memset(&m_pBorderLines, 0x00, sizeof(m_pBorderLines)); for( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder ) + { m_nBorderDistances[ nBorder ] = -1; + m_bBorderShadows[nBorder] = false; + } //todo: set defaults in ApplyPropertiesToPageStyles //initialize defaults PaperInfo aLetter(PAPER_LETTER); @@ -414,11 +418,12 @@ uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle( } -void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const table::BorderLine2& rBorderLine ) +void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const table::BorderLine2& rBorderLine, bool bShadow ) { delete m_pBorderLines[ePos]; m_pBorderLines[ePos] = new table::BorderLine2( rBorderLine ); m_nBorderDistances[ePos] = nLineDistance; + m_bBorderShadows[ePos] = bShadow; } @@ -511,6 +516,22 @@ void SectionPropertyMap::ApplyBorderToPageStyles( m_nBorderDistances[nBorder], nOffsetFrom, nLineWidth ); } } + + if (m_bBorderShadows[BORDER_RIGHT]) + { + // In Word UI, shadow is a boolean property, in OOXML, it's a boolean + // property of each 4 border type, finally in Writer the border is a + // property of the page style, with shadow location, distance and + // color. See SwWW8ImplReader::SetShadow(). + table::ShadowFormat aFormat; + aFormat.Color = COL_BLACK; + aFormat.Location = table::ShadowLocation_BOTTOM_RIGHT; + aFormat.ShadowWidth = m_pBorderLines[BORDER_RIGHT]->LineWidth; + if (xFirst.is()) + xFirst->setPropertyValue(rPropNameSupplier.GetName(PROP_SHADOW_FORMAT), uno::makeAny(aFormat)); + if (xSecond.is()) + xSecond->setPropertyValue(rPropNameSupplier.GetName(PROP_SHADOW_FORMAT), uno::makeAny(aFormat)); + } } void SectionPropertyMap::SetBorderDistance( uno::Reference< beans::XPropertySet > xStyle, diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index baf2d69bfa52..1c58e453d52b 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -160,6 +160,7 @@ class SectionPropertyMap : public PropertyMap ::com::sun::star::table::BorderLine2* m_pBorderLines[4]; sal_Int32 m_nBorderDistances[4]; sal_Int32 m_nBorderParams; + bool m_bBorderShadows[4]; bool m_bTitlePage; sal_Int16 m_nColumnCount; @@ -230,7 +231,7 @@ public: const ::com::sun::star::uno::Reference < ::com::sun::star::lang::XMultiServiceFactory >& xTextFactory, bool bFirst ); - void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const ::com::sun::star::table::BorderLine2& rBorderLine ); + void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const ::com::sun::star::table::BorderLine2& rBorderLine, bool bShadow ); void SetBorderParams( sal_Int32 nSet ) { m_nBorderParams = nSet; } void SetColumnCount( sal_Int16 nCount ) { m_nColumnCount = nCount; } |