From 8f010dffe07d91dc6c66724462ce11d2e5d4e536 Mon Sep 17 00:00:00 2001 From: Heiko Klare Date: Mon, 9 Sep 2024 13:31:47 +0200 Subject: [PATCH] Remove reflective access from find/replace tests #2060 The tests for the FindReplaceDialog and FindReplaceOverlay currently use reflection to access specific UI elements. This ties the test implementations to implementation details of the production classes (i.e., specific hidden field to be present) and particularly requires the production code to contain (hidden) fields even if they would not be required just to provide according tests. This change replaces the reflective access with widget extraction functionality based on explicit IDs assigned to the UI elements of interest. Fixes https://github.com/eclipse-platform/eclipse.platform.ui/issues/2060 --- .../overlay/FindReplaceOverlay.java | 43 +++++++--- .../ui/texteditor/FindReplaceDialog.java | 22 +++++ .../findandreplace/WidgetExtractor.java | 83 ++++++++++++++++++ .../overlay/FindReplaceOverlayTest.java | 4 +- .../findandreplace/overlay/OverlayAccess.java | 64 +++++++------- .../texteditor/tests/DialogAccess.java | 86 +++++++++---------- .../tests/FindReplaceDialogTest.java | 7 +- 7 files changed, 218 insertions(+), 91 deletions(-) create mode 100644 tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/WidgetExtractor.java diff --git a/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/findandreplace/overlay/FindReplaceOverlay.java b/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/findandreplace/overlay/FindReplaceOverlay.java index 26dfad8358b..1ba6878127b 100644 --- a/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/findandreplace/overlay/FindReplaceOverlay.java +++ b/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/internal/findandreplace/overlay/FindReplaceOverlay.java @@ -104,6 +104,8 @@ private final class KeyboardShortcuts { KeyStroke.getInstance(SWT.MOD1, 'R'), KeyStroke.getInstance(SWT.MOD1, 'r')); } + public static final String ID_DATA_KEY = "org.eclipse.ui.internal.findreplace.overlay.FindReplaceOverlay.id"; //$NON-NLS-1$ + private static final String REPLACE_BAR_OPEN_DIALOG_SETTING = "replaceBarOpen"; //$NON-NLS-1$ private static final double WORST_CASE_RATIO_EDITOR_TO_OVERLAY = 0.95; private static final double BIG_WIDTH_RATIO_EDITOR_TO_OVERLAY = 0.7; @@ -130,9 +132,9 @@ private final class KeyboardShortcuts { private ToolItem wholeWordSearchButton; private ToolItem caseSensitiveSearchButton; private ToolItem regexSearchButton; - private ToolItem searchUpButton; - private ToolItem searchDownButton; - private ToolItem searchAllButton; + private ToolItem searchBackwardButton; + private ToolItem searchForwardButton; + private ToolItem selectAllButton; private AccessibleToolBar closeTools; private ToolItem closeButton; @@ -370,6 +372,7 @@ public int open() { } overlayOpen = true; applyOverlayColors(backgroundToUse, true); + assignIDs(); updateFromTargetSelection(); searchBar.forceFocus(); @@ -391,6 +394,25 @@ private void restoreOverlaySettings() { } } + @SuppressWarnings("nls") + private void assignIDs() { + replaceToggle.setData(ID_DATA_KEY, "replaceToggle"); + searchBar.setData(ID_DATA_KEY, "searchInput"); + searchBackwardButton.setData(ID_DATA_KEY, "searchBackward"); + searchForwardButton.setData(ID_DATA_KEY, "searchForward"); + selectAllButton.setData(ID_DATA_KEY, "selectAll"); + searchInSelectionButton.setData(ID_DATA_KEY, "searchInSelection"); + wholeWordSearchButton.setData(ID_DATA_KEY, "wholeWordSearch"); + regexSearchButton.setData(ID_DATA_KEY, "regExSearch"); + caseSensitiveSearchButton.setData(ID_DATA_KEY, "caseSensitiveSearch"); + + if (replaceBarOpen) { + replaceBar.setData(ID_DATA_KEY, "replaceInput"); + replaceButton.setData(ID_DATA_KEY, "replaceOne"); + replaceAllButton.setData(ID_DATA_KEY, "replaceAll"); + } + } + private void applyOverlayColors(Color color, boolean tryToColorReplaceBar) { closeTools.setBackground(color); closeButton.setBackground(color); @@ -400,9 +422,9 @@ private void applyOverlayColors(Color color, boolean tryToColorReplaceBar) { wholeWordSearchButton.setBackground(color); regexSearchButton.setBackground(color); caseSensitiveSearchButton.setBackground(color); - searchAllButton.setBackground(color); - searchUpButton.setBackground(color); - searchDownButton.setBackground(color); + selectAllButton.setBackground(color); + searchBackwardButton.setBackground(color); + searchForwardButton.setBackground(color); searchBarContainer.setBackground(color); searchBar.setBackground(color); @@ -511,20 +533,20 @@ private void createSearchTools() { searchTools.createToolItem(SWT.SEPARATOR); - searchUpButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH) + searchBackwardButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH) .withImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_FIND_PREV)) .withToolTipText(FindReplaceMessages.FindReplaceOverlay_upSearchButton_toolTip) .withOperation(() -> performSearch(false)) .withShortcuts(KeyboardShortcuts.SEARCH_BACKWARD).build(); - searchDownButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH) + searchForwardButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH) .withImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_FIND_NEXT)) .withToolTipText(FindReplaceMessages.FindReplaceOverlay_downSearchButton_toolTip) .withOperation(() -> performSearch(true)) .withShortcuts(KeyboardShortcuts.SEARCH_FORWARD).build(); - searchDownButton.setSelection(true); // by default, search down + searchForwardButton.setSelection(true); // by default, search down - searchAllButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH) + selectAllButton = new AccessibleToolItemBuilder(searchTools).withStyleBits(SWT.PUSH) .withImage(FindReplaceOverlayImages.get(FindReplaceOverlayImages.KEY_SEARCH_ALL)) .withToolTipText(FindReplaceMessages.FindReplaceOverlay_searchAllButton_toolTip) .withOperation(this::performSelectAll).withShortcuts(KeyboardShortcuts.SEARCH_ALL).build(); @@ -759,6 +781,7 @@ private void createReplaceDialog() { updatePlacementAndVisibility(); applyOverlayColors(backgroundToUse, true); + assignIDs(); replaceBar.forceFocus(); } diff --git a/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceDialog.java b/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceDialog.java index e65cff7268e..2ab91df8d15 100644 --- a/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceDialog.java +++ b/bundles/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/FindReplaceDialog.java @@ -79,6 +79,8 @@ */ class FindReplaceDialog extends Dialog { + public static final String ID_DATA_KEY = "org.eclipse.ui.texteditor.FindReplaceDialog.id"; //$NON-NLS-1$ + private static final int CLOSE_BUTTON_ID = 101; private IFindReplaceLogic findReplaceLogic; @@ -275,6 +277,7 @@ public void create() { shell.setText(FindReplaceMessages.FindReplace_Dialog_Title); updateButtonState(); + assignIDs(); } /** @@ -1353,4 +1356,23 @@ private String getCurrentSelection() { return null; return target.getSelectionText(); } + + @SuppressWarnings("nls") + private void assignIDs() { + fFindField.setData(ID_DATA_KEY, "searchInput"); + fReplaceField.setData(ID_DATA_KEY, "replaceInput"); + fForwardRadioButton.setData(ID_DATA_KEY, "searchForward"); + fGlobalRadioButton.setData(ID_DATA_KEY, "globalSearch"); + fSelectedRangeRadioButton.setData(ID_DATA_KEY, "searchInSelection"); + fCaseCheckBox.setData(ID_DATA_KEY, "caseSensitiveSearch"); + fWrapCheckBox.setData(ID_DATA_KEY, "wrappedSearch"); + fWholeWordCheckBox.setData(ID_DATA_KEY, "wholeWordSearch"); + fIncrementalCheckBox.setData(ID_DATA_KEY, "incrementalSearch"); + fIsRegExCheckBox.setData(ID_DATA_KEY, "regExSearch"); + + fReplaceSelectionButton.setData(ID_DATA_KEY, "replaceOne"); + fReplaceFindButton.setData(ID_DATA_KEY, "replaceFindOne"); + fReplaceAllButton.setData(ID_DATA_KEY, "replaceAll"); + } + } diff --git a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/WidgetExtractor.java b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/WidgetExtractor.java new file mode 100644 index 00000000000..81b7f64aa77 --- /dev/null +++ b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/WidgetExtractor.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2024 Vector Informatik GmbH and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Vector Informatik GmbH - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.internal.findandreplace; + +import static org.junit.Assert.assertFalse; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; +import org.eclipse.swt.widgets.Widget; + +import org.eclipse.ui.internal.findandreplace.overlay.HistoryTextWrapper; + +public final class WidgetExtractor { + + private final Composite rootContainer; + + private final String idDataKey; + + public WidgetExtractor(String idDataKey, Composite container) { + this.idDataKey= idDataKey; + this.rootContainer= container; + } + + public HistoryTextWrapper findHistoryTextWrapper(String id) { + return findWidget(rootContainer, HistoryTextWrapper.class, id); + } + + public Combo findCombo(String id) { + return findWidget(rootContainer, Combo.class, id); + } + + public Button findButton(String id) { + return findWidget(rootContainer, Button.class, id); + } + + public ToolItem findToolItem(String id) { + return findWidget(rootContainer, ToolItem.class, id); + } + + private T findWidget(Composite container, Class type, String id) { + List widgets= findWidgets(container, type, id); + assertFalse("more than one matching widget found for id '" + id + "':" + widgets, widgets.size() > 1); + return widgets.isEmpty() ? null : widgets.get(0); + } + + private List findWidgets(Composite container, Class type, String id) { + List children= new ArrayList<>(); + children.addAll(List.of(container.getChildren())); + if (container instanceof ToolBar toolbar) { + children.addAll(List.of(toolbar.getItems())); + } + List result= new ArrayList<>(); + for (Widget child : children) { + if (type.isInstance(child)) { + if (id.equals(child.getData(idDataKey))) { + result.add(type.cast(child)); + } + } + if (child instanceof Composite compositeChild) { + result.addAll(findWidgets(compositeChild, type, id)); + } + } + return result; + } + +} diff --git a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/overlay/FindReplaceOverlayTest.java b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/overlay/FindReplaceOverlayTest.java index 58e7afc72d8..f9dda34774d 100644 --- a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/overlay/FindReplaceOverlayTest.java +++ b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/overlay/FindReplaceOverlayTest.java @@ -45,8 +45,8 @@ public class FindReplaceOverlayTest extends FindReplaceUITest { public OverlayAccess openUIFromTextViewer(TextViewer viewer) { Accessor actionAccessor= new Accessor(getFindReplaceAction(), FindReplaceAction.class); actionAccessor.invoke("showOverlayInEditor", null); - Accessor overlayAccessor= new Accessor(actionAccessor.get("overlay"), "org.eclipse.ui.internal.findandreplace.overlay.FindReplaceOverlay", getClass().getClassLoader()); - return new OverlayAccess(getFindReplaceTarget(), overlayAccessor); + FindReplaceOverlay overlay= (FindReplaceOverlay) actionAccessor.get("overlay"); + return new OverlayAccess(getFindReplaceTarget(), overlay); } @Test diff --git a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/overlay/OverlayAccess.java b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/overlay/OverlayAccess.java index ae961a3e0da..e81a1f47b56 100644 --- a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/overlay/OverlayAccess.java +++ b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/internal/findandreplace/overlay/OverlayAccess.java @@ -21,7 +21,6 @@ import java.util.Objects; import java.util.Set; import java.util.function.Predicate; -import java.util.function.Supplier; import java.util.stream.Collectors; import org.eclipse.swt.SWT; @@ -31,13 +30,12 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolItem; -import org.eclipse.text.tests.Accessor; - import org.eclipse.jface.text.IFindReplaceTarget; import org.eclipse.jface.text.IFindReplaceTargetExtension; import org.eclipse.ui.internal.findandreplace.IFindReplaceUIAccess; import org.eclipse.ui.internal.findandreplace.SearchOptions; +import org.eclipse.ui.internal.findandreplace.WidgetExtractor; class OverlayAccess implements IFindReplaceUIAccess { private final IFindReplaceTarget findReplaceTarget; @@ -64,28 +62,33 @@ class OverlayAccess implements IFindReplaceUIAccess { private ToolItem replaceAllButton; - private final Runnable closeOperation; - - private final Accessor dialogAccessor; + private final FindReplaceOverlay overlay; - private final Supplier shellRetriever; + private final Shell shell; - OverlayAccess(IFindReplaceTarget findReplaceTarget, Accessor findReplaceOverlayAccessor) { + OverlayAccess(IFindReplaceTarget findReplaceTarget, FindReplaceOverlay findReplaceOverlay) { this.findReplaceTarget= findReplaceTarget; - dialogAccessor= findReplaceOverlayAccessor; - find= (HistoryTextWrapper) findReplaceOverlayAccessor.get("searchBar"); - replace= (HistoryTextWrapper) findReplaceOverlayAccessor.get("replaceBar"); - caseSensitive= (ToolItem) findReplaceOverlayAccessor.get("caseSensitiveSearchButton"); - wholeWord= (ToolItem) findReplaceOverlayAccessor.get("wholeWordSearchButton"); - regEx= (ToolItem) findReplaceOverlayAccessor.get("regexSearchButton"); - searchForward= (ToolItem) findReplaceOverlayAccessor.get("searchDownButton"); - searchBackward= (ToolItem) findReplaceOverlayAccessor.get("searchUpButton"); - closeOperation= () -> findReplaceOverlayAccessor.invoke("close", null); - openReplaceDialog= (Button) findReplaceOverlayAccessor.get("replaceToggle"); - replaceButton= (ToolItem) findReplaceOverlayAccessor.get("replaceButton"); - replaceAllButton= (ToolItem) findReplaceOverlayAccessor.get("replaceAllButton"); - inSelection= (ToolItem) findReplaceOverlayAccessor.get("searchInSelectionButton"); - shellRetriever= () -> ((Shell) findReplaceOverlayAccessor.invoke("getShell", null)); + overlay= findReplaceOverlay; + shell= overlay.getShell(); + WidgetExtractor widgetExtractor= new WidgetExtractor(FindReplaceOverlay.ID_DATA_KEY, shell); + find= widgetExtractor.findHistoryTextWrapper("searchInput"); + caseSensitive= widgetExtractor.findToolItem("caseSensitiveSearch"); + wholeWord= widgetExtractor.findToolItem("wholeWordSearch"); + regEx= widgetExtractor.findToolItem("regExSearch"); + inSelection= widgetExtractor.findToolItem("searchInSelection"); + searchForward= widgetExtractor.findToolItem("searchForward"); + searchBackward= widgetExtractor.findToolItem("searchBackward"); + openReplaceDialog= widgetExtractor.findButton("replaceToggle"); + extractReplaceWidgets(); + } + + private void extractReplaceWidgets() { + if (!isReplaceDialogOpen() && Objects.nonNull(openReplaceDialog)) { + WidgetExtractor widgetExtractor= new WidgetExtractor(FindReplaceOverlay.ID_DATA_KEY, shell); + replace= widgetExtractor.findHistoryTextWrapper("replaceInput"); + replaceButton= widgetExtractor.findToolItem("replaceOne"); + replaceAllButton= widgetExtractor.findToolItem("replaceAll"); + } } private void restoreInitialConfiguration() { @@ -100,12 +103,12 @@ private void restoreInitialConfiguration() { public void closeAndRestore() { restoreInitialConfiguration(); assertInitialConfiguration(); - closeOperation.run(); + overlay.close(); } @Override public void close() { - closeOperation.run(); + overlay.close(); } @Override @@ -234,15 +237,13 @@ public void performReplace() { } public boolean isReplaceDialogOpen() { - return dialogAccessor.getBoolean("replaceBarOpen"); + return replace != null; } public void openReplaceDialog() { if (!isReplaceDialogOpen() && Objects.nonNull(openReplaceDialog)) { openReplaceDialog.notifyListeners(SWT.Selection, null); - replace= (HistoryTextWrapper) dialogAccessor.get("replaceBar"); - replaceButton= (ToolItem) dialogAccessor.get("replaceButton"); - replaceAllButton= (ToolItem) dialogAccessor.get("replaceAllButton"); + extractReplaceWidgets(); } } @@ -309,15 +310,14 @@ public void assertEnabled(SearchOptions option) { @Override public boolean isShown() { - return shellRetriever.get() != null && shellRetriever.get().isVisible(); + return !shell.isDisposed() && shell.isVisible(); } @Override public boolean hasFocus() { - Shell overlayShell= shellRetriever.get(); - Control focusControl= overlayShell.getDisplay().getFocusControl(); + Control focusControl= shell.getDisplay().getFocusControl(); Shell focusControlShell= focusControl != null ? focusControl.getShell() : null; - return focusControlShell == overlayShell; + return focusControlShell == shell; } } diff --git a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/DialogAccess.java b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/DialogAccess.java index 453e1f84317..4a4a75ed5d5 100644 --- a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/DialogAccess.java +++ b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/DialogAccess.java @@ -18,81 +18,77 @@ import java.util.Arrays; import java.util.Set; -import java.util.function.Supplier; import java.util.stream.Collectors; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Shell; -import org.eclipse.text.tests.Accessor; +import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.text.IFindReplaceTarget; import org.eclipse.jface.text.IFindReplaceTargetExtension; import org.eclipse.ui.internal.findandreplace.IFindReplaceUIAccess; import org.eclipse.ui.internal.findandreplace.SearchOptions; +import org.eclipse.ui.internal.findandreplace.WidgetExtractor; class DialogAccess implements IFindReplaceUIAccess { - private final IFindReplaceTarget findReplaceTarget; - - Combo findCombo; + private static final String DATA_ID = "org.eclipse.ui.texteditor.FindReplaceDialog.id"; - Combo replaceCombo; - - Button forwardRadioButton; + private final IFindReplaceTarget findReplaceTarget; - Button globalRadioButton; + private final Dialog findReplaceDialog; - Button searchInRangeRadioButton; + private final Combo findCombo; - Button caseCheckBox; + private final Combo replaceCombo; - Button wrapCheckBox; + private final Button forwardRadioButton; - Button wholeWordCheckBox; + private final Button globalRadioButton; - Button incrementalCheckBox; + private final Button searchInRangeRadioButton; - Button regExCheckBox; + private final Button caseCheckBox; - Button findButton; + private final Button wrapCheckBox; - Button replaceButton; + private final Button wholeWordCheckBox; - Button replaceFindButton; + private final Button incrementalCheckBox; - Button replaceAllButton; + private final Button regExCheckBox; - private Supplier shellRetriever; + private final Button replaceButton; - private Runnable closeOperation; + private final Button replaceFindButton; - Accessor dialogAccessor; + private final Button replaceAllButton; - DialogAccess(IFindReplaceTarget findReplaceTarget, Accessor findReplaceDialogAccessor) { + DialogAccess(IFindReplaceTarget findReplaceTarget, Dialog findReplaceDialog) { this.findReplaceTarget= findReplaceTarget; - dialogAccessor= findReplaceDialogAccessor; - findCombo= (Combo) findReplaceDialogAccessor.get("fFindField"); - replaceCombo= (Combo) findReplaceDialogAccessor.get("fReplaceField"); - forwardRadioButton= (Button) findReplaceDialogAccessor.get("fForwardRadioButton"); - globalRadioButton= (Button) findReplaceDialogAccessor.get("fGlobalRadioButton"); - searchInRangeRadioButton= (Button) findReplaceDialogAccessor.get("fSelectedRangeRadioButton"); - caseCheckBox= (Button) findReplaceDialogAccessor.get("fCaseCheckBox"); - wrapCheckBox= (Button) findReplaceDialogAccessor.get("fWrapCheckBox"); - wholeWordCheckBox= (Button) findReplaceDialogAccessor.get("fWholeWordCheckBox"); - incrementalCheckBox= (Button) findReplaceDialogAccessor.get("fIncrementalCheckBox"); - regExCheckBox= (Button) findReplaceDialogAccessor.get("fIsRegExCheckBox"); - shellRetriever= () -> ((Shell) findReplaceDialogAccessor.get("fActiveShell")); - closeOperation= () -> findReplaceDialogAccessor.invoke("close", null); - findButton= (Button) findReplaceDialogAccessor.get("fFindNextButton"); - replaceButton= (Button) findReplaceDialogAccessor.get("fReplaceSelectionButton"); - replaceFindButton= (Button) findReplaceDialogAccessor.get("fReplaceFindButton"); - replaceAllButton= (Button) findReplaceDialogAccessor.get("fReplaceAllButton"); + this.findReplaceDialog= findReplaceDialog; + WidgetExtractor widgetExtractor= new WidgetExtractor(DATA_ID, findReplaceDialog.getShell()); + findCombo= widgetExtractor.findCombo("searchInput"); + replaceCombo= widgetExtractor.findCombo("replaceInput"); + forwardRadioButton= widgetExtractor.findButton("searchForward"); + globalRadioButton= widgetExtractor.findButton("globalSearch"); + searchInRangeRadioButton= widgetExtractor.findButton("searchInSelection"); + caseCheckBox= widgetExtractor.findButton("caseSensitiveSearch"); + wrapCheckBox= widgetExtractor.findButton("wrappedSearch"); + wholeWordCheckBox= widgetExtractor.findButton("wholeWordSearch"); + incrementalCheckBox= widgetExtractor.findButton("incrementalSearch"); + regExCheckBox= widgetExtractor.findButton("regExSearch"); + + replaceButton= widgetExtractor.findButton("replaceOne"); + replaceFindButton= widgetExtractor.findButton("replaceFindOne"); + replaceAllButton= widgetExtractor.findButton("replaceAll"); } void restoreInitialConfiguration() { @@ -153,17 +149,19 @@ public void unselect(SearchOptions option) { public void closeAndRestore() { restoreInitialConfiguration(); assertInitialConfiguration(); - closeOperation.run(); + findReplaceDialog.close(); } @Override public void close() { - closeOperation.run(); + findReplaceDialog.close(); } @Override public boolean hasFocus() { - return shellRetriever.get() != null; + Control focusControl= findReplaceDialog.getShell().getDisplay().getFocusControl(); + Shell focusControlShell= focusControl != null ? focusControl.getShell() : null; + return focusControlShell == findReplaceDialog.getShell(); } @Override @@ -296,7 +294,7 @@ private Set getSelectedOptions() { @Override public boolean isShown() { - return shellRetriever.get() != null; + return findReplaceDialog.getShell().isVisible(); } } diff --git a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/FindReplaceDialogTest.java b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/FindReplaceDialogTest.java index f6a992264e7..2fa0fb63b03 100644 --- a/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/FindReplaceDialogTest.java +++ b/tests/org.eclipse.ui.workbench.texteditor.tests/src/org/eclipse/ui/workbench/texteditor/tests/FindReplaceDialogTest.java @@ -28,6 +28,7 @@ import org.eclipse.text.tests.Accessor; +import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.util.Util; import org.eclipse.jface.text.IFindReplaceTarget; @@ -50,8 +51,8 @@ public DialogAccess openUIFromTextViewer(TextViewer viewer) { } Accessor fFindReplaceDialogStubAccessor= new Accessor(fFindReplaceDialogStub, "org.eclipse.ui.texteditor.FindReplaceAction$FindReplaceDialogStub", getClass().getClassLoader()); - Accessor dialogAccessor= new Accessor(fFindReplaceDialogStubAccessor.invoke("getDialog", null), "org.eclipse.ui.texteditor.FindReplaceDialog", getClass().getClassLoader()); - return new DialogAccess(getFindReplaceTarget(), dialogAccessor); + Dialog dialog= (Dialog) fFindReplaceDialogStubAccessor.invoke("getDialog", null); + return new DialogAccess(getFindReplaceTarget(), dialog); } @Test @@ -61,7 +62,7 @@ public void testFocusNotChangedWhenEnterPressed() { initializeTextViewerWithFindReplaceUI("line\nline\nline"); DialogAccess dialog= getDialog(); - dialog.findCombo.setFocus(); + dialog.getFindCombo().setFocus(); dialog.setFindText("line"); dialog.simulateKeyboardInteractionInFindInputField(SWT.CR, false); ensureHasFocusOnGTK();