Skip to content

Commit 70f40c9

Browse files
committed
This pr is refactoring find/replace overlay to restore selection only if
incremental search is active.
1 parent 1a4d1a8 commit 70f40c9

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ public class FindReplaceLogic implements IFindReplaceLogic {
5050
private IFindReplaceStatus status;
5151
private IFindReplaceTarget target;
5252
private Point incrementalBaseLocation;
53-
5453
private boolean isTargetSupportingRegEx;
5554
private boolean isTargetEditable;
5655
private final Set<SearchOptions> searchOptions = new HashSet<>();
@@ -324,6 +323,9 @@ public boolean performSearch() {
324323
private boolean performSearch(boolean updateFromIncrementalBaseLocation) {
325324
resetStatus();
326325
if (findString.isEmpty()) {
326+
if (isAvailableAndActive(SearchOptions.INCREMENTAL)) {
327+
restoreSelectionIfEmpty();
328+
}
327329
return false;
328330
}
329331

@@ -338,6 +340,19 @@ private boolean performSearch(boolean updateFromIncrementalBaseLocation) {
338340
return somethingFound;
339341
}
340342

343+
/**
344+
* Restores the original caret/selection position when the search field becomes
345+
* empty.
346+
*/
347+
private void restoreSelectionIfEmpty() {
348+
if (incrementalBaseLocation == null) {
349+
return;
350+
}
351+
if (target instanceof IFindReplaceTargetExtension extension) {
352+
extension.setSelection(incrementalBaseLocation.x, incrementalBaseLocation.y);
353+
}
354+
}
355+
341356
/**
342357
* Replaces all occurrences of the user's findString with the replace string.
343358
* Returns the number of replacements that occur.

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

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,41 @@ public void testResetIncrementalBaseLocation() {
835835
assertThat(textViewer.getSelectedRange(), is(new Point(5, 4)));
836836
}
837837

838+
@Test
839+
public void testRestoreSelectionOnEmptyFindStringInIncrementalMode() {
840+
String setupString= "test\ntest\ntest";
841+
TextViewer textViewer= setupTextViewer(setupString);
842+
textViewer.setSelectedRange(5, 0); // Set initial selection
843+
IFindReplaceLogic findReplaceLogic= setupFindReplaceLogicObject(textViewer);
844+
findReplaceLogic.activate(SearchOptions.FORWARD);
845+
findReplaceLogic.activate(SearchOptions.WRAP);
846+
findReplaceLogic.activate(SearchOptions.INCREMENTAL);
847+
848+
findReplaceLogic.resetIncrementalBaseLocation(); // Set base location
849+
findReplaceLogic.setFindString("test");
850+
assertThat(textViewer.getSelectedRange(), is(new Point(5, 4)));
851+
findReplaceLogic.setFindString(""); // Clear the find string
852+
assertThat(textViewer.getSelectedRange(), is(new Point(5, 0))); // Restored to base location
853+
}
854+
855+
@Test
856+
public void testNoRestoreOnEmptyFindStringWhenNotIncremental() {
857+
String setupString= "test\ntest\ntest";
858+
TextViewer textViewer= setupTextViewer(setupString);
859+
textViewer.setSelectedRange(5, 0); // Set initial selection
860+
IFindReplaceLogic findReplaceLogic= setupFindReplaceLogicObject(textViewer);
861+
findReplaceLogic.activate(SearchOptions.FORWARD);
862+
findReplaceLogic.activate(SearchOptions.WRAP);
863+
// Do NOT activate incremental mode
864+
865+
findReplaceLogic.resetIncrementalBaseLocation();
866+
findReplaceLogic.setFindString("test");
867+
assertThat(textViewer.getSelectedRange(), is(new Point(5, 4)));
868+
findReplaceLogic.setFindString(""); // Clear the find string
869+
// Should not restore selection
870+
assertThat(textViewer.getSelectedRange(), is(new Point(5, 4))); // Remains unchanged
871+
}
872+
838873
@Test
839874
public void testSetFindString_incrementalInactive() {
840875
TextViewer textViewer= setupTextViewer("Test Test Test Test");
@@ -867,7 +902,7 @@ public void testSetFindString_incrementalActive() {
867902
assertEquals(new Point(0, 2), findReplaceLogic.getTarget().getSelection());
868903

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

873908
@Test

0 commit comments

Comments
 (0)