sw/qa/extras/ooxmlimport/data/fdo55381.docx       |binary
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx          |    9 +++++++++
 writerfilter/source/dmapper/DomainMapper.cxx      |   12 ++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   19 ++++++++++++-------
 4 files changed, 33 insertions(+), 7 deletions(-)

New commits:
commit c04cf57bdb99f9aa961a739f5ab62e3ece83449f
Author: Luboš Luňák <l.lu...@collabora.com>
Date:   Mon Apr 21 19:10:37 2014 +0200

    handle properly page breaks even if a page contains only a frame (fdo#55381)
    
    The test document has 4 pages which only contain frames, first 3 pages
    (sections) have <p> block with <framePr> and another <p> with just <sectPr>,
    and the second paragraph would be removed, thus there would be no nodes on 
which
    to actually set the page style and they would be set on nodes for the 
previous
    page, overwriting its page style. The last page does not have its own <p>
    at all, so it needs to be faked.
    
    The changes in finishParagraph() are because of e.g. the comments-nested.odt
    sw test, which there causes exception because of unknown property 
ParaStyleName
    (comments do not use those it seems) and the code is skipped over (which
    is probably a bug on its own, but it's unrelated to this change otherwise).
    
    Change-Id: I9d37f992407a9b649c710d2a031ec4447fb11771
    Reviewed-on: https://gerrit.libreoffice.org/9115
    Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk>
    Tested-by: Miklos Vajna <vmik...@collabora.co.uk>

diff --git a/sw/qa/extras/ooxmlimport/data/fdo55381.docx 
b/sw/qa/extras/ooxmlimport/data/fdo55381.docx
new file mode 100644
index 0000000..ffeae1f
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/fdo55381.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx 
b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 1c8665b..6c2f3a7 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -1645,6 +1645,15 @@ DECLARE_OOXMLIMPORT_TEST(testStrictLockedcanvas, 
"strict-lockedcanvas.docx")
     getShape(1);
 }
 
+DECLARE_OOXMLIMPORT_TEST(testFdo55381, "fdo55381.docx")
+{
+    uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
+    uno::Reference<text::XTextViewCursorSupplier> 
xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
+    uno::Reference<text::XPageCursor> 
xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY);
+    xCursor->jumpToLastPage();
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(4), xCursor->getPage());
+}
+
 #endif
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index dbb16d0..c7625e3 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3643,6 +3643,18 @@ void DomainMapper::lcl_endSectionGroup()
 {
     m_pImpl->CheckUnregisteredFrameConversion();
     m_pImpl->ExecuteFrameConversion();
+    if(m_pImpl->GetIsFirstParagraphInSection())
+    {
+        // This section has no paragraph at all (e.g. they are all actually in 
a frame).
+        // If this section has a page break, there would be nothing to apply 
to the page
+        // style, so force a dummy paragraph.
+        lcl_startParagraphGroup();
+        lcl_startCharacterGroup();
+        sal_uInt8 sBreak[] = { 0xd };
+        lcl_text(sBreak, 1);
+        lcl_endCharacterGroup();
+        lcl_endParagraphGroup();
+    }
     PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_SECTION);
     SectionPropertyMap* pSectionContext = dynamic_cast< SectionPropertyMap* >( 
pContext.get() );
     OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 7fe53ae8..6591673 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1140,12 +1140,6 @@ void DomainMapper_Impl::finishParagraph( PropertyMapPtr 
pPropertyMap )
                 uno::Reference< text::XTextRange > xParaEnd( xCur, 
uno::UNO_QUERY );
                 CheckParaRedline( xParaEnd );
 
-                m_bIsFirstParaInSection = false;
-                m_bIsLastParaInSection = false;
-                m_bParaChanged = false;
-
-                // Reset the frame properties for the next paragraph
-                pParaContext->ResetFrameProperties();
             }
             if( !bKeepLastParagraphProperties )
                 rAppendContext.pLastParagraphProperties = pToBeSavedProperties;
@@ -1154,11 +1148,22 @@ void DomainMapper_Impl::finishParagraph( PropertyMapPtr 
pPropertyMap )
         {
             OSL_FAIL( "IllegalArgumentException in 
DomainMapper_Impl::finishParagraph" );
         }
-        catch(const uno::Exception&)
+        catch(const uno::Exception& e)
         {
+            SAL_WARN( "writerfilter", "finishParagraph() exception: " << 
e.Message );
         }
     }
 
+    m_bParaChanged = false;
+    if(!pParaContext->IsFrameMode())
+    { // If the paragraph is in a frame, it's not a paragraph of the section 
itself.
+        m_bIsFirstParaInSection = false;
+        m_bIsLastParaInSection = false;
+    }
+
+    // Reset the frame properties for the next paragraph
+    pParaContext->ResetFrameProperties();
+
 #ifdef DEBUG_DOMAINMAPPER
     dmapper_logger->endElement();
 #endif
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to