Skip to content

Commit 240164b

Browse files
committed
Replace text/tooltip/... with explicit ID matching
1 parent 1d95851 commit 240164b

File tree

5 files changed

+109
-81
lines changed

5 files changed

+109
-81
lines changed

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

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ private final class KeyboardShortcuts {
104104
KeyStroke.getInstance(SWT.MOD1, 'R'), KeyStroke.getInstance(SWT.MOD1, 'r'));
105105
}
106106

107+
public static final String ID_DATA_KEY = "org.eclipse.ui.internal.findreplace.overlay.FindReplaceOverlay.id"; //$NON-NLS-1$
108+
107109
private static final String REPLACE_BAR_OPEN_DIALOG_SETTING = "replaceBarOpen"; //$NON-NLS-1$
108110
private static final double WORST_CASE_RATIO_EDITOR_TO_OVERLAY = 0.95;
109111
private static final double BIG_WIDTH_RATIO_EDITOR_TO_OVERLAY = 0.7;
@@ -130,9 +132,9 @@ private final class KeyboardShortcuts {
130132
private ToolItem wholeWordSearchButton;
131133
private ToolItem caseSensitiveSearchButton;
132134
private ToolItem regexSearchButton;
133-
private ToolItem searchUpButton;
134-
private ToolItem searchDownButton;
135-
private ToolItem searchAllButton;
135+
private ToolItem searchBackwardButton;
136+
private ToolItem searchForwardButton;
137+
private ToolItem selectAllButton;
136138
private AccessibleToolBar closeTools;
137139
private ToolItem closeButton;
138140

@@ -370,6 +372,7 @@ public int open() {
370372
}
371373
overlayOpen = true;
372374
applyOverlayColors(backgroundToUse, true);
375+
assignIDs();
373376
updateFromTargetSelection();
374377
searchBar.forceFocus();
375378

@@ -391,6 +394,25 @@ private void restoreOverlaySettings() {
391394
}
392395
}
393396

397+
@SuppressWarnings("nls")
398+
private void assignIDs() {
399+
replaceToggle.setData(ID_DATA_KEY, "replaceToggle");
400+
searchBar.setData(ID_DATA_KEY, "searchInput");
401+
searchBackwardButton.setData(ID_DATA_KEY, "searchBackward");
402+
searchForwardButton.setData(ID_DATA_KEY, "searchForward");
403+
selectAllButton.setData(ID_DATA_KEY, "selectAll");
404+
searchInSelectionButton.setData(ID_DATA_KEY, "searchInSelection");
405+
wholeWordSearchButton.setData(ID_DATA_KEY, "wholeWordSearch");
406+
regexSearchButton.setData(ID_DATA_KEY, "regExSearch");
407+
caseSensitiveSearchButton.setData(ID_DATA_KEY, "caseSensitiveSearch");
408+
409+
if (replaceBarOpen) {
410+
replaceBar.setData(ID_DATA_KEY, "replaceInput");
411+
replaceButton.setData(ID_DATA_KEY, "replaceOne");
412+
replaceAllButton.setData(ID_DATA_KEY, "replaceAll");
413+
}
414+
}
415+
394416
private void applyOverlayColors(Color color, boolean tryToColorReplaceBar) {
395417
closeTools.setBackground(color);
396418
closeButton.setBackground(color);
@@ -400,9 +422,9 @@ private void applyOverlayColors(Color color, boolean tryToColorReplaceBar) {
400422
wholeWordSearchButton.setBackground(color);
401423
regexSearchButton.setBackground(color);
402424
caseSensitiveSearchButton.setBackground(color);
403-
searchAllButton.setBackground(color);
404-
searchUpButton.setBackground(color);
405-
searchDownButton.setBackground(color);
425+
selectAllButton.setBackground(color);
426+
searchBackwardButton.setBackground(color);
427+
searchForwardButton.setBackground(color);
406428

407429
searchBarContainer.setBackground(color);
408430
searchBar.setBackground(color);
@@ -511,20 +533,20 @@ private void createSearchTools() {
511533

512534
searchTools.createToolItem(SWT.SEPARATOR);
513535

514-
searchUpButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH)
536+
searchBackwardButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH)
515537
.withImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_FIND_PREV))
516538
.withToolTipText(FindReplaceMessages.FindReplaceOverlay_upSearchButton_toolTip)
517539
.withOperation(() -> performSearch(false))
518540
.withShortcuts(KeyboardShortcuts.SEARCH_BACKWARD).build();
519541

