Skip to content

Commit 60d8395

Browse files
committed
Find/replace: move handling of performing incremental search into logic
Currently, consumers of the FindReplaceLogic are responsible for properly handling incremental searches by executing a search when the input text changes and by disabling incremental mode when an ordinary search shall be performed. With this change, incremental "search-as-you-type" is automatically performed by the FindReplaceLogic when the incremental search option is activated. Explicitly performing a search does require to deactivate the incremental mode anymore.
1 parent 08b804b commit 60d8395

File tree

6 files changed

+67
-62
lines changed

6 files changed

+67
-62
lines changed

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

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -322,26 +322,24 @@ private boolean prepareTargetForEditing() {
322322

323323
@Override
324324
public boolean performSearch() {
325-
return performSearch(true);
325+
boolean result = performSearch(false);
326+
resetIncrementalBaseLocation();
327+
return result;
326328
}
327329

328-
private boolean performSearch(boolean validateSearchOptions) {
330+
private boolean performSearch(boolean updateFromIncrementalBaseLocation) {
329331
resetStatus();
330-
331-
if (validateSearchOptions && !isAvailable(SearchOptions.INCREMENTAL) && isActive(SearchOptions.INCREMENTAL)) {
332-
return false; // Do nothing if search options are not compatible
332+
if (findString.isEmpty()) {
333+
return false;
333334
}
334-
boolean somethingFound = false;
335-
336-
if (findString != null && !findString.isEmpty()) {
337335

338-
try {
339-
somethingFound = findNext();
340-
} catch (PatternSyntaxException ex) {
341-
status = new InvalidRegExStatus(ex);
342-
} catch (IllegalStateException ex) {
343-
// we don't keep state in this dialog
344-
}
336+
boolean somethingFound = false;
337+
try {
338+
return somethingFound = findNext(updateFromIncrementalBaseLocation);
339+
} catch (PatternSyntaxException ex) {
340+
status = new InvalidRegExStatus(ex);
341+
} catch (IllegalStateException ex) {
342+
// we don't keep state in this dialog
345343
}
346344
return somethingFound;
347345
}
@@ -482,21 +480,13 @@ private Point replaceSelection() {
482480
return target.getSelection();
483481
}
484482

485-
/**
486-
* Returns whether the specified search string can be found using the given
487-
* options.
488-
*
489-
* @return <code>true</code> if the search string can be found using the given
490-
* options
491-
*
492-
*/
493-
private boolean findNext() {
483+
private boolean findNext(boolean updateFromIncrementalBaseLocation) {
494484

495485
if (target == null) {
496486
return false;
497487
}
498488

499-
int findReplacePosition = calculateFindBeginningOffset();
489+
int findReplacePosition = calculateFindBeginningOffset(updateFromIncrementalBaseLocation);
500490

501491
int index = findIndex(findReplacePosition);
502492

@@ -515,27 +505,33 @@ private boolean findNext() {
515505
return true;
516506
}
517507

518-
private int calculateFindBeginningOffset() {
508+
private int calculateFindBeginningOffset(boolean updateFromExistingBaseLocation) {
519509
Point r = null;
520-
if (isActive(SearchOptions.INCREMENTAL)) {
510+
if (updateFromExistingBaseLocation) {
521511
r = incrementalBaseLocation;
522512
} else {
523513
r = target.getSelection();
524514
}
525515

526516
int findReplacePosition = r.x;
527-
if (isActive(SearchOptions.FORWARD) && !isActive(SearchOptions.INCREMENTAL)
528-
|| isActive(SearchOptions.INCREMENTAL) && !isActive(SearchOptions.FORWARD)) {
517+
if (!isActive(SearchOptions.FORWARD)) {
529518
findReplacePosition += r.y;
530519
}
520+
if (!updateFromExistingBaseLocation) {
521+
if (isActive(SearchOptions.FORWARD)) {
522+
findReplacePosition += r.y;
523+
} else {
524+
findReplacePosition -= r.y;
525+
}
526+
}
531527
return findReplacePosition;
532528
}
533529

534530
@Override
535531
public boolean performReplaceAndFind() {
536532
resetStatus();
537533
if (performSelectAndReplace()) {
538-
performSearch(false);
534+
performSearch();
539535
return true;
540536
}
541537
return false;
@@ -545,7 +541,7 @@ public boolean performReplaceAndFind() {
545541
public boolean performSelectAndReplace() {
546542
resetStatus();
547543
if (!isFindStringSelected()) {
548-
performSearch(false);
544+
performSearch();
549545
}
550546
if (getStatus().wasSuccessful()) {
551547
if (!prepareTargetForEditing()) {

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,14 @@
2626
public interface IFindReplaceLogic {
2727

2828
/**
29-
* Sets the string to be used for searching in find and replace operations.
29+
* Sets the string to be used for searching in find and replace operations. In
30+
* case the {@link SearchOptions#INCREMENTAL} is active, this also triggers an
31+
* incremental search operation, starting from the current incremental base
32+
* location. This also updates the search status accordingly.
3033
*
3134
* @param findString the find string to use, must not be null
35+
*
36+
* @see #getStatus()
3237
*/
3338
public void setFindString(String findString);
3439

@@ -107,8 +112,6 @@ public interface IFindReplaceLogic {
107112
* Locates the current find string in the target. If incremental search is
108113
* activated, the search will be performed starting from an incremental search
109114
* position, which can be reset using {@link #resetIncrementalBaseLocation()}.
110-
* If incremental search is activated and RegEx search is activated, nothing
111-
* happens.
112115
*
113116
* @return Whether the string was found in the target
114117
*/

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,6 @@ private void createSearchBar() {
635635
wholeWordSearchButton.setEnabled(findReplaceLogic.isAvailable(SearchOptions.WHOLE_WORD));
636636

637637
showUserFeedback(normalTextForegroundColor, true);
638-
findReplaceLogic.setFindString(searchBar.getText());
639638
updateIncrementalSearch();
640639
});
641640
searchBar.addFocusListener(new FocusListener() {
@@ -656,7 +655,7 @@ public void focusLost(FocusEvent e) {
656655
}
657656

658657
private void updateIncrementalSearch() {
659-
findReplaceLogic.performSearch();
658+
findReplaceLogic.setFindString(searchBar.getText());
660659
evaluateFindReplaceStatus();
661660
}
662661

@@ -964,10 +963,8 @@ private void performSingleReplace() {
964963
private void performSearch(boolean forward) {
965964
boolean oldForwardSearchSetting = findReplaceLogic.isActive(SearchOptions.FORWARD);
966965
activateInFindReplacerIf(SearchOptions.FORWARD, forward);
967-
findReplaceLogic.deactivate(SearchOptions.INCREMENTAL);
968966
findReplaceLogic.performSearch();
969967
activateInFindReplacerIf(SearchOptions.FORWARD, oldForwardSearchSetting);
970-
findReplaceLogic.activate(SearchOptions.INCREMENTAL);
971968
evaluateFindReplaceStatus();
972969
searchBar.storeHistory();
973970
}

bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceDialog.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,7 @@ public void shellDeactivated(ShellEvent e) {
118118
}
119119

120120
/**
121-
* Modify listener to update the find logic with the current input and update
122-
* the search result in case of incremental search.
121+
* Modify listener to update the find logic with the current input.
123122
*
124123
* @since 2.0
125124
*/
@@ -639,9 +638,6 @@ private Composite createInputPanel(Composite parent) {
639638
fFindModifyListener = new InputModifyListener(() -> {
640639
if (okToUse(fFindField)) {
641640
findReplaceLogic.setFindString(fFindField.getText());
642-
if (findReplaceLogic.isActive(SearchOptions.INCREMENTAL)) {
643-
findReplaceLogic.performSearch();
644-
}
645641
}
646642
});
647643
fFindField.addModifyListener(fFindModifyListener);

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

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ private TextViewer setupTextViewer(String contentText) {
8181
return textViewer;
8282
}
8383

84-
8584
private void setFindAndReplaceString(IFindReplaceLogic findReplaceLogic, String findString, String replaceString) {
8685
findReplaceLogic.setFindString(findString);
8786
findReplaceLogic.setReplaceString(replaceString);
@@ -430,7 +429,6 @@ public void testPerformSearchAndReplaceRegEx_incrementalActive() {
430429
findReplaceLogic.activate(SearchOptions.REGEX);
431430

432431
findReplaceLogic.setFindString("text");
433-
findReplaceLogic.performSearch();
434432
textViewer.setSelectedRange(0, 0);
435433

436434
findReplaceLogic.setReplaceString("");
@@ -769,25 +767,38 @@ public void testResetIncrementalBaseLocation() {
769767
}
770768

771769
@Test
772-
public void testPerformIncrementalSearch() {
770+
public void testSetFindString_incrementalInactive() {
771+
TextViewer textViewer= setupTextViewer("Test Test Test Test");
772+
IFindReplaceLogic findReplaceLogic= setupFindReplaceLogicObject(textViewer);
773+
findReplaceLogic.activate(SearchOptions.FORWARD);
774+
775+
assertEquals(new Point(0, 0), findReplaceLogic.getTarget().getSelection());
776+
findReplaceLogic.setFindString("Test");
777+
assertEquals(new Point(0, 0), findReplaceLogic.getTarget().getSelection());
778+
}
779+
780+
@Test
781+
public void testSetFindString_incrementalActive() {
773782
TextViewer textViewer= setupTextViewer("Test Test Test Test");
774783
IFindReplaceLogic findReplaceLogic= setupFindReplaceLogicObject(textViewer);
775784
findReplaceLogic.activate(SearchOptions.INCREMENTAL);
776785
findReplaceLogic.activate(SearchOptions.FORWARD);
786+
assertEquals(new Point(0, 0), findReplaceLogic.getTarget().getSelection());
777787

778788
findReplaceLogic.setFindString("Test");
779-
findReplaceLogic.performSearch();
780-
assertThat(findReplaceLogic.getTarget().getSelection().x, is(0));
781-
assertThat(findReplaceLogic.getTarget().getSelection().y, is(4));
789+
assertEquals(new Point(0, 4), findReplaceLogic.getTarget().getSelection());
782790

783-
findReplaceLogic.performSearch(); // incremental search is idempotent
784-
assertThat(findReplaceLogic.getTarget().getSelection().x, is(0));
785-
assertThat(findReplaceLogic.getTarget().getSelection().y, is(4));
791+
findReplaceLogic.setFindString("Test"); // incremental search is idempotent
792+
assertEquals(new Point(0, 4), findReplaceLogic.getTarget().getSelection());
786793

787-
findReplaceLogic.setFindString("");
788-
findReplaceLogic.performSearch(); // this clears the incremental search, but the "old search" still remains active
789-
assertThat(findReplaceLogic.getTarget().getSelection().x, is(0));
790-
assertThat(findReplaceLogic.getTarget().getSelection().y, is(4));
794+
findReplaceLogic.setFindString("T");
795+
assertEquals(new Point(0, 1), findReplaceLogic.getTarget().getSelection());
796+
797+
findReplaceLogic.setFindString("Te");
798+
assertEquals(new Point(0, 2), findReplaceLogic.getTarget().getSelection());
799+
800+
findReplaceLogic.setFindString(""); // this clears the incremental search, but the "old search" still remains active
801+
assertEquals(new Point(0, 2), findReplaceLogic.getTarget().getSelection());
791802
}
792803

793804
@Test
@@ -798,7 +809,6 @@ public void testIncrementBaseLocationWithRegEx() {
798809
findReplaceLogic.activate(SearchOptions.FORWARD);
799810

800811
findReplaceLogic.setFindString("Test");
801-
findReplaceLogic.performSearch();
802812
assertThat(findReplaceLogic.getTarget().getSelection(), is(new Point(0, 4)));
803813

804814
findReplaceLogic.activate(SearchOptions.REGEX);
@@ -812,10 +822,10 @@ public void testIncrementBaseLocationWithRegEx() {
812822
assertThat(findReplaceLogic.getTarget().getSelection(), is(new Point(10, 4)));
813823
findReplaceLogic.deactivate(SearchOptions.REGEX);
814824

815-
findReplaceLogic.performSearch();
825+
findReplaceLogic.setFindString("Test");
816826
assertThat(findReplaceLogic.getTarget().getSelection(), is(new Point(10, 4)));
817827
findReplaceLogic.performSearch();
818-
assertThat(findReplaceLogic.getTarget().getSelection(), is(new Point(10, 4)));
828+
assertThat(findReplaceLogic.getTarget().getSelection(), is(new Point(15, 4)));
819829
}
820830

821831
@Test
@@ -827,7 +837,6 @@ public void testIncrementalSearchNoUpdateIfAlreadyOnWord() {
827837
findReplaceLogic.activate(SearchOptions.INCREMENTAL);
828838
textViewer.setSelectedRange(0, 0);
829839
findReplaceLogic.setFindString("hello");
830-
findReplaceLogic.performSearch();
831840
assertThat(findReplaceLogic.getTarget().getSelection(), is(new Point(0, 5)));
832841
}
833842

@@ -840,7 +849,6 @@ public void testIncrementalSearchBackwardNoUpdateIfAlreadyOnWord() {
840849
findReplaceLogic.activate(SearchOptions.INCREMENTAL);
841850
textViewer.setSelectedRange(5, 0);
842851
findReplaceLogic.setFindString("hello");
843-
findReplaceLogic.performSearch();
844852
assertThat(findReplaceLogic.getTarget().getSelection(), is(new Point(5, 5)));
845853
}
846854

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import org.junit.Test;
2222

23+
import org.eclipse.swt.graphics.Point;
24+
2325
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
2426
import org.eclipse.core.runtime.preferences.InstanceScope;
2527

@@ -88,10 +90,13 @@ public void testIncrementalSearchUpdatesAfterChangingOptions() {
8890
initializeTextViewerWithFindReplaceUI("alinee\naLinee\nline\nline");
8991
OverlayAccess dialog= getDialog();
9092
IFindReplaceTarget target= dialog.getTarget();
91-
9293
dialog.setFindText("Line");
94+
assertThat(dialog.getTarget().getSelectionText(), is("line"));
95+
assertEquals(new Point(1,4), dialog.getTarget().getSelection());
96+
9397
dialog.select(SearchOptions.CASE_SENSITIVE);
9498
assertThat(dialog.getTarget().getSelectionText(), is("Line"));
99+
assertEquals(new Point(8,4), dialog.getTarget().getSelection());
95100

96101
dialog.unselect(SearchOptions.CASE_SENSITIVE);
97102
assertEquals(1, (target.getSelection()).x);

0 commit comments

Comments
 (0)