sw/qa/core/layout/flycnt.cxx | 42 +++++++++++++++++++++++++++++++++++++++ sw/source/core/layout/flycnt.cxx | 7 ++++++ 2 files changed, 49 insertions(+)
New commits: commit 272c3548c4d2362eb737947c8cbb017e2d55aae1 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Mon Nov 27 08:36:37 2023 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Mon Nov 27 10:35:15 2023 +0100 sw floattable, per-frame wrap-on-all-pages mode: add layout The anchor text of a floating table is normally wrapped around the table only on the last page of the table. This property requests to wrap on all pages instead for this frame. Commit 7d7ca347fafa7a06094b00e8fb0d0452c4c81366 (sw floattable, wrap on all pages: add layout, 2023-10-13) already arranged the layout code to go via the per-frame SwFlyAtContentFrame::IsWrapOnAllPages(), so only that needs updating. Instead of always deciding this at a per-doc level, first check if the frame itself requests the on-all-pages behavior. Otherwise keep deciding this on a per-doc level. This is meant to please what the OASIS/ODT proposal wants and also keeps the Word-style per-doc setting. The ODT filter still needs doing. Change-Id: Ibf10b5f016d70e6fe948d5273cc1fb1d98495586 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159981 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins diff --git a/sw/qa/core/layout/flycnt.cxx b/sw/qa/core/layout/flycnt.cxx index 6c508a5f87e7..6b84ca3fb16d 100644 --- a/sw/qa/core/layout/flycnt.cxx +++ b/sw/qa/core/layout/flycnt.cxx @@ -31,6 +31,7 @@ #include <ndtxt.hxx> #include <dflyobj.hxx> #include <IDocumentSettingAccess.hxx> +#include <formatwraptextatflystart.hxx> namespace { @@ -1221,6 +1222,47 @@ CPPUNIT_TEST_FIXTURE(Test, testSplitFlyWrapOnAllPages) CPPUNIT_ASSERT(!pPage2Anchor->GetFollow()); CPPUNIT_ASSERT_EQUAL(OUString("didn't bode well."), aAnchor2Text); } + +CPPUNIT_TEST_FIXTURE(Test, testSplitFlyPerFrameWrapOnAllPages) +{ + // Given a document where we want to wrap on all pages, around a split floating table: + createSwDoc("floattable-wrap-on-all-pages.docx"); + SwDoc* pDoc = getSwDoc(); + sw::SpzFrameFormats& rFlys = *pDoc->GetSpzFrameFormats(); + sw::SpzFrameFormat* pFly = rFlys[0]; + SfxItemSet aSet(pFly->GetAttrSet()); + SwFormatWrapTextAtFlyStart aItem(true); + aSet.Put(aItem); + pDoc->SetFlyFrameAttr(*pFly, aSet); + + // When formatting that document: + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + pWrtShell->Reformat(); + + // Then make sure that the anchor text is also split between page 1 and page 2: + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage1 = pLayout->Lower()->DynCastPageFrame(); + CPPUNIT_ASSERT(pPage1); + auto pPage1Anchor = pPage1->FindLastBodyContent()->DynCastTextFrame(); + CPPUNIT_ASSERT(pPage1Anchor); + OUString aAnchor1Text(pPage1Anchor->GetText().subView( + static_cast<sal_Int32>(pPage1Anchor->GetOffset()), + static_cast<sal_Int32>(pPage1Anchor->GetFollow()->GetOffset() + - pPage1Anchor->GetOffset()))); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: He heard quiet steps behind him. That + // - Actual : + // i.e. the first page had no anchor text, only the second. + CPPUNIT_ASSERT_EQUAL(OUString("He heard quiet steps behind him. That "), aAnchor1Text); + auto pPage2 = pPage1->GetNext()->DynCastPageFrame(); + CPPUNIT_ASSERT(pPage2); + auto pPage2Anchor = pPage2->FindLastBodyContent()->DynCastTextFrame(); + CPPUNIT_ASSERT(pPage2Anchor); + OUString aAnchor2Text( + pPage2Anchor->GetText().subView(static_cast<sal_Int32>(pPage2Anchor->GetOffset()))); + CPPUNIT_ASSERT(!pPage2Anchor->GetFollow()); + CPPUNIT_ASSERT_EQUAL(OUString("didn't bode well."), aAnchor2Text); +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/layout/flycnt.cxx b/sw/source/core/layout/flycnt.cxx index c07201f49f43..a53b8841f84a 100644 --- a/sw/source/core/layout/flycnt.cxx +++ b/sw/source/core/layout/flycnt.cxx @@ -52,6 +52,7 @@ #include <unoprnms.hxx> #include <rootfrm.hxx> #include <bodyfrm.hxx> +#include <formatwraptextatflystart.hxx> using namespace ::com::sun::star; @@ -1786,6 +1787,12 @@ void SwFlyAtContentFrame::DelEmpty() bool SwFlyAtContentFrame::IsWrapOnAllPages() const { + const SwFormatWrapTextAtFlyStart& rWrapTextAtFlyStart = GetFormat()->GetWrapTextAtFlyStart(); + if (rWrapTextAtFlyStart.GetValue()) + { + return true; + } + const SwRootFrame* pRootFrame = getRootFrame(); if (!pRootFrame) {