sw/qa/extras/uiwriter/uiwriter.cxx | 51 +
sw/source/core/txtnode/ndtxt.cxx |5 +++
2 files changed, 56 insertions(+)
New commits:
commit 5706653d0eb1dff015712181a1e27a0785376200
Author: Michael Stahl
AuthorDate: Fri Apr 22 19:26:47 2022 +0200
Commit: Christian Lohmaier
CommitDate: Wed Apr 27 12:41:20 2022 +0200
tdf#135978 sw_redlinehide: recreate fly frames anchored to subsequent nodes
... in SwTextNode::JoinNext().
The 2nd node is deleted, so its frame is deleted, and if it is the start
of a merged frame, fly frames on the node itself will be recreated
already, but those on subseqent nodes need an extra call.
Change-Id: I1846334f5560b720d3d275610bc8b07973f6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/15
Tested-by: Jenkins
Reviewed-by: Michael Stahl
(cherry picked from commit 98ae340307786c8fe18addc3714c9b859fdf12dd)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133371
Reviewed-by: Caolán McNamara
(cherry picked from commit f4740811b65076d9a84c098f466a02143fcfec06)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133397
Reviewed-by: Xisco Fauli
Reviewed-by: Thorsten Behrens
Reviewed-by: Christian Lohmaier
Tested-by: Christian Lohmaier
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx
b/sw/qa/extras/uiwriter/uiwriter.cxx
index 1e6f8be07b06..d38c33364803 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -693,6 +693,57 @@ void SwUiWriterTest::testTdf67238()
CPPUNIT_ASSERT(!((rTable.GetTableBox("C3"))->GetFrameFormat()->GetProtect()).IsContentProtected());
}
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, testTdf135978)
+{
+SwDoc* pDoc = createSwDoc();
+SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+
+pWrtShell->Insert("foobar");
+pWrtShell->SplitNode();
+pWrtShell->Insert("bazquux");
+
+CPPUNIT_ASSERT(pWrtShell->IsEndOfDoc());
+
+SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR);
+anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint());
+SfxItemSet flySet(pDoc->GetAttrPool(), svl::Items);
+flySet.Put(anchor);
+SwFlyFrameFormat const* pFly = dynamic_cast(
+pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true));
+CPPUNIT_ASSERT(pFly != nullptr);
+CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+// move cursor back to body
+pWrtShell->SttEndDoc(/*bStt=*/false);
+
+// hide and enable
+dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {});
+dispatchCommand(mxComponent, ".uno:TrackChanges", {});
+
+CPPUNIT_ASSERT(pDoc->getIDocumentRedlineAccess().IsRedlineOn());
+CPPUNIT_ASSERT(
+
IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
+CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines());
+
+pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 4,
/*bBasicCall=*/false);
+pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 6,
/*bBasicCall=*/false);
+pWrtShell->Delete();
+
+// now split
+pWrtShell->SttEndDoc(/*bStt=*/true);
+pWrtShell->SplitNode();
+CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+
+// the problem was that undo removed the fly frame from the layout
+pWrtShell->Undo();
+CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+
+pWrtShell->Redo();
+CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+
+pWrtShell->Undo();
+CPPUNIT_ASSERT(pFly->GetFrame() != nullptr);
+}
+
void SwUiWriterTest::testFdo75110()
{
SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "fdo75110.odt");
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 4d109a8add1c..5c8a501386fa 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -884,6 +884,11 @@ void CheckResetRedlineMergeFlag(SwTextNode & rNode,
Recreate const eRecreateMerg
{
assert(pFrame->GetMergedPara()->listener.IsListeningTo(&rNode));
assert(rNode.GetIndex() <=
pFrame->GetMergedPara()->pLastNode->GetIndex());
+// tdf#135978 Join: recreate fly frames anchored to subsequent
nodes
+if (eRecreateMerged == sw::Recreate::ThisNode)
+{
+AddRemoveFlysAnchoredToFrameStartingAtNode(*pFrame, rNode,
nullptr);
+}
}
eMode = sw::FrameMode::New; // Existing is not idempotent!
}