sw/qa/uitest/writer_tests/trackedChanges.py | 2 sw/source/uibase/misc/redlndlg.cxx | 71 ++++++++++++++++++---------- 2 files changed, 48 insertions(+), 25 deletions(-)
New commits: commit 863b90e33c4b9964a697684887aeb42cc538b019 Author: Jim Raykowski <[email protected]> AuthorDate: Sun Jul 21 09:44:57 2024 -0800 Commit: Jim Raykowski <[email protected]> CommitDate: Tue Jul 23 18:11:28 2024 +0200 Resolves tdf#162018 Unexpected loss in focus in the "Manage Changes" window when adding a change in the document (Track changes mode), round 3 Done to address loss of selection when an entry is added to the beginning of the changes list. The patch reworks round 1 and 2 to handle any entry insert position. It also keeps the selected entry selected after a sort by document order. Change-Id: Icb6f6b6b80ad9ddc5d008a00d195ceb7c1d6dc3f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170828 Tested-by: Jenkins Reviewed-by: Jim Raykowski <[email protected]> diff --git a/sw/qa/uitest/writer_tests/trackedChanges.py b/sw/qa/uitest/writer_tests/trackedChanges.py index 93b2374ed820..d013be0343e3 100644 --- a/sw/qa/uitest/writer_tests/trackedChanges.py +++ b/sw/qa/uitest/writer_tests/trackedChanges.py @@ -289,6 +289,8 @@ class trackedchanges(UITestCase): # Now: 4 changes (2 deleted/inserted rows and 2 deleted/inserted tables) self.assertEqual(4, len(changesList.getChildren())) + changesList.getChild(0).executeAction("SELECT", tuple()) + # jump to the parent to allow rejecting the table change changesList.executeAction("TYPE", mkPropertyValues({"KEYCODE": "LEFT"})) diff --git a/sw/source/uibase/misc/redlndlg.cxx b/sw/source/uibase/misc/redlndlg.cxx index 5bbac52db74d..3c66afd1a2e1 100644 --- a/sw/source/uibase/misc/redlndlg.cxx +++ b/sw/source/uibase/misc/redlndlg.cxx @@ -144,6 +144,48 @@ SwModelessRedlineAcceptDlg::~SwModelessRedlineAcceptDlg() mbInDestruction = true; } +namespace +{ +const SwRedlineData* lcl_get_selected_redlinedata(weld::TreeView& rTreeView) +{ + std::unique_ptr<weld::TreeIter> xEntry(rTreeView.make_iterator()); + if (rTreeView.get_selected(xEntry.get())) + { + RedlinData* pRedlinData = weld::fromId<RedlinData*>(rTreeView.get_id(*xEntry)); + if (rTreeView.get_iter_depth(*xEntry)) + return static_cast<SwRedlineDataChild*>(pRedlinData->pData)->pChild; + else + return static_cast<SwRedlineDataParent*>(pRedlinData->pData)->pData; + } + return nullptr; +} + +void lcl_reselect(weld::TreeView& rTreeView, const SwRedlineData* pSelectedEntryRedlineData) +{ + if (!pSelectedEntryRedlineData) + { + rTreeView.set_cursor(-1); + return; + } + rTreeView.all_foreach( + [&rTreeView, &pSelectedEntryRedlineData](weld::TreeIter& rIter) + { + RedlinData* pRedlinData = weld::fromId<RedlinData*>(rTreeView.get_id(rIter)); + const SwRedlineData* pRedlineData; + if (rTreeView.get_iter_depth(rIter)) + pRedlineData = static_cast<SwRedlineDataChild*>(pRedlinData->pData)->pChild; + else + pRedlineData = static_cast<SwRedlineDataParent*>(pRedlinData->pData)->pData; + if (pRedlineData == pSelectedEntryRedlineData) + { + rTreeView.set_cursor(rIter); + return true; + } + return false; + }); +} +} + SwRedlineAcceptDlg::SwRedlineAcceptDlg(std::shared_ptr<weld::Window> xParent, weld::Builder *pBuilder, weld::Container *pContentArea, bool bAutoFormat) : m_xParentDlg(std::move(xParent)) @@ -230,13 +272,7 @@ void SwRedlineAcceptDlg::Init(SwRedlineTable::size_type nStart) m_aUsedSeqNo.clear(); // tdf#162018 keep the selected entry selected - const OUString& rId = rTreeView.get_selected_id(); - auto reselect = [&rTreeView, &rId]() { - rTreeView.select_id(rId); - std::unique_ptr<weld::TreeIter> xEntry(rTreeView.make_iterator()); - if (rTreeView.get_selected(xEntry.get())) - rTreeView.set_cursor(*xEntry); - }; + const SwRedlineData* pSelectedEntryRedlineData = lcl_get_selected_redlinedata(rTreeView); rTreeView.freeze(); if (nStart) @@ -254,7 +290,7 @@ void SwRedlineAcceptDlg::Init(SwRedlineTable::size_type nStart) InsertParents(nStart); InitAuthors(); - reselect(); + lcl_reselect(rTreeView, pSelectedEntryRedlineData); } void SwRedlineAcceptDlg::InitAuthors() @@ -421,13 +457,7 @@ void SwRedlineAcceptDlg::Activate() // tdf#162018 keep the selected entry selected weld::TreeView& rTreeView = m_pTable->GetWidget(); - const OUString& rId = rTreeView.get_selected_id(); - auto reselect = [&rTreeView, &rId]() { - rTreeView.select_id(rId); - std::unique_ptr<weld::TreeIter> xEntry(rTreeView.make_iterator()); - if (rTreeView.get_selected(xEntry.get())) - rTreeView.set_cursor(*xEntry); - }; + const SwRedlineData* pSelectedEntryRedlineData = lcl_get_selected_redlinedata(m_pTable->GetWidget()); SwRedlineTable::size_type nCount = pSh->GetRedlineCount(); @@ -449,10 +479,7 @@ void SwRedlineAcceptDlg::Activate() // Redline-Parents were inserted, changed or deleted i = CalcDiff(i, false); if (i == SwRedlineTable::npos) - { - reselect(); return; - } continue; } @@ -464,10 +491,7 @@ void SwRedlineAcceptDlg::Activate() // Redline-Children were deleted i = CalcDiff(i, true); if (i == SwRedlineTable::npos) - { - reselect(); return; - } continue; } else @@ -479,10 +503,7 @@ void SwRedlineAcceptDlg::Activate() // Redline-Children were inserted, changed or deleted i = CalcDiff(i, true); if (i == SwRedlineTable::npos) - { - reselect(); return; - } // here was a continue; targetted to the outer loop // now a break will do, as there is nothing after it in the outer loop @@ -526,7 +547,7 @@ void SwRedlineAcceptDlg::Activate() InitAuthors(); - reselect(); + lcl_reselect(rTreeView, pSelectedEntryRedlineData); } void SwRedlineAcceptDlg::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint)
