sw/inc/undobj.hxx | 2 - sw/qa/core/doc/doc.cxx | 30 ++++++++++++++++++++++++++ sw/source/core/doc/DocumentRedlineManager.cxx | 4 +-- sw/source/core/inc/UndoRedline.hxx | 3 +- 4 files changed, 35 insertions(+), 4 deletions(-)
New commits: commit 4723425d8b9076fee8eecc8feba0c70922fc1fa9 Author: Miklos Vajna <[email protected]> AuthorDate: Mon Jun 23 11:47:49 2025 +0200 Commit: Caolán McNamara <[email protected]> CommitDate: Mon Jun 23 15:03:34 2025 +0200 tdf#166319 sw interdependent redlines: fix bad accept undo action for reject See <https://gerrit.libreoffice.org/c/core/+/186646/2#message-86a47ee78fb9a0c6d4a8e355a06c5c6931d66f6b>, a reject UI action resulted in an accept undo action, which was inconsistent. I added this in commit 8b5435d6e49c3d0237bc4a13ff5253dcb1c915f7 (tdf#166319 sw interdependent redlines: fix undo of del on top of ins, 2025-04-25), at that time SwUndoRejectRedline had no way to store hierarchical redlines. Fix the problem by asking for a hierarhical copy using the API added in commit 5f4ed6e34d71b578f5facef04d3a0ae2df81531b (tdf#166319 sw interdependent redlines: fix undo of reject of ins-then-del's del, 2025-06-11): this way we don't need to create a fake accept undo action & the "underlying" redline data won't be lost, either. Change-Id: I92201881fb67e3eca95a805b6a0da3a166a863fe Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186818 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Caolán McNamara <[email protected]> diff --git a/sw/inc/undobj.hxx b/sw/inc/undobj.hxx index 7fb61309ec29..b0b6dee89246 100644 --- a/sw/inc/undobj.hxx +++ b/sw/inc/undobj.hxx @@ -50,7 +50,7 @@ namespace sw { class RepeatContext; } -class SwUndo +class SW_DLLPUBLIC SwUndo : public SfxUndoAction { SwUndoId const m_nId; diff --git a/sw/qa/core/doc/doc.cxx b/sw/qa/core/doc/doc.cxx index fc0772e08d1d..ba2520d4054e 100644 --- a/sw/qa/core/doc/doc.cxx +++ b/sw/qa/core/doc/doc.cxx @@ -43,6 +43,7 @@ #include <sortedobjs.hxx> #include <itabenum.hxx> #include <redline.hxx> +#include <UndoRedline.hxx> /// Covers sw/source/core/doc/ fixes. class SwCoreDocTest : public SwModelTestBase @@ -774,6 +775,35 @@ CPPUNIT_TEST_FIXTURE(SwCoreDocTest, testInsThenDelRejectUndo) const SwRedlineData& rInnerRedlineData = *rRedlineData1.Next(); CPPUNIT_ASSERT_EQUAL(RedlineType::Insert, rInnerRedlineData.GetType()); CPPUNIT_ASSERT_EQUAL(RedlineType::Insert, rRedlines[2]->GetType()); + + // And when rejecting the "ins" part of ins-then-del: + pWrtShell->RejectRedline(0); + + // Then make sure "reject" (and no accept) was created on the undo stack: + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + int nAccepts = 0; + auto pListUndoAction = dynamic_cast<SfxListUndoAction*>(rUndoManager.GetUndoAction()); + if (pListUndoAction) + { + for (const auto& rMarkedAction : pListUndoAction->maUndoActions) + { + auto pUndo = dynamic_cast<SwUndoRedline*>(rMarkedAction.pAction.get()); + if (!pUndo) + { + continue; + } + + if (pUndo->GetUserId() == SwUndoId::ACCEPT_REDLINE) + { + ++nAccepts; + } + } + } + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. an "accept" undo action was created by RejectRedline(). + CPPUNIT_ASSERT_EQUAL(0, nAccepts); } CPPUNIT_TEST_FIXTURE(SwCoreDocTest, testInsThenFormat) diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx index 3ae851126f8b..a02f5b947a57 100644 --- a/sw/source/core/doc/DocumentRedlineManager.cxx +++ b/sw/source/core/doc/DocumentRedlineManager.cxx @@ -3713,13 +3713,13 @@ bool DocumentRedlineManager::RejectRedlineRange(SwRedlineTable::size_type nPosOr std::unique_ptr<SwUndoRedline> pUndoRdl; if (eInnerType == RedlineType::Delete && eOuterType == RedlineType::Format) { - // Format on insert: record rejection of the underlying insert. + // Format on delete: record rejection of the underlying delete. pUndoRdl = std::make_unique<SwUndoRejectRedline>(*pTmp, /*nDepth=*/1, /*bHierarchical=*/true); } else { // The Insert/Delete redline we want to reject has an other type of redline too - pUndoRdl = std::make_unique<SwUndoAcceptRedline>(*pTmp); + pUndoRdl = std::make_unique<SwUndoRejectRedline>(*pTmp, /*nDepth=*/0, /*bHierarchical=*/true); } #if OSL_DEBUG_LEVEL > 0 pUndoRdl->SetRedlineCountDontCheck(true); diff --git a/sw/source/core/inc/UndoRedline.hxx b/sw/source/core/inc/UndoRedline.hxx index 1e1033d319d5..4a7a707c8516 100644 --- a/sw/source/core/inc/UndoRedline.hxx +++ b/sw/source/core/inc/UndoRedline.hxx @@ -29,7 +29,7 @@ class SwRangeRedline; class SwRedlineSaveDatas; class SwUndoDelete; -class SwUndoRedline : public SwUndo, public SwUndRng +class SW_DLLPUBLIC SwUndoRedline : public SwUndo, public SwUndRng { protected: std::unique_ptr<SwRedlineData> mpRedlData; @@ -55,6 +55,7 @@ public: #if OSL_DEBUG_LEVEL > 0 void SetRedlineCountDontCheck(bool bCheck); #endif + SwUndoId GetUserId() const { return mnUserId; } void dumpAsXml(xmlTextWriterPtr pWriter) const override; };
