diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2013-05-21 14:56:45 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2013-05-21 17:57:25 +0200 |
commit | 5177c2d7a970bf1cdefed8a068e1069a83a34396 (patch) | |
tree | 4f6bad3f5651f4bfbf9b51d2dba0f27b32d8b32d /writerfilter | |
parent | b0a3cb212a2b53b2a6551b9c7f23355de7157e7c (diff) |
bnc#818997 RTF import: don't ignore page breaks between shapes
Change-Id: Ief71ba9a3c60356714e73d08e88d0a3105b17b1a
(cherry picked from commit b40fe8e5a5037d2745cc7b1c9cc408ce6c79b9d9)
Conflicts:
sw/qa/extras/rtfimport/rtfimport.cxx
writerfilter/source/dmapper/DomainMapper.cxx
writerfilter/source/rtftok/rtfdocumentimpl.cxx
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 13 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 15 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 1 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 4 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.hxx | 2 |
5 files changed, 35 insertions, 0 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 0e109073326f..66b1e6ce1f61 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -3462,6 +3462,19 @@ void DomainMapper::markLastParagraphInSection( ) void DomainMapper::lcl_startShape( uno::Reference< drawing::XShape > xShape ) { + // If there is a deferred page break, handle it now, so that the + // started shape will be on the correct page. + if (m_pImpl->isBreakDeferred(PAGE_BREAK)) + { + m_pImpl->clearDeferredBreak(PAGE_BREAK); + lcl_startCharacterGroup(); + sal_uInt8 sBreak[] = { 0xd }; + lcl_text(sBreak, 1); + lcl_endCharacterGroup(); + lcl_endParagraphGroup(); + lcl_startParagraphGroup(); + m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, true, uno::makeAny( com::sun::star::style::BreakType_PAGE_BEFORE)); + } m_pImpl->PushShapeContext( xShape ); lcl_startParagraphGroup(); } diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 55ae9499d6ce..94a535fea675 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -648,6 +648,21 @@ bool DomainMapper_Impl::isBreakDeferred( BreakType deferredBreakType ) } } +void DomainMapper_Impl::clearDeferredBreak(BreakType deferredBreakType) +{ + switch (deferredBreakType) + { + case COLUMN_BREAK: + m_bIsColumnBreakDeferred = false; + break; + case PAGE_BREAK: + m_bIsPageBreakDeferred = false; + break; + default: + break; + } +} + void DomainMapper_Impl::clearDeferredBreaks() { m_bIsColumnBreakDeferred = false; diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 769636d9a8a8..8d513bba31ea 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -445,6 +445,7 @@ public: void deferBreak( BreakType deferredBreakType ); bool isBreakDeferred( BreakType deferredBreakType ); void clearDeferredBreaks(); + void clearDeferredBreak(BreakType deferredBreakType); void finishParagraph( PropertyMapPtr pPropertyMap ); void appendTextPortion( const OUString& rString, PropertyMapPtr pPropertyMap ); void appendTextContent( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent >, diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 0a2348d89311..15ff924a8930 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -245,6 +245,7 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x m_bFirstRun(true), m_bNeedPap(true), m_bNeedCr(false), + m_bNeedCrOrig(false), m_bNeedPar(true), m_bNeedFinalPar(false), m_aListTableSprms(), @@ -1289,6 +1290,7 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) m_aStates.top().nDestinationState = DESTINATION_SHAPEPROPERTYVALUE; break; case RTF_SHP: + m_bNeedCrOrig = m_bNeedCr; m_aStates.top().nDestinationState = DESTINATION_SHAPE; break; case RTF_SHPINST: @@ -1907,6 +1909,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) Mapper().text(sBreak, 1); if (!m_bNeedPap) parBreak(); + m_bNeedCr = true; } } break; @@ -4024,6 +4027,7 @@ int RTFDocumentImpl::popState() } break; case DESTINATION_SHAPE: + m_bNeedCr = m_bNeedCrOrig; if (m_aStates.top().aFrame.inFrame()) { m_aStates.top().resetFrame(); diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 0e0c4672c0d8..130b272e6c9b 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -528,6 +528,8 @@ namespace writerfilter { bool m_bNeedPap; /// If we need to emit a CR at the end of substream. bool m_bNeedCr; + /// Original value of m_bNeedCr -- saved/restored before/after textframes. + bool m_bNeedCrOrig; bool m_bNeedPar; /// If set, an empty paragraph will be added at the end of the document. bool m_bNeedFinalPar; |