summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-05-30 11:55:37 +0200
committerMiklos Vajna <vmiklos@suse.cz>2013-05-30 17:00:22 +0200
commitf74e7998ce04d54e10aa25eae45d94315768b120 (patch)
tree60b979ff9c56305a75f5446f8212cdfe57ccc52e
parent429b722cb63e3da76527540fb3754e11531e2cf6 (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.cxx9
-rw-r--r--writerfilter/source/dmapper/BorderHandler.hxx2
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx2
-rw-r--r--writerfilter/source/dmapper/PageBordersHandler.cxx6
-rw-r--r--writerfilter/source/dmapper/PageBordersHandler.hxx1
-rw-r--r--writerfilter/source/dmapper/PropertyIds.cxx1
-rw-r--r--writerfilter/source/dmapper/PropertyIds.hxx1
-rw-r--r--writerfilter/source/dmapper/PropertyMap.cxx23
-rw-r--r--writerfilter/source/dmapper/PropertyMap.hxx3
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; }