summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-05-21 14:56:45 +0200
committerMiklos Vajna <vmiklos@suse.cz>2013-05-21 18:05:01 +0200
commit131b66fb2d30bd5501d233284061c9f9c14def22 (patch)
tree94b4a5a3ada98392bf6110a80e21a4b0398ec772
parent3ac737503d44d16a2519342893ef40cbc18acf23 (diff)
bnc#818997 RTF import: don't ignore page breaks between shapes
(cherry picked from commit b40fe8e5a5037d2745cc7b1c9cc408ce6c79b9d9) Conflicts: sw/qa/extras/rtfimport/rtfimport.cxx writerfilter/source/dmapper/DomainMapper.cxx writerfilter/source/rtftok/rtfdocumentimpl.cxx Change-Id: Ief71ba9a3c60356714e73d08e88d0a3105b17b1a
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx13
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx15
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx1
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx21
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx2
5 files changed, 45 insertions, 7 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 1a33f6e8fa04..58cbb4d4d048 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3524,6 +3524,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 1b9fdca6047c..827b72a4ed81 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -661,6 +661,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 a8dec58fce46..5fa3f42dcb8b 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -435,6 +435,7 @@ public:
void deferBreak( BreakType deferredBreakType );
bool isBreakDeferred( BreakType deferredBreakType );
void clearDeferredBreaks();
+ void clearDeferredBreak(BreakType deferredBreakType);
void finishParagraph( PropertyMapPtr pPropertyMap );
void appendTextPortion( const ::rtl::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 445f62e4ccfb..a89b3c0804f1 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -250,6 +250,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(),
@@ -1215,6 +1216,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:
@@ -1667,6 +1669,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
Mapper().text(sBreak, 1);
if (!m_bNeedPap)
parBreak();
+ m_bNeedCr = true;
}
}
break;
@@ -3547,14 +3550,18 @@ int RTFDocumentImpl::popState()
Mapper().startShape(xShape);
Mapper().endShape();
}
- else if (m_aStates.top().nDestinationState == DESTINATION_SHAPE && m_aStates.top().aFrame.inFrame())
+ else if (m_aStates.top().nDestinationState == DESTINATION_SHAPE)
{
- m_aStates.top().resetFrame();
- parBreak();
- // Save this state for later use, so we only reset frame status only for the first shape inside a frame.
- aState = m_aStates.top();
- bPopFrame = true;
- m_bNeedPap = true;
+ m_bNeedCr = m_bNeedCrOrig;
+ if (m_aStates.top().aFrame.inFrame())
+ {
+ m_aStates.top().resetFrame();
+ parBreak();
+ // Save this state for later use, so we only reset frame status only for the first shape inside a frame.
+ aState = m_aStates.top();
+ bPopFrame = true;
+ m_bNeedPap = true;
+ }
}
// See if we need to end a track change
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index 5e88ef84d212..5a4b519e9e31 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -452,6 +452,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;