summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2014-04-21 19:10:37 +0200
committerLuboš Luňák <l.lunak@collabora.com>2014-04-21 19:22:39 +0200
commitb3121861deef3f3cb63693d20cca532d9543a8f0 (patch)
tree9d3e5fa2987662db779316d92276322a6dfd2459
parent040b2ad8a671f4a9ca024de6cd86157a29713d47 (diff)
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
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx12
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx19
2 files changed, 24 insertions, 7 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index f51a026a4e64..915c7cb8ff41 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3469,6 +3469,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 a696e12df0c5..3bc727da3693 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1155,12 +1155,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;
@@ -1169,11 +1163,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