sw/qa/uitest/data/accept-all-overlap.docx |binary sw/qa/uitest/writer_tests/trackedChanges.py | 17 +++++++++++++++++ sw/source/uibase/misc/redlndlg.cxx | 9 +++++++-- 3 files changed, 24 insertions(+), 2 deletions(-)
New commits: commit 874d2fc70bd9e90259f2e1119577a9339b7fc457 Author: Miklos Vajna <[email protected]> AuthorDate: Thu Dec 11 08:27:09 2025 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Fri Dec 12 12:07:50 2025 +0100 tdf#168737 sw interdependent redlines, direct: fix accept-all from dialog Open the bugdoc, open the manage changes dialog, accept all changes by clicking on the "accept all" button, not all changes are accepted. This went wrong in commit 55640f9f0a4741f8e4b5b98096af822cee71da2c (tdf#166319 sw interdependent redlines: allow accept/reject for fmt on ins/del, 2025-09-29), which made it possible to only accept the directly selectable part of a hierarchical redline (e.g. only the format of a format-on-insert construct). Notice how clicking on the "accept all" toolbar button works fine, since it doesn't enable the "direct" mode. Fix the problem by extending SwRedlineAcceptDlg::CallAcceptReject(), so it keeps asking Writer core to accept/reject changes directly when one or more redline is selected, but go back to the default non-direct mode when accepting or rejecting all redlines. Cover this with a UI test, since the problem here is not around how these redlines are rejected, but it's about how UI code invokes performs these operations using SwWrtShell. Change-Id: I8024d352b1512bd8d5c608087b684502624fd0a6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195511 Tested-by: Jenkins Reviewed-by: Miklos Vajna <[email protected]> diff --git a/sw/qa/uitest/data/accept-all-overlap.docx b/sw/qa/uitest/data/accept-all-overlap.docx new file mode 100644 index 000000000000..851d3b7edc2d Binary files /dev/null and b/sw/qa/uitest/data/accept-all-overlap.docx differ diff --git a/sw/qa/uitest/writer_tests/trackedChanges.py b/sw/qa/uitest/writer_tests/trackedChanges.py index 1e21a3a703ff..967d2d401499 100644 --- a/sw/qa/uitest/writer_tests/trackedChanges.py +++ b/sw/qa/uitest/writer_tests/trackedChanges.py @@ -608,6 +608,23 @@ class trackedchanges(UITestCase): self.assertEqual(0, len(changesList.getChildren())) + def test_accept_all_deletes_all_redlines(self): + # Given a document with overlapping changes: + with self.ui_test.load_file(get_url_for_data_file("accept-all-overlap.docx")) as document: + xWriterDoc = self.xUITest.getTopFocusWindow() + xWriterEdit = xWriterDoc.getChild("writer_edit") + + # When accepting all changes using the manage changes dialog: + with self.ui_test.execute_modeless_dialog_through_command(".uno:AcceptTrackedChanges", close_button="close") as xTrackDlg: + xAccBtn = xTrackDlg.getChild("acceptall") + xAccBtn.executeAction("CLICK", tuple()) + + # Then make sure all changes are accepted: + # Without the accompanying fix in place, this failed with: + # AssertionError: 1 != 0 + # i.e. a change was not accepted. + self.assertEqual(document.Redlines.Count, 0) + def test_tdf155847_multiple_tracked_columns_crash(self): with self.ui_test.load_file(get_url_for_data_file("TC-table-del-add.docx")) as document: diff --git a/sw/source/uibase/misc/redlndlg.cxx b/sw/source/uibase/misc/redlndlg.cxx index 4e5609886585..afdad416adec 100644 --- a/sw/source/uibase/misc/redlndlg.cxx +++ b/sw/source/uibase/misc/redlndlg.cxx @@ -1193,8 +1193,13 @@ void SwRedlineAcceptDlg::CallAcceptReject( bool bSelect, bool bAccept ) for (const auto& rRedLine : aRedlines) { SwRedlineTable::size_type nPosition = GetRedlinePos( *rRedLine ); + + // bSelect is false for "accept/reject all", true when only accepting/rejecting one or more + // selected changes. Only use direct accept/reject for explicitly selected changes. + bool bDirect = bSelect; + if( nPosition != SwRedlineTable::npos ) - (pSh->*FnAccRej)( nPosition, /*bDirect=*/true ); + (pSh->*FnAccRej)( nPosition, bDirect ); // handle redlines of table rows, stored as children of the item associated // to the deleted/inserted table row(s) @@ -1209,7 +1214,7 @@ void SwRedlineAcceptDlg::CallAcceptReject( bool bSelect, bool bAccept ) { nPosition = GetRedlinePos( *xChild ); if( nPosition != SwRedlineTable::npos ) - (pSh->*FnAccRej)( nPosition, /*bDirect=*/true ); + (pSh->*FnAccRej)( nPosition, bDirect ); } while ( rTreeView.iter_next_sibling(*xChild) ); }
