Skip to content

Commit 846956c

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

File tree

5 files changed

+123
-95
lines changed

5 files changed

+123
-95
lines changed

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

Lines changed: 47 additions & 24 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;
@@ -117,7 +119,7 @@ private final class KeyboardShortcuts {
117119
private boolean replaceBarOpen;
118120

119121
private Composite container;
120-
private Button replaceToggle;
122+
private Button replaceBarToggle;
121123
private FindReplaceOverlayAction replaceToggleShortcut;
122124

123125
private Composite contentGroup;
@@ -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+
replaceBarToggle.setData(ID_DATA_KEY, "replaceBarToggle");
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();
@@ -714,24 +736,24 @@ private void createMainContainer(final Composite parent) {
714736
private void createReplaceToggle() {
715737
replaceToggleShortcut = new FindReplaceOverlayAction(this::toggleReplace);
716738
replaceToggleShortcut.addShortcuts(KeyboardShortcuts.TOGGLE_REPLACE);
717-
replaceToggle = new Button(container, SWT.FLAT | SWT.PUSH);
739+
replaceBarToggle = new Button(container, SWT.FLAT | SWT.PUSH);
718740
GridDataFactory.fillDefaults().grab(false, true).align(GridData.BEGINNING, GridData.FILL)
719-
.applyTo(replaceToggle);
720-
replaceToggle.setToolTipText(replaceToggleShortcut
741+
.applyTo(replaceBarToggle);
742+
replaceBarToggle.setToolTipText(replaceToggleShortcut
721743
.addShortcutHintToTooltipText(FindReplaceMessages.FindReplaceOverlay_replaceToggle_toolTip));
722-
replaceToggle.setImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_OPEN_REPLACE_AREA));
723-
replaceToggle.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> toggleReplace()));
744+
replaceBarToggle.setImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_OPEN_REPLACE_AREA));
745+
replaceBarToggle.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> toggleReplace()));
724746
}
725747

726748
private void toggleReplace() {
727749
if (!replaceBarOpen && findReplaceLogic.getTarget().isEditable()) {
728750
createReplaceDialog();
729-
replaceToggle.setImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_CLOSE_REPLACE_AREA));
751+
replaceBarToggle.setImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_CLOSE_REPLACE_AREA));
730752
} else {
731753
hideReplace();
732-
replaceToggle.setImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_OPEN_REPLACE_AREA));
754+
replaceBarToggle.setImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_OPEN_REPLACE_AREA));
733755
}
734-
replaceToggle.setSelection(false); // We don't want the button to look "locked in", so don't
756+
replaceBarToggle.setSelection(false); // We don't want the button to look "locked in", so don't
735757
// use it's selectionState
736758
updateContentAssistAvailability();
737759
}
@@ -759,6 +781,7 @@ private void createReplaceDialog() {
759781

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

@@ -774,12 +797,12 @@ private void enableSearchTools(boolean enable) {
774797
}
775798

776799
private void enableReplaceToggle(boolean enable) {
777-
if (!okayToUse(replaceToggle)) {
800+
if (!okayToUse(replaceBarToggle)) {
778801
return;
779802
}
780803
boolean visible = enable && findReplaceLogic.getTarget().isEditable();
781-
((GridData) replaceToggle.getLayoutData()).exclude = !visible;
782-
replaceToggle.setVisible(visible);
804+
((GridData) replaceBarToggle.getLayoutData()).exclude = !visible;
805+
replaceBarToggle.setVisible(visible);
783806
}
784807

785808
private void enableReplaceTools(boolean enable) {
@@ -822,8 +845,8 @@ private int calculateOverlayWidthWithToolbars(String searchInput) {
822845

823846
private int calculateOverlayWidthWithoutToolbars(String searchInput) {
824847
int replaceToggleWidth = 0;
825-
if (okayToUse(replaceToggle)) {
826-
replaceToggleWidth = replaceToggle.getBounds().width;
848+
if (okayToUse(replaceBarToggle)) {
849+
replaceToggleWidth = replaceBarToggle.getBounds().width;
827850
}
828851
int closeButtonWidth = closeTools.getSize().x;
829852
int searchInputWidth = getTextWidthInSearchBar(searchInput);

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("replaceBarToggle");
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

0 commit comments

Comments
 (0)