520-
searchDownButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH)
542+
searchForwardButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH)
521543
.withImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_FIND_NEXT))
522544
.withToolTipText(FindReplaceMessages.FindReplaceOverlay_downSearchButton_toolTip)
523545
.withOperation(() -> performSearch(true))
524546
.withShortcuts(KeyboardShortcuts.SEARCH_FORWARD).build();
525-
searchDownButton.setSelection(true); // by default, search down
547+
searchForwardButton.setSelection(true); // by default, search down
526548

527-
searchAllButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH)
549+
selectAllButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH)
528550
.withImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_SEARCH_ALL))
529551
.withToolTipText(FindReplaceMessages.FindReplaceOverlay_searchAllButton_toolTip)
530552
.withOperation(this::performSelectAll).withShortcuts(KeyboardShortcuts.SEARCH_ALL).build();
@@ -759,6 +781,7 @@ private void createReplaceDialog() {
759781

760782
updatePlacementAndVisibility();
761783
applyOverlayColors(backgroundToUse, true);
784+
assignIDs();
762785
replaceBar.forceFocus();
763786
}
764787

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@
7979
*/
8080
class FindReplaceDialog extends Dialog {
8181

82+
public static final String ID_DATA_KEY = "org.eclipse.ui.texteditor.FindReplaceDialog.id"; //$NON-NLS-1$
83+
8284
private static final int CLOSE_BUTTON_ID = 101;
8385
private IFindReplaceLogic findReplaceLogic;
8486

@@ -275,6 +277,7 @@ public void create() {
275277
shell.setText(FindReplaceMessages.FindReplace_Dialog_Title);
276278

277279
updateButtonState();
280+
assignIDs();
278281
}
279282

280283
/**
@@ -1353,4 +1356,23 @@ private String getCurrentSelection() {
13531356
return null;
13541357
return target.getSelectionText();
13551358
}
1359+
1360+
@SuppressWarnings("nls")
1361+
private void assignIDs() {
1362+
fFindField.setData(ID_DATA_KEY, "searchInput");
1363+
fReplaceField.setData(ID_DATA_KEY, "replaceInput");
1364+
fForwardRadioButton.setData(ID_DATA_KEY, "searchForward");
1365+
fGlobalRadioButton.setData(ID_DATA_KEY, "globalSearch");
1366+
fSelectedRangeRadioButton.setData(ID_DATA_KEY, "searchInSelection");
1367+
fCaseCheckBox.setData(ID_DATA_KEY, "caseSensitiveSearch");
1368+
fWrapCheckBox.setData(ID_DATA_KEY, "wrappedSearch");
1369+
fWholeWordCheckBox.setData(ID_DATA_KEY, "wholeWordSearch");
1370+
fIncrementalCheckBox.setData(ID_DATA_KEY, "incrementalSearch");
1371+
fIsRegExCheckBox.setData(ID_DATA_KEY, "regExSearch");
1372+
1373+
fReplaceSelectionButton.setData(ID_DATA_KEY, "replaceOne");
1374+
fReplaceFindButton.setData(ID_DATA_KEY, "replaceFindOne");
1375+
fReplaceAllButton.setData(ID_DATA_KEY, "replaceAll");
1376+
}
1377+
13561378
}

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

Lines changed: 24 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
*******************************************************************************/
1414
package org.eclipse.ui.internal.findandreplace;
1515

16+
import static org.junit.Assert.assertFalse;
17+
1618
import java.util.ArrayList;
17-
import java.util.Arrays;
1819
import java.util.List;
19-
import java.util.function.Function;
2020

2121
import org.eclipse.swt.widgets.Button;
2222
import org.eclipse.swt.widgets.Combo;
@@ -29,53 +29,39 @@
2929

3030
public final class WidgetExtractor {
3131

32-
private final Composite container;
32+
private final Composite rootContainer;
33+
34+
private final String idDataKey;
3335

34-
public WidgetExtractor(Composite container) {
35-
this.container= container;
36+
public WidgetExtractor(String idDataKey, Composite container) {
37+
this.idDataKey= idDataKey;
38+
this.rootContainer= container;
3639
}
3740

38-
public HistoryTextWrapper findHistoryTextWrapperWithMessage(String includedMessageText) {
39-
List<HistoryTextWrapper> widgets= findWidgets(container, HistoryTextWrapper.class, candidate -> {
40-
String message= removeMnemonicsAndMakeLowercase(candidate.getTextBar().getMessage());
41-
return message.contains(includedMessageText);
42-
});
43-
return widgets.isEmpty() ? null : widgets.get(0);
41+
public HistoryTextWrapper findHistoryTextWrapper(String id) {
42+
return findWidget(rootContainer, HistoryTextWrapper.class, id);
4443
}
4544

46-
public List<Combo> findCombos() {
47-
return findWidgets(container, Combo.class, candidate -> true);
45+
public Combo findCombo(String id) {
46+
return findWidget(rootContainer, Combo.class, id);
4847
}
4948

50-
public Button findButtonWithText(String includedText, String... excludedTexts) {
51-
List<Button> widgets= findWidgets(container, Button.class, candidate -> {
52-
String text= removeMnemonicsAndMakeLowercase(candidate.getText());
53-
boolean containsIncludeString= text.contains(includedText);
54-
boolean containsExcludeStrings= Arrays.stream(excludedTexts).anyMatch(it -> text.contains(it));
55-
return containsIncludeString && !containsExcludeStrings;
56-
});
57-
return widgets.isEmpty() ? null : widgets.get(0);
49+
public Button findButton(String id) {
50+
return findWidget(rootContainer, Button.class, id);
5851
}
5952

60-
public Button findButtonWithTooltipText(String includedToolTipText) {
61-
List<Button> widgets= findWidgets(container, Button.class, candidate -> {
62-
String toolTipText= candidate.getToolTipText();
63-
return toolTipText != null && removeMnemonicsAndMakeLowercase(toolTipText).contains(includedToolTipText);
64-
});
65-
return widgets.isEmpty() ? null : widgets.get(0);
53+
public ToolItem findToolItem(String id) {
54+
return findWidget(rootContainer, ToolItem.class, id);
6655
}
6756

68-
public ToolItem findToolItemWithTooltipText(String includedToolTipText, String... excludedToolTipTexts) {
69-
List<ToolItem> widgets= findWidgets(container, ToolItem.class, candidate -> {
70-
String toolTipText= removeMnemonicsAndMakeLowercase(candidate.getToolTipText());
71-
boolean containsIncludeString= toolTipText.contains(includedToolTipText);
72-
boolean containsExcludeStrings= Arrays.stream(excludedToolTipTexts).anyMatch(it -> toolTipText.contains(it));
73-
return containsIncludeString && !containsExcludeStrings;
74-
});
57+
private <T extends Widget> T findWidget(Composite container, Class<T> type, String id) {
58+
List<T> widgets= findWidgets(container, type, id);
59+
assertFalse("more than one matching widget found for id '" + id + "':" + widgets, widgets.size() > 1);
7560
return widgets.isEmpty() ? null : widgets.get(0);
7661
}
7762

78-
private static <T extends Widget> List<T> findWidgets(Composite container, Class<T> type, Function<T, Boolean> matcher) {
63+
@SuppressWarnings("unchecked")
64+
private <T extends Widget> List<T> findWidgets(Composite container, Class<T> type, String id) {
7965
List<Widget> children= new ArrayList<>();
8066
children.addAll(List.of(container.getChildren()));
8167
if (container instanceof ToolBar toolbar) {
@@ -84,20 +70,15 @@ private static <T extends Widget> List<T> findWidgets(Composite container, Class
8470
List<T> result= new ArrayList<>();
8571
for (Widget child : children) {
8672
if (type.isInstance(child)) {
87-
@SuppressWarnings("unchecked")
88-
T typedChild= (T) child;
89-
if (matcher.apply(typedChild)) {
90-
result.add(typedChild);
73+
if (id.equals(child.getData(idDataKey))) {
74+
result.add((T) child);
9175
}
9276
}
9377
if (child instanceof Composite compositeChild) {
94-
result.addAll(findWidgets(compositeChild, type, matcher));
78+
result.addAll(findWidgets(compositeChild, type, id));
9579
}
9680
}
9781
return result;
9882
}
9983

100-
private static String removeMnemonicsAndMakeLowercase(String string) {
101-
return string == null ? "" : string.replaceAll("&", "").toLowerCase();
102-
}
10384
}

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,24 +70,24 @@ class OverlayAccess implements IFindReplaceUIAccess {
7070
this.findReplaceTarget= findReplaceTarget;
7171
overlay= findReplaceOverlay;
7272
shell= overlay.getShell();
73-
WidgetExtractor widgetExtractor= new WidgetExtractor(shell);
74-
find= widgetExtractor.findHistoryTextWrapperWithMessage("find");
75-
caseSensitive= widgetExtractor.findToolItemWithTooltipText("case");
76-
wholeWord= widgetExtractor.findToolItemWithTooltipText("whole");
77-
regEx= widgetExtractor.findToolItemWithTooltipText("regular");
78-
inSelection= widgetExtractor.findToolItemWithTooltipText("selected");
79-
searchForward= widgetExtractor.findToolItemWithTooltipText("forward");
80-
searchBackward= widgetExtractor.findToolItemWithTooltipText("backward");
81-
openReplaceDialog= widgetExtractor.findButtonWithTooltipText("toggle");
73+
WidgetExtractor widgetExtractor= new WidgetExtractor(FindReplaceOverlay.ID_DATA_KEY, shell);
74+
find= widgetExtractor.findHistoryTextWrapper("searchInput");
75+
caseSensitive= widgetExtractor.findToolItem("caseSensitiveSearch");
76+
wholeWord= widgetExtractor.findToolItem("wholeWordSearch");
77+
regEx= widgetExtractor.findToolItem("regExSearch");
78+
inSelection= widgetExtractor.findToolItem("searchInSelection");
79+
searchForward= widgetExtractor.findToolItem("searchForward");
80+
searchBackward= widgetExtractor.findToolItem("searchBackward");
81+
openReplaceDialog= widgetExtractor.findButton("replaceToggle");
8282
extractReplaceWidgets();
8383
}
8484

8585
private void extractReplaceWidgets() {
8686
if (!isReplaceDialogOpen() && Objects.nonNull(openReplaceDialog)) {
87-
WidgetExtractor widgetExtractor= new WidgetExtractor(shell);
88-
replace= widgetExtractor.findHistoryTextWrapperWithMessage("replace");
89-
replaceButton= widgetExtractor.findToolItemWithTooltipText("replace", "all");
90-
replaceAllButton= widgetExtractor.findToolItemWithTooltipText("replace all");
87+
WidgetExtractor widgetExtractor= new WidgetExtractor(FindReplaceOverlay.ID_DATA_KEY, shell);
88+
replace= widgetExtractor.findHistoryTextWrapper("replaceInput");
89+
replaceButton= widgetExtractor.findToolItem("replaceOne");
90+
replaceAllButton= widgetExtractor.findToolItem("replaceAll");
9191
}
9292
}
9393

tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/DialogAccess.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939

4040
class DialogAccess implements IFindReplaceUIAccess {
4141

42+
private static final String DATA_ID = "org.eclipse.ui.texteditor.FindReplaceDialog.id";
43+
4244
private final IFindReplaceTarget findReplaceTarget;
4345

4446
private final Dialog findReplaceDialog;
@@ -72,21 +74,21 @@ class DialogAccess implements IFindReplaceUIAccess {
7274
DialogAccess(IFindReplaceTarget findReplaceTarget, Dialog findReplaceDialog) {
7375
this.findReplaceTarget= findReplaceTarget;
7476
this.findReplaceDialog= findReplaceDialog;
75-
WidgetExtractor widgetExtractor= new WidgetExtractor(findReplaceDialog.getShell());
76-
findCombo= widgetExtractor.findCombos().get(0);
77-
replaceCombo= widgetExtractor.findCombos().get(1);
78-
forwardRadioButton= widgetExtractor.findButtonWithText("forward");
79-
globalRadioButton= widgetExtractor.findButtonWithText("all", "select", "replace");
80-
searchInRangeRadioButton= widgetExtractor.findButtonWithText("selected");
81-
caseCheckBox= widgetExtractor.findButtonWithText("case");
82-
wrapCheckBox= widgetExtractor.findButtonWithText("wrap");
83-
wholeWordCheckBox= widgetExtractor.findButtonWithText("whole");
84-
incrementalCheckBox= widgetExtractor.findButtonWithText("incremental");
85-
regExCheckBox= widgetExtractor.findButtonWithText("regular");
86-
87-
replaceButton= widgetExtractor.findButtonWithText("replace", "find");
88-
replaceFindButton= widgetExtractor.findButtonWithText("replace/find");
89-
replaceAllButton= widgetExtractor.findButtonWithText("replace all");
77+
WidgetExtractor widgetExtractor= new WidgetExtractor(DATA_ID, findReplaceDialog.getShell());
78+
findCombo= widgetExtractor.findCombo("searchInput");
79+
replaceCombo= widgetExtractor.findCombo("replaceInput");
80+
forwardRadioButton= widgetExtractor.findButton("searchForward");
81+
globalRadioButton= widgetExtractor.findButton("globalSearch");
82+
searchInRangeRadioButton= widgetExtractor.findButton("searchInSelection");
83+
caseCheckBox= widgetExtractor.findButton("caseSensitiveSearch");
84+
wrapCheckBox= widgetExtractor.findButton("wrappedSearch");
85+
wholeWordCheckBox= widgetExtractor.findButton("wholeWordSearch");
86+
incrementalCheckBox= widgetExtractor.findButton("incrementalSearch");
87+
regExCheckBox= widgetExtractor.findButton("regExSearch");
88+
89+
replaceButton= widgetExtractor.findButton("replaceOne");
90+
replaceFindButton= widgetExtractor.findButton("replaceFindOne");
91+
replaceAllButton= widgetExtractor.findButton("replaceAll");
9092
}
9193

9294
void restoreInitialConfiguration() {

0 commit comments

Comments
 (0)