sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak3.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport18.cxx | 10 ++++++++ writerfilter/source/dmapper/DomainMapper.cxx | 5 +++- writerfilter/source/dmapper/DomainMapper_Impl.cxx | 12 ++++++++++ writerfilter/source/dmapper/DomainMapper_Impl.hxx | 3 ++ 5 files changed, 29 insertions(+), 1 deletion(-)
New commits: commit 828fde37632a5bb0542b6925454690a5287d6490 Author: Justin Luth <justin.l...@collabora.com> AuthorDate: Tue Mar 14 14:20:58 2023 -0400 Commit: Justin Luth <jl...@mail.com> CommitDate: Wed Mar 15 01:38:29 2023 +0000 tdf#153613 tdf#146984 writerfilter: split para after anchors Even though the w:br occurs in the paragraph before the anchors, the anchors stay on the first page, and don't move to the second page (unless it is the last paragraph in the section/document, which is not yet handled.) make CppunitTest_sw_ooxmlexport18 \ CPPUNIT_TEST_NAME=testTdf153613_textboxAfterPgBreak3 Change-Id: Icfc7e2a5d7657f1eb8f94263a4bfc8dcca7e52de Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148897 Tested-by: Jenkins Reviewed-by: Justin Luth <jl...@mail.com> diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak3.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak3.docx new file mode 100644 index 000000000000..a282deaa0ad7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak3.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx index 460f4098e837..c30e555ae15e 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx @@ -217,6 +217,16 @@ DECLARE_OOXMLEXPORT_TEST(testTdf153613_textboxAfterPgBreak2, "tdf153613_textboxA assertXPathContent(pLayout, "//page[2]/body/txt", "There should be no prior carriage return."); } +DECLARE_OOXMLEXPORT_TEST(testTdf153613_textboxAfterPgBreak3, "tdf153613_textboxAfterPgBreak3.docx") +{ + // All anchored TO-character shapes stay on the first page, before the page break. + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL(3, getParagraphs()); + + const auto& pLayout = parseLayoutDump(); + assertXPath(pLayout, "//page[2]//anchored", 0); +} + DECLARE_OOXMLEXPORT_TEST(testTdf153613_sdtAfterPgBreak, "tdf153613_sdtAfterPgBreak.docx") { CPPUNIT_ASSERT_EQUAL(2, getPages()); diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index c526968fc8c0..800ae2525060 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -3635,7 +3635,7 @@ void DomainMapper::lcl_startShape(uno::Reference<drawing::XShape> const& 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)) + if (m_pImpl->isBreakDeferred(PAGE_BREAK) && !m_pImpl->IsBreakDeferredByAnchor()) { // RTF doesn't properly report IsFirstRun, so in order to prevent regressions // always split the paragraph for RTF since that is the way it has been done lately. @@ -3645,6 +3645,9 @@ void DomainMapper::lcl_startShape(uno::Reference<drawing::XShape> const& xShape) finishParagraph(); lcl_startParagraphGroup(); } + else + m_pImpl->SetIsBreakDeferredByAnchor(); + } m_pImpl->PushShapeContext( xShape ); lcl_startParagraphGroup(); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 62dda7d02ac2..f33d3c390afb 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -1477,6 +1477,7 @@ void DomainMapper_Impl::clearDeferredBreak(BreakType deferredBreakType) break; case PAGE_BREAK: m_bIsPageBreakDeferred = false; + m_bIsBreakDeferredByAnchor = false; break; default: break; @@ -1488,6 +1489,17 @@ void DomainMapper_Impl::clearDeferredBreaks() m_nLineBreaksDeferred = 0; m_bIsColumnBreakDeferred = false; m_bIsPageBreakDeferred = false; + m_bIsBreakDeferredByAnchor = false; +} + +bool DomainMapper_Impl::IsBreakDeferredByAnchor() +{ + return m_bIsBreakDeferredByAnchor; +} + +void DomainMapper_Impl::SetIsBreakDeferredByAnchor() +{ + m_bIsBreakDeferredByAnchor = true; } void DomainMapper_Impl::setSdtEndDeferred(bool bSdtEndDeferred) diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 234ae9416eb1..050a510353a8 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -487,6 +487,7 @@ private: bool m_bIsColumnBreakDeferred; bool m_bIsPageBreakDeferred; sal_Int32 m_nLineBreaksDeferred; + bool m_bIsBreakDeferredByAnchor; /// If we want to set "sdt end" on the next character context. bool m_bSdtEndDeferred; /// If we want to set "paragraph sdt end" on the next paragraph context. @@ -755,6 +756,8 @@ public: bool isBreakDeferred( BreakType deferredBreakType ); void clearDeferredBreaks(); void clearDeferredBreak(BreakType deferredBreakType); + bool IsBreakDeferredByAnchor(); + void SetIsBreakDeferredByAnchor(); void setSdtEndDeferred(bool bSdtEndDeferred); bool isSdtEndDeferred() const;