diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2022-02-25 13:43:56 +0100 |
---|---|---|
committer | Michael Stahl <michael.stahl@allotropia.de> | 2022-03-01 19:10:14 +0100 |
commit | 913673a06043dba29d19b9c942cc46a439b53291 (patch) | |
tree | bd0695a3e447aa1ec58078e659c53ff0820927c0 | |
parent | Try to fix .bau files being ignored (diff) | |
download | core-913673a06043dba29d19b9c942cc46a439b53291.tar.gz core-913673a06043dba29d19b9c942cc46a439b53291.zip |
tdf#143239 sw: layout: invalidate fly position when moving off page
It's possible that flags on the fly are all valid when it is moved off page
when SwLayAction::FormatContent() returns and then it may not be positioned
again, keeping its (wrong) position on the old page and will appear to be
invisible unless you click on it.
(regression from commits c799de145f7e289f31e3669646e5bd12814e6c5e
and eb85de8e6b61fb3fcb6c03ae0145f7fe5478bccf)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130535
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
(cherry picked from commit b14bb255199e7d6db6ec9155b5d9237cb35fdba7)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130548
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
(cherry picked from commit 2bed04d49fda2e2005699b3ef884c5295e56d8ca)
Change-Id: If07d5af7b47eb288bef71d1b9e3459197b50fdc9
-rw-r--r-- | sw/qa/extras/layout/data/tdf143239-1-min.odt | bin | 0 -> 20308 bytes | |||
-rw-r--r-- | sw/qa/extras/layout/layout.cxx | 66 | ||||
-rw-r--r-- | sw/source/core/layout/layact.cxx | 3 |
3 files changed, 69 insertions, 0 deletions
diff --git a/sw/qa/extras/layout/data/tdf143239-1-min.odt b/sw/qa/extras/layout/data/tdf143239-1-min.odt Binary files differnew file mode 100644 index 000000000000..4271bfba775b --- /dev/null +++ b/sw/qa/extras/layout/data/tdf143239-1-min.odt diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index 8f6ca8a92580..d7b936aa89e8 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -1197,6 +1197,72 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf138039) assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored", 0); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf143239) +{ + SwDoc* pDoc = createDoc("tdf143239-1-min.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + { + xmlDocPtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds", "top", + "18540"); +#ifndef MACOSX + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds", "left", + "3559"); +#endif + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds", "top", + "23894"); +#ifndef MACOSX + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds", "left", + "1964"); +#endif + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds", "top", + "35662"); +#ifndef MACOSX + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds", "left", + "3129"); +#endif + assertXPath(pXmlDoc, "/root/page", 3); + discardDumpedLayout(); + } + + pWrtShell->SelAll(); + pWrtShell->Delete(); + pWrtShell->Undo(); + Scheduler::ProcessEventsToIdle(); + + { + xmlDocPtr pXmlDoc = parseLayoutDump(); + // now the 1st fly was on page 1, and the fly on page 2 was the 2nd one + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds", "top", + "18540"); +#ifndef MACOSX + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds", "left", + "3559"); +#endif + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds", "top", + "23894"); +#ifndef MACOSX + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds", "left", + "1964"); +#endif + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds", "top", + "35662"); +#ifndef MACOSX + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds", "left", + "3129"); +#endif + assertXPath(pXmlDoc, "/root/page", 3); + discardDumpedLayout(); + } +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTableOverlapFooterFly) { // Load a document that has a fly anchored in the footer. diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx index d5efa7680fd6..6a2fd2046ffb 100644 --- a/sw/source/core/layout/layact.cxx +++ b/sw/source/core/layout/layact.cxx @@ -1615,6 +1615,9 @@ bool SwLayAction::FormatContent(SwPageFrame *const pPage) { SAL_INFO("sw.layout", "SwLayAction::FormatContent: move anchored " << pObj << " from " << pPage->GetPhyPageNum() << " to " << pAnchorPage->GetPhyPageNum()); pObj->RegisterAtPage(*pAnchorPage); + // tdf#143239 if the position remains valid, it may not be + // positioned again so would remain on the wrong page! + pObj->InvalidateObjPos(); ::Notify_Background(pObj->GetDrawObj(), pPage, pObj->GetObjRect(), PREP_FLY_LEAVE, false); } |