Skip to content

Commit 1364ad4

Browse files
committed
This pr stores the current editor caret position when user starts typing
a new search pattern.
1 parent ce17c9e commit 1364ad4

File tree

2 files changed

+102
-2
lines changed

2 files changed

+102
-2
lines changed

bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/findandreplace/FindReplaceLogic.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public class FindReplaceLogic implements IFindReplaceLogic {
5050
private IFindReplaceStatus status;
5151
private IFindReplaceTarget target;
5252
private Point incrementalBaseLocation;
53-
53+
private Point restoreBaseLocation = new Point(0, 0);
5454
private boolean isTargetSupportingRegEx;
5555
private boolean isTargetEditable;
5656
private final Set<SearchOptions> searchOptions = new HashSet<>();
@@ -60,6 +60,12 @@ public class FindReplaceLogic implements IFindReplaceLogic {
6060

6161
@Override
6262
public void setFindString(String findString) {
63+
if (this.findString.isEmpty() && !findString.isEmpty()) {
64+
// User just started a new search after clearing previous search.
65+
if (target != null) {
66+
restoreBaseLocation = target.getSelection();
67+
}
68+
}
6369
this.findString = Objects.requireNonNull(findString);
6470
if (isAvailableAndActive(SearchOptions.INCREMENTAL)) {
6571
performSearch(true);
@@ -324,6 +330,7 @@ public boolean performSearch() {
324330
private boolean performSearch(boolean updateFromIncrementalBaseLocation) {
325331
resetStatus();
326332
if (findString.isEmpty()) {
333+
restoreSelectionIfEmpty();
327334
return false;
328335
}
329336

@@ -338,6 +345,18 @@ private boolean performSearch(boolean updateFromIncrementalBaseLocation) {
338345
return somethingFound;
339346
}
340347

348+
/**
349+
* Restores the original caret/selection position when the search field becomes
350+
* empty.
351+
*/
352+
private void restoreSelectionIfEmpty() {
353+
if (restoreBaseLocation == null)
354+
return;
355+
incrementalBaseLocation = restoreBaseLocation;
356+
if (target instanceof IFindReplaceTargetExtension extension)
357+
extension.setSelection(restoreBaseLocation.x, restoreBaseLocation.y);
358+
}
359+
341360
/**
342361
* Replaces all occurrences of the user's findString with the replace string.
343362
* Returns the number of replacements that occur.

tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/FindReplaceLogicTest.java

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,10 +829,91 @@ public void testResetIncrementalBaseLocation() {
829829

830830
findReplaceLogic.setFindString("test");
831831
assertThat(textViewer.getSelectedRange(), is(new Point(0, 4)));
832+
833+
// Move caret after first "test" i.e., caret after "test\n", so after 5 characters
832834
textViewer.setSelectedRange(5, 0);
833835
findReplaceLogic.resetIncrementalBaseLocation();
834836
findReplaceLogic.performSearch();
835837
assertThat(textViewer.getSelectedRange(), is(new Point(5, 4)));
838+
839+
// Move caret inside second "test" i.e., caret after "test\nte", so after 7 characters
840+
textViewer.setSelectedRange(7, 0);
841+
findReplaceLogic.resetIncrementalBaseLocation();
842+
findReplaceLogic.performSearch();
843+
assertThat(textViewer.getSelectedRange(), is(new Point(10, 4)));
844+
845+
// Move caret to position to third "test" i.e., caret after "test\ntest\n", so after 10 characters
846+
textViewer.setSelectedRange(10, 0);
847+
findReplaceLogic.resetIncrementalBaseLocation();
848+
findReplaceLogic.performSearch();
849+
assertThat(textViewer.getSelectedRange(), is(new Point(10, 4)));
850+
851+
findReplaceLogic.setFindString("");
852+
findReplaceLogic.performSearch();
853+
assertThat(textViewer.getSelectedRange(), is(new Point(0, 0)));
854+
}
855+
856+
@Test
857+
public void testSelectionRestoredAfterClearingSearch() {
858+
String setupString= "alpha beta gamma";
859+
TextViewer textViewer= setupTextViewer(setupString);
860+
textViewer.setSelectedRange(6, 0); // caret after 'alpha '
861+
IFindReplaceLogic logic= setupFindReplaceLogicObject(textViewer);
862+
logic.activate(SearchOptions.FORWARD);
863+
logic.activate(SearchOptions.INCREMENTAL);
864+
865+
logic.setFindString("gamma");
866+
assertThat(textViewer.getSelectedRange(), is(new Point(11, 5))); // "gamma" found
867+
868+
logic.setFindString("");
869+
assertThat(textViewer.getSelectedRange(), is(new Point(6, 0)));
870+
}
871+
872+
873+
@Test
874+
public void testCaretRestoredWhenSearchCleared() {
875+
String setupString= "alpha beta gamma";
876+
TextViewer textViewer= setupTextViewer(setupString);
877+
textViewer.setSelectedRange(0, 0);
878+
IFindReplaceLogic logic= setupFindReplaceLogicObject(textViewer);
879+
logic.activate(SearchOptions.FORWARD);
880+
logic.activate(SearchOptions.INCREMENTAL);
881+
882+
logic.setFindString("beta");
883+
assertThat(textViewer.getSelectedRange(), is(new Point(6, 4))); // found "beta"
884+
885+
// Clear the search field - should restore caret
886+
logic.setFindString("");
887+
logic.performSearch();
888+
// Expect caret restored to starting location (0,0)
889+
assertThat(textViewer.getSelectedRange(), is(new Point(0, 0)));
890+
}
891+
892+
893+
@Test
894+
public void testCaretRestoredBetweenSearchSessions() {
895+
String setupString= "alpha beta gamma";
896+
TextViewer textViewer= setupTextViewer(setupString);
897+
IFindReplaceLogic logic= setupFindReplaceLogicObject(textViewer);
898+
logic.activate(SearchOptions.FORWARD);
899+
logic.activate(SearchOptions.INCREMENTAL);
900+
901+
textViewer.setSelectedRange(0, 0); // caret at start
902+
logic.setFindString("alpha");
903+
assertThat(textViewer.getSelectedRange(), is(new Point(0, 5))); // "alpha" found
904+
905+
// Clear the search (simulate reopen of overlay)
906+
logic.setFindString("");
907+
logic.performSearch();
908+
assertThat(textViewer.getSelectedRange(), is(new Point(0, 0))); // caret restored
909+
910+
textViewer.setSelectedRange(6, 0); // caret before "beta"
911+
logic.setFindString("beta");
912+
assertThat(textViewer.getSelectedRange(), is(new Point(6, 4))); // "beta" found
913+
914+
logic.setFindString("");
915+
logic.performSearch();
916+
assertThat(textViewer.getSelectedRange(), is(new Point(6, 0))); // caret restored to new base
836917
}
837918

838919
@Test
@@ -867,7 +948,7 @@ public void testSetFindString_incrementalActive() {
867948
assertEquals(new Point(0, 2), findReplaceLogic.getTarget().getSelection());
868949

869950
findReplaceLogic.setFindString(""); // this clears the incremental search, but the "old search" still remains active
870-
assertEquals(new Point(0, 2), findReplaceLogic.getTarget().getSelection());
951+
assertEquals(new Point(0, 0), findReplaceLogic.getTarget().getSelection()); // after #3379 pr
871952
}
872953

873954
@Test

0 commit comments

Comments
 (0)