Skip to content

Commit b6afc55

Browse files
committed
Changed the functionality of the regex search with control decorations
1 parent 9a60f52 commit b6afc55

File tree

9 files changed

+154
-38
lines changed

9 files changed

+154
-38
lines changed

bundles/org.eclipse.search.core/META-INF/MANIFEST.MF

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,5 @@ Require-Bundle:
1919
org.eclipse.text;bundle-version="3.13.100"
2020
Bundle-RequiredExecutionEnvironment: JavaSE-17
2121
Automatic-Module-Name: org.eclipse.search.core
22+
Import-Package: org.eclipse.jface.fieldassist,
23+
org.eclipse.swt.graphics

bundles/org.eclipse.search/META-INF/MANIFEST.MF

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Export-Package: org.eclipse.search.internal.ui;x-internal:=true,
1717
org.eclipse.search2.internal.ui.basic.views;x-internal:=true,
1818
org.eclipse.search2.internal.ui.text;x-internal:=true,
1919
org.eclipse.search2.internal.ui.text2;x-internal:=true
20+
Import-Package: org.eclipse.ui.internal.findandreplace
2021
Require-Bundle:
2122
org.eclipse.core.runtime;bundle-version="[3.29.0,4.0.0)",
2223
org.eclipse.core.resources;bundle-version="[3.14.0,4.0.0)",
@@ -29,7 +30,8 @@ Require-Bundle:
2930
org.eclipse.ui.forms;bundle-version="[3.4.0,4.0.0)",
3031
org.eclipse.ltk.core.refactoring;bundle-version="[3.5.0,4.0.0)",
3132
org.eclipse.ltk.ui.refactoring;bundle-version="[3.5.0,4.0.0)",
32-
org.eclipse.search.core;bundle-version="[3.16.0,4.0.0)";visibility:=reexport
33+
org.eclipse.search.core;bundle-version="[3.16.0,4.0.0)";visibility:=reexport,
34+
org.eclipse.ui.browser;bundle-version="3.8.400"
3335
Bundle-RequiredExecutionEnvironment: JavaSE-17
3436
Automatic-Module-Name: org.eclipse.search
3537
Service-Component: OSGI-INF/*.xml

bundles/org.eclipse.search/search/org/eclipse/search/internal/ui/text/TextSearchPage.java

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
import org.eclipse.jface.dialogs.ErrorDialog;
5555
import org.eclipse.jface.dialogs.IDialogSettings;
5656
import org.eclipse.jface.fieldassist.ComboContentAdapter;
57-
import org.eclipse.jface.resource.JFaceColors;
57+
import org.eclipse.jface.fieldassist.ControlDecoration;
5858
import org.eclipse.jface.viewers.ISelection;
5959

6060
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
@@ -68,6 +68,7 @@
6868
import org.eclipse.ui.IWorkingSetManager;
6969
import org.eclipse.ui.PlatformUI;
7070
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
71+
import org.eclipse.ui.internal.SearchDecoration;
7172

7273
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
7374

@@ -140,6 +141,7 @@ public class TextSearchPage extends DialogPage implements ISearchPage, IReplaceP
140141
*/
141142
private String[] fPreviousExtensions;
142143
private Label fFileNamePatternDescription;
144+
private ControlDecoration decoration;
143145

144146

