summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorJustin Luth <justin_luth@sil.org>2022-02-02 10:44:23 +0200
committerTomaž Vajngerl <quikee@gmail.com>2022-02-07 10:04:17 +0100
commit32c946c064cc2889bda2f46c1862e5100f0a257a (patch)
treeff5f86bb9361c6ca36e0e3f31cdc6ddb897876c3 /sd
parentb52016e5d065ca3fe77ec3c02090ea4b2b3e1ba5 (diff)
tdf#145868 sd replace: if search changes, restart find/replace
REPLACE is really a replaceAndFind instead of a findAndReplace. Thus, when you changed your search parameter and did a replace, it replaced the previously searched for item, and then found the first instance of the new search parameter. That of course is just wrong. So make sure to verify that the previous search matches the current search competely. However, that doesn't mean that the entire searchItem matches, since we don't want to restart the search just because the replace parameter changed. In my testing, this wasn't an issue for REPLACE_ALL. So the only time we need to worry about the last search result is in a replace once situation. P.S. This commit exposed that mpSearchItem can point to a destructed SvxSearchItem, so this patches unit test will crash if the other 7.4 commit is missing. Change-Id: I7be14d64534018718145c6ac5f8629ff5f2e5611 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129385 Tested-by: Jenkins Reviewed-by: Justin Luth <jluth@mail.com> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'sd')
-rw-r--r--sd/qa/uitest/findReplace/findReplace.py7
-rw-r--r--sd/source/ui/view/Outliner.cxx12
2 files changed, 15 insertions, 4 deletions
diff --git a/sd/qa/uitest/findReplace/findReplace.py b/sd/qa/uitest/findReplace/findReplace.py
index f33dd44d40ce..0e4bd4c12f73 100644
--- a/sd/qa/uitest/findReplace/findReplace.py
+++ b/sd/qa/uitest/findReplace/findReplace.py
@@ -85,8 +85,8 @@ class findReplace(UITestCase):
self.assertEqual("Replace first first", impress_doc.DrawPages[0].getByIndex(1).String)
self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String)
- # FIXME: tdf#145868
- self.assertEqual("Replace", impress_doc.DrawPages[2].getByIndex(1).String)
+ # tdf#145868 - Third was search for earlier, but never should have been replaced
+ self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String)
self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String)
replaceterm = xDialog.getChild("replaceterm")
@@ -102,8 +102,7 @@ class findReplace(UITestCase):
# AssertionError: 'Replace aaa aaa' != 'Replace first first'
self.assertEqual("Replace aaa aaa", impress_doc.DrawPages[0].getByIndex(1).String)
self.assertEqual("second", impress_doc.DrawPages[1].getByIndex(1).String)
- # FIXME: tdf#145868
- self.assertEqual("Replace", impress_doc.DrawPages[2].getByIndex(1).String)
+ self.assertEqual("Third", impress_doc.DrawPages[2].getByIndex(1).String)
self.assertEqual("Text size 16", impress_doc.DrawPages[3].getByIndex(1).String)
# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx
index e03b56bf1a3d..342b01b050dc 100644
--- a/sd/source/ui/view/Outliner.cxx
+++ b/sd/source/ui/view/Outliner.cxx
@@ -425,6 +425,18 @@ bool SdOutliner::StartSearchAndReplace (const SvxSearchItem* pSearchItem)
SvxSearchDialogWrapper::SetSearchLabel(SearchLabel::Empty);
mpDrawDocument->GetDocSh()->SetWaitCursor( true );
+
+ // Since REPLACE is really a replaceAndSearchNext instead of a searchAndReplace,
+ // make sure that the search portion has not changed since the last FIND.
+ if (!mbPrepareSpellingPending && mpSearchItem
+ && pSearchItem->GetCommand() == SvxSearchCmd::REPLACE
+ && !mpSearchItem->equalsIgnoring(*pSearchItem, /*bIgnoreReplace=*/true,
+ /*bIgnoreCommand=*/true))
+ {
+ EndSpelling();
+ mbPrepareSpellingPending = true;
+ }
+
if (mbPrepareSpellingPending)
PrepareSpelling();
sd::ViewShellBase* pBase = getViewShellBase();