writerfilter/source/dmapper/DomainMapper.cxx      |   13 +++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   15 +++++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |    1 +
 writerfilter/source/rtftok/rtfdocumentimpl.cxx    |   21 ++++++++++++++-------
 writerfilter/source/rtftok/rtfdocumentimpl.hxx    |    2 ++
 5 files changed, 45 insertions(+), 7 deletions(-)

New commits:
commit 131b66fb2d30bd5501d233284061c9f9c14def22
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Tue May 21 14:56:45 2013 +0200

    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

diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index 1a33f6e..58cbb4d 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 1b9fdca..827b72a 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 a8dec58..5fa3f42 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 445f62e..a89b3c0 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 5e88ef8..5a4b519 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;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to