From c7884509a84d46a9d99b2950159d949589862f3a Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 5 Aug 2013 17:08:20 +0200 Subject: fdo#67498 RTF import: fix missing margins vs continuous section breaks The document had 3 sections, separated by continuous section breaks. Previously only margins from the last section were imported, this way the first page had default margins. Now margins are also applied when we hit continuous section breaks. This way margin values from the last section break affecting the page wins. A later commit could improve this further by setting the minimum of these and setting a section margin for each non-minimal sections. Change-Id: I4d9a4585e795220533909bd1d467d933caaa0d71 --- writerfilter/source/dmapper/PropertyMap.cxx | 47 +++++++++++++++++------------ writerfilter/source/dmapper/PropertyMap.hxx | 2 ++ 2 files changed, 30 insertions(+), 19 deletions(-) (limited to 'writerfilter') diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index 12380f7698c1..257ec94d9e51 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -843,6 +843,29 @@ uno::Reference lcl_GetRangeProperties(bool bIsFirstSection, return xRangeProperties; } +void SectionPropertyMap::HandleMarginsHeaderFooter(DomainMapper_Impl& rDM_Impl) +{ + if( m_nDzaGutter > 0 ) + { + //todo: iGutterPos from DocProperties are missing + if( m_bGutterRTL ) + m_nRightMargin += m_nDzaGutter; + else + m_nLeftMargin += m_nDzaGutter; + } + operator[]( PropertyDefinition( PROP_LEFT_MARGIN )) = uno::makeAny( m_nLeftMargin ); + operator[]( PropertyDefinition( PROP_RIGHT_MARGIN )) = uno::makeAny( m_nRightMargin ); + + if (rDM_Impl.m_oBackgroundColor) + operator[](PropertyDefinition(PROP_BACK_COLOR )) = uno::makeAny(*rDM_Impl.m_oBackgroundColor); + + /*** if headers/footers are available then the top/bottom margins of the + header/footer are copied to the top/bottom margin of the page + */ + CopyLastHeaderFooter( false, rDM_Impl ); + PrepareHeaderFooterProperties( false ); +} + void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) { PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); @@ -891,6 +914,10 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) try { xRangeProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_PAGE_DESC_NAME), uno::makeAny(aName)); + uno::Reference xPageStyle (rDM_Impl.GetPageStyles()->getByName(aName), uno::UNO_QUERY_THROW); + HandleMarginsHeaderFooter(rDM_Impl); + if (rDM_Impl.IsNewDoc()) + _ApplyProperties(xPageStyle); } catch( const uno::Exception& ) { @@ -922,25 +949,7 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) //get the properties and create appropriate page styles uno::Reference< beans::XPropertySet > xFollowPageStyle = GetPageStyle( rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), false ); - if( m_nDzaGutter > 0 ) - { - //todo: iGutterPos from DocProperties are missing - if( m_bGutterRTL ) - m_nRightMargin += m_nDzaGutter; - else - m_nLeftMargin += m_nDzaGutter; - } - operator[]( PropertyDefinition( PROP_LEFT_MARGIN )) = uno::makeAny( m_nLeftMargin ); - operator[]( PropertyDefinition( PROP_RIGHT_MARGIN )) = uno::makeAny( m_nRightMargin ); - - if (rDM_Impl.m_oBackgroundColor) - operator[](PropertyDefinition(PROP_BACK_COLOR )) = uno::makeAny(*rDM_Impl.m_oBackgroundColor); - - /*** if headers/footers are available then the top/bottom margins of the - header/footer are copied to the top/bottom margin of the page - */ - CopyLastHeaderFooter( false, rDM_Impl ); - PrepareHeaderFooterProperties( false ); + HandleMarginsHeaderFooter(rDM_Impl); const OUString sTrayIndex = rPropNameSupplier.GetName( PROP_PRINTER_PAPER_TRAY_INDEX ); if( m_nPaperBin >= 0 ) diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index d5d70d71823e..ed0f6cb47485 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -265,6 +265,8 @@ public: sal_Int32 nValue ); void CloseSectionGroup( DomainMapper_Impl& rDM_Impl ); + /// Handling of margins, header and footer for any kind of sections breaks. + void HandleMarginsHeaderFooter(DomainMapper_Impl& rDM_Impl); }; typedef boost::shared_ptr SectionPropertyMapPtr; -- cgit