From a859ff2db69457cc98c257d377f68c8786c50fa2 Mon Sep 17 00:00:00 2001 From: Luboš Luňák Date: Mon, 21 Apr 2014 19:10:37 +0200 Subject: 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

block with and another

with just , 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

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 --- sw/qa/extras/ooxmlimport/data/fdo55381.docx | Bin 0 -> 4710 bytes 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(-) create mode 100644 sw/qa/extras/ooxmlimport/data/fdo55381.docx diff --git a/sw/qa/extras/ooxmlimport/data/fdo55381.docx b/sw/qa/extras/ooxmlimport/data/fdo55381.docx new file mode 100644 index 000000000000..ffeae1f874eb 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 1c8665b7a480..6c2f3a725bca 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 xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference 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 dbb16d0b8427..c7625e35033b 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 7fe53ae8c9a9..65916731df98 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 -- cgit v1.2.3