From b88da9b4302fa324f061a4a26ab4b2d647fdc765 Mon Sep 17 00:00:00 2001 From: Justin Luth Date: Mon, 27 Aug 2018 11:19:22 +0300 Subject: writerfilter: not FirstParaInSection if IsInShape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since anchored objects can contain paragraphs, considering all of them to be "firstParagraphs" would generally be considered an incorrect result. Browsing through the existing uses of IsFirstPara.*InSection I didn't see any that looked like it should be considered true if IsInShape. Since this is the kind of gotcha that that the programmer should be aware of, add it directly into the function instead of requiring each use to have an additional qualification. The following ooxml unit tests match these conditions, but only one was fixed - the rest were unaffected since they just avoided adding/removing dummy paragraphs. fdo79540.docx - 5 tblppr-shape.docx - 5 ooo47778-3.odt- 5 ooo47778-4.odt- 5 textbox-rounded-corners.docx - 7 n780563.docx - 8 missing-path.docx - 10 floating-tables-anchor.docx - 10 tdf117805.odt - 11 (fixed - prevented extra section paragraphs) Change-Id: I841475e214c194a673321c1229d9254dd07205f8 Reviewed-on: https://gerrit.libreoffice.org/59659 Tested-by: Jenkins Reviewed-by: László Németh --- sw/qa/extras/ooxmlexport/ooxmlexport11.cxx | 3 +++ writerfilter/source/dmapper/DomainMapper.cxx | 2 +- writerfilter/source/dmapper/DomainMapper_Impl.cxx | 7 +++++++ writerfilter/source/dmapper/DomainMapper_Impl.hxx | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx index 263959520851..e02d829b734f 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx @@ -271,6 +271,9 @@ DECLARE_OOXMLEXPORT_TEST(testTdf117805, "tdf117805.odt") // This failed, the header was lost. It's still referenced at an incorrect // location in document.xml, though. CPPUNIT_ASSERT(xNameAccess->hasByName("word/header1.xml")); + + uno::Reference textbox(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(8, getParagraphs(textbox)); } DECLARE_OOXMLEXPORT_TEST(testTdf113183, "tdf113183.docx") diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index cfd44ab53dd9..4b07d253eb21 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -656,7 +656,7 @@ void DomainMapper::lcl_attribute(Id nName, Value & val) else { // tdf#104354 first paragraphs of table cells and shapes get zero top margin - if ((m_pImpl->GetIsFirstParagraphInSection() && !m_pImpl->IsInShape() && m_pImpl->m_nTableDepth > 0) || + if ((m_pImpl->GetIsFirstParagraphInSection() && m_pImpl->m_nTableDepth > 0) || m_pImpl->GetIsFirstParagraphInShape()) default_spacing = 0; else diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 0091f40aff28..508e74e017ae 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -478,6 +478,13 @@ void DomainMapper_Impl::SetIsFirstParagraphInSection( bool bIsFirst ) m_bIsFirstParaInSection = bIsFirst; } +bool DomainMapper_Impl::GetIsFirstParagraphInSection() +{ + // Anchored objects may include multiple paragraphs, + // and none of them should be considered the first para in section. + return m_bIsFirstParaInSection && !IsInShape(); +} + void DomainMapper_Impl::SetIsFirstParagraphInShape(bool bIsFirst) { m_bIsFirstParaInShape = bIsFirst; diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 72a9b56da66e..342fa4d0f006 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -594,7 +594,7 @@ public: void SetIsLastSectionGroup( bool bIsLast ); bool GetIsLastSectionGroup() { return m_bIsLastSectionGroup;} void SetIsFirstParagraphInSection( bool bIsFirst ); - bool GetIsFirstParagraphInSection() { return m_bIsFirstParaInSection;} + bool GetIsFirstParagraphInSection(); void SetIsFirstParagraphInShape(bool bIsFirst); bool GetIsFirstParagraphInShape() { return m_bIsFirstParaInShape; } void SetIsDummyParaAddedForTableInSection( bool bIsAdded ); -- cgit v1.2.3