145147
private static class SearchPatternData {
@@ -450,6 +452,7 @@ public void setVisible(boolean visible) {
450452
}
451453

452454
final void updateOKStatus() {
455+
decoration.hide();
453456
boolean regexStatus= validateRegex();
454457
getContainer().setPerformActionEnabled(regexStatus);
455458
}
@@ -481,22 +484,19 @@ public void createControl(Composite parent) {
481484
PlatformUI.getWorkbench().getHelpSystem().setHelp(result, ISearchHelpContextIds.TEXT_SEARCH_PAGE);
482485
}
483486

484-
private boolean validateRegex() {
487+
private boolean validateRegex() {
488+
SearchDecoration sDecoration = new SearchDecoration();
489+
485490
if (fIsRegExCheckbox.getSelection()) {
486491
try {
487492
PatternConstructor.createPattern(fPattern.getText(), fIsCaseSensitive, true);
488493
} catch (PatternSyntaxException e) {
489-
String locMessage= e.getLocalizedMessage();
490-
int i= 0;
491-
while (i < locMessage.length() && "\n\r".indexOf(locMessage.charAt(i)) == -1) { //$NON-NLS-1$
492-
i++;
493-
}
494-
statusMessage(true, locMessage.substring(0, i)); // only take first line
494+
495+
sDecoration.decorateA(decoration, fPattern.getText());
495496
return false;
496497
}
497-
statusMessage(false, ""); //$NON-NLS-1$
498498
} else {
499-
statusMessage(false, SearchMessages.SearchPage_containingText_hint);
499+
decoration.hide();
500500
}
501501
return true;
502502
}
@@ -510,8 +510,11 @@ private void addTextPatternControls(Composite group) {
510510
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
511511
label.setFont(group.getFont());
512512

513+
513514
// Pattern combo
514515
fPattern= new Combo(group, SWT.SINGLE | SWT.BORDER);
516+
decoration = new ControlDecoration(fPattern, SWT.BOTTOM | SWT.LEFT);
517+
515518
// Not done here to prevent page from resizing
516519
// fPattern.setItems(getPreviousSearchPatterns());
517520
fPattern.addSelectionListener(new SelectionAdapter() {
@@ -561,7 +564,6 @@ public void widgetSelected(SelectionEvent e) {
561564
public void widgetSelected(SelectionEvent e) {
562565
fIsRegExSearch= fIsRegExCheckbox.getSelection();
563566
updateOKStatus();
564-
565567
writeConfiguration();
566568
fPatterFieldContentAssist.setEnabled(fIsRegExSearch);
567569
fIsWholeWordCheckbox.setEnabled(!fIsRegExSearch);
@@ -860,15 +862,4 @@ private void writeConfiguration() {
860862

861863
}
862864

863-
private void statusMessage(boolean error, String message) {
864-
fStatusLabel.setText(message);
865-
if (error) {
866-
fStatusLabel.setForeground(JFaceColors.getErrorText(fStatusLabel.getDisplay()));
867-
}
868-
else {
869-
// use same color as another label to respect styling
870-
fStatusLabel.setForeground(fFileNamePatternDescription.getForeground());
871-
}
872-
}
873-
874865
}

bundles/org.eclipse.ui.workbench.texteditor/META-INF/MANIFEST.MF

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,4 @@ Require-Bundle:
3636
org.eclipse.jface.notifications
3737
Bundle-RequiredExecutionEnvironment: JavaSE-17
3838
Automatic-Module-Name: org.eclipse.ui.workbench.texteditor
39+
Import-Package: org.eclipse.search.internal.core.text

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.eclipse.jface.dialogs.IDialogSettings;
5555
import org.eclipse.jface.dialogs.IPageChangedListener;
5656
import org.eclipse.jface.dialogs.PageChangedEvent;
57+
import org.eclipse.jface.fieldassist.ControlDecoration;
5758
import org.eclipse.jface.fieldassist.TextContentAdapter;
5859
import org.eclipse.jface.layout.GridDataFactory;
5960
import org.eclipse.jface.layout.GridLayoutFactory;
@@ -70,6 +71,7 @@
7071
import org.eclipse.ui.IWorkbenchPartReference;
7172
import org.eclipse.ui.PlatformUI;
7273
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
74+
import org.eclipse.ui.internal.SearchDecoration;
7375
import org.eclipse.ui.internal.findandreplace.FindReplaceLogic;
7476
import org.eclipse.ui.internal.findandreplace.FindReplaceMessages;
7577
import org.eclipse.ui.internal.findandreplace.HistoryStore;
@@ -147,8 +149,13 @@ private final class KeyboardShortcuts {
147149
private Color normalTextForegroundColor;
148150
private boolean positionAtTop = true;
149151
private final TargetPartVisibilityHandler targetPartVisibilityHandler;
152+
153+
private ControlDecoration decoration;
154+
private SearchDecoration dec;
155+
150156
private ContentAssistCommandAdapter contentAssistSearchField, contentAssistReplaceField;
151157

158+
152159
public FindReplaceOverlay(Shell parent, IWorkbenchPart part, IFindReplaceTarget target) {
153160
super(parent);
154161
createFindReplaceLogic(target);
@@ -158,6 +165,7 @@ public FindReplaceOverlay(Shell parent, IWorkbenchPart part, IFindReplaceTarget
158165
targetPart = part;
159166
targetPartVisibilityHandler = new TargetPartVisibilityHandler(targetPart, this::asyncExecIfOpen, this::close,
160167
this::updatePlacementAndVisibility);
168+
this.dec = new SearchDecoration();
161169
}
162170

163171
@Override
@@ -562,6 +570,11 @@ private void createRegexSearchButton() {
562570
wholeWordSearchButton.setEnabled(findReplaceLogic.isAvailable(SearchOptions.WHOLE_WORD));
563571
updateIncrementalSearch();
564572
updateContentAssistAvailability();
573+
if (!regexSearchButton.getSelection()) {
574+
decoration.hide();
575+
} else {
576+
dec.decorateA(decoration, getFindString());
577+
}
565578
}).withShortcuts(KeyboardShortcuts.OPTION_REGEX).build();
566579
regexSearchButton.setSelection(findReplaceLogic.isActive(SearchOptions.REGEX));
567580
}
@@ -631,6 +644,7 @@ private void createSearchBar() {
631644
HistoryStore searchHistory = new HistoryStore(getDialogSettings(), "searchhistory", //$NON-NLS-1$
632645
HISTORY_SIZE);
633646
searchBar = new HistoryTextWrapper(searchHistory, searchBarContainer, SWT.SINGLE);
647+
decoration = new ControlDecoration(searchBar, SWT.BOTTOM | SWT.LEFT);
634648
GridDataFactory.fillDefaults().grab(true, true).align(GridData.FILL, GridData.FILL).applyTo(searchBar);
635649
searchBar.forceFocus();
636650
searchBar.selectAll();
@@ -655,6 +669,8 @@ public void focusLost(FocusEvent e) {
655669
});
656670
searchBar.setMessage(FindReplaceMessages.FindReplaceOverlay_searchBar_message);
657671
contentAssistSearchField = createContentAssistField(searchBar, true);
672+
673+
decorate();
658674
}
659675

660676
private void updateIncrementalSearch() {
@@ -970,6 +986,7 @@ private void performSearch(boolean forward) {
970986
activateInFindReplacerIf(SearchOptions.FORWARD, oldForwardSearchSetting);
971987
evaluateFindReplaceStatus();
972988
searchBar.storeHistory();
989+
973990
}
974991

975992
private void updateFromTargetSelection() {
@@ -1040,4 +1057,17 @@ private void setContentAssistsEnablement(boolean enable) {
10401057
private void updateContentAssistAvailability() {
10411058
setContentAssistsEnablement(findReplaceLogic.isAvailableAndActive(SearchOptions.REGEX));
10421059
}
1060+
1061+
public void decorate() {
1062+
// decoration = new ControlDecoration(searchBar, SWT.BOTTOM | SWT.LEFT);
1063+
1064+
searchBar.addModifyListener(event -> {
1065+
if (regexSearchButton.getSelection()) {
1066+
dec.decorateA(decoration, getFindString());
1067+
} else
1068+
decoration.hide();
1069+
});
1070+
1071+
}
1072+
10431073
}

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

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@
4949
import org.eclipse.jface.dialogs.Dialog;
5050
import org.eclipse.jface.dialogs.IDialogSettings;
5151
import org.eclipse.jface.fieldassist.ComboContentAdapter;
52+
import org.eclipse.jface.fieldassist.ControlDecoration;
5253
import org.eclipse.jface.fieldassist.FieldDecoration;
5354
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
54-
import org.eclipse.jface.resource.JFaceColors;
5555
import org.eclipse.jface.util.Util;
5656

5757
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
@@ -64,13 +64,12 @@
6464

6565
import org.eclipse.ui.PlatformUI;
6666
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
67+
import org.eclipse.ui.internal.SearchDecoration;
6768
import org.eclipse.ui.internal.findandreplace.FindReplaceLogic;
68-
import org.eclipse.ui.internal.findandreplace.FindReplaceLogicMessageGenerator;
6969
import org.eclipse.ui.internal.findandreplace.FindReplaceMessages;
7070
import org.eclipse.ui.internal.findandreplace.HistoryStore;
7171
import org.eclipse.ui.internal.findandreplace.IFindReplaceLogic;
7272
import org.eclipse.ui.internal.findandreplace.SearchOptions;
73-
import org.eclipse.ui.internal.findandreplace.status.IFindReplaceStatus;
7473
import org.eclipse.ui.internal.texteditor.SWTUtil;
7574

7675
/**
@@ -194,6 +193,8 @@ public void modifyText(ModifyEvent e) {
194193
* @since 3.0
195194
*/
196195
private boolean fGiveFocusToFindField = true;
196+
private ControlDecoration decoration;
197+
private SearchDecoration dec = new SearchDecoration();
197198

198199
/**
199200
* Holds the mnemonic/button pairs for all buttons.
@@ -631,6 +632,8 @@ private Composite createInputPanel(Composite parent) {
631632
FindReplaceDocumentAdapterContentProposalProvider findProposer = new FindReplaceDocumentAdapterContentProposalProvider(
632633
true);
633634
fFindField = new Combo(panel, SWT.DROP_DOWN | SWT.BORDER);
635+
decoration = new ControlDecoration(fFindField, SWT.BOTTOM | SWT.LEFT);
636+
634637
fContentAssistFindField = new ContentAssistCommandAdapter(fFindField, contentAdapter, findProposer,
635638
ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, new char[0], true);
636639
setGridData(fFindField, SWT.FILL, true, SWT.CENTER, false);
@@ -747,6 +750,11 @@ public void widgetDefaultSelected(SelectionEvent e) {
747750
@Override
748751
public void widgetSelected(SelectionEvent e) {
749752
boolean newState = fIsRegExCheckBox.getSelection();
753+
if (!newState) {
754+
decoration.hide();
755+
} else {
756+
dec.decorateA(decoration, getFindString());
757+
}
750758
setupFindReplaceLogic();
751759
storeSettings();
752760
updateButtonState();
@@ -1047,9 +1055,10 @@ private void addDecorationMargin(Control control) {
10471055
if (!(layoutData instanceof GridData))
10481056
return;
10491057
GridData gd = (GridData) layoutData;
1050-
FieldDecoration dec = FieldDecorationRegistry.getDefault()
1058+
1059+
FieldDecoration dec_one = FieldDecorationRegistry.getDefault()
10511060
.getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
1052-
gd.horizontalIndent = dec.getImage().getBounds().width;
1061+
gd.horizontalIndent = dec_one.getImage().getBounds().width;
10531062
}
10541063

10551064
/**
@@ -1336,15 +1345,18 @@ private void activateInFindReplaceLogicIf(SearchOptions option, boolean shouldAc
13361345
* Evaluate the status of the FindReplaceLogic object.
13371346
*/
13381347
private void evaluateFindReplaceStatus() {
1339-
IFindReplaceStatus status = findReplaceLogic.getStatus();
1348+
decorate();
1349+
}
13401350

1341-
String dialogMessage = status.accept(new FindReplaceLogicMessageGenerator());
1342-
fStatusLabel.setText(dialogMessage);
1343-
if (status.isInputValid()) {
1344-
fStatusLabel.setForeground(fReplaceLabel.getForeground());
1345-
} else {
1346-
fStatusLabel.setForeground(JFaceColors.getErrorText(fStatusLabel.getDisplay()));
1347-
}
1351+
public void decorate() {
1352+
1353+
fFindField.addModifyListener(event -> {
1354+
if (fIsRegExCheckBox.getSelection()) {
1355+
dec.decorateA(decoration, fFindField.getText());
1356+
} else {
1357+
decoration.hide();
1358+
}
1359+
});
13481360
}
13491361

13501362
private String getCurrentSelection() {

bundles/org.eclipse.ui/META-INF/MANIFEST.MF

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ Manifest-Version: 1.0
22
Bundle-ManifestVersion: 2
33
Bundle-Name: %Plugin.name
44
Bundle-SymbolicName: org.eclipse.ui; singleton:=true
5-
Bundle-Version: 3.206.200.qualifier
5+
Bundle-Version: 3.207.0.qualifier
6+
Export-Package: org.eclipse.ui.internal
67
Bundle-Activator: org.eclipse.ui.internal.UIPlugin
78
Bundle-ActivationPolicy: lazy
89
Bundle-Vendor: %Plugin.providerName
910
Bundle-Localization: plugin
10-
Export-Package: org.eclipse.ui.internal;x-internal:=true
1111
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.29.0,4.0.0)",
1212
org.eclipse.swt;bundle-version="[3.126.0,4.0.0)";visibility:=reexport,
1313
org.eclipse.jface;bundle-version="[3.34.0,4.0.0)";visibility:=reexport,

0 commit comments

Comments
 (0)