Skip to content

Commit

Permalink
Changed the functionality of the regex search with control decorations
Browse files Browse the repository at this point in the history
  • Loading branch information
jannisCode committed Oct 11, 2024
1 parent 83bf670 commit e65493d
Show file tree
Hide file tree
Showing 5 changed files with 148 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.fieldassist.ComboContentAdapter;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.viewers.ISelection;

import org.eclipse.jface.text.FindReplaceDocumentAdapter;
Expand All @@ -68,6 +68,7 @@
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
import org.eclipse.ui.internal.SearchDecoration;

import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;

Expand Down Expand Up @@ -140,6 +141,8 @@ public class TextSearchPage extends DialogPage implements ISearchPage, IReplaceP
*/
private String[] fPreviousExtensions;
private Label fFileNamePatternDescription;
private ControlDecoration fPatternDecoration;



private static class SearchPatternData {
Expand Down Expand Up @@ -450,6 +453,7 @@ public void setVisible(boolean visible) {
}

final void updateOKStatus() {
fPatternDecoration.hide();
boolean regexStatus= validateRegex();
getContainer().setPerformActionEnabled(regexStatus);
}
Expand Down Expand Up @@ -481,22 +485,19 @@ public void createControl(Composite parent) {
PlatformUI.getWorkbench().getHelpSystem().setHelp(result, ISearchHelpContextIds.TEXT_SEARCH_PAGE);
}

private boolean validateRegex() {
private boolean validateRegex() {

if (fIsRegExCheckbox.getSelection()) {
try {
PatternConstructor.createPattern(fPattern.getText(), fIsCaseSensitive, true);
} catch (PatternSyntaxException e) {
String locMessage= e.getLocalizedMessage();
int i= 0;
while (i < locMessage.length() && "\n\r".indexOf(locMessage.charAt(i)) == -1) { //$NON-NLS-1$
i++;
}
statusMessage(true, locMessage.substring(0, i)); // only take first line
SearchDecoration searchDecoration = new SearchDecoration();

searchDecoration.decorateA(fPatternDecoration, fPattern.getText());
return false;
}
statusMessage(false, ""); //$NON-NLS-1$
} else {
statusMessage(false, SearchMessages.SearchPage_containingText_hint);
fPatternDecoration.hide();
}
return true;
}
Expand All @@ -510,8 +511,11 @@ private void addTextPatternControls(Composite group) {
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
label.setFont(group.getFont());


// Pattern combo
fPattern= new Combo(group, SWT.SINGLE | SWT.BORDER);
fPatternDecoration = new ControlDecoration(fPattern, SWT.BOTTOM | SWT.LEFT);

// Not done here to prevent page from resizing
// fPattern.setItems(getPreviousSearchPatterns());
fPattern.addSelectionListener(new SelectionAdapter() {
Expand Down Expand Up @@ -561,7 +565,6 @@ public void widgetSelected(SelectionEvent e) {
public void widgetSelected(SelectionEvent e) {
fIsRegExSearch= fIsRegExCheckbox.getSelection();
updateOKStatus();

writeConfiguration();
fPatterFieldContentAssist.setEnabled(fIsRegExSearch);
fIsWholeWordCheckbox.setEnabled(!fIsRegExSearch);
Expand Down Expand Up @@ -860,15 +863,4 @@ private void writeConfiguration() {

}

private void statusMessage(boolean error, String message) {
fStatusLabel.setText(message);
if (error) {
fStatusLabel.setForeground(JFaceColors.getErrorText(fStatusLabel.getDisplay()));
}
else {
// use same color as another label to respect styling
fStatusLabel.setForeground(fFileNamePatternDescription.getForeground());
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
Expand All @@ -67,6 +68,7 @@
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
import org.eclipse.ui.internal.SearchDecoration;
import org.eclipse.ui.internal.findandreplace.FindReplaceLogic;
import org.eclipse.ui.internal.findandreplace.FindReplaceMessages;
import org.eclipse.ui.internal.findandreplace.HistoryStore;
Expand Down Expand Up @@ -146,8 +148,13 @@ private final class KeyboardShortcuts {
private Color normalTextForegroundColor;
private boolean positionAtTop = true;
private final TargetPartVisibilityHandler targetPartVisibilityHandler;

private ControlDecoration controldecoration;
private SearchDecoration searchDecoration;

private ContentAssistCommandAdapter contentAssistSearchField, contentAssistReplaceField;


public FindReplaceOverlay(Shell parent, IWorkbenchPart part, IFindReplaceTarget target) {
super(parent);
createFindReplaceLogic(target);
Expand All @@ -157,6 +164,7 @@ public FindReplaceOverlay(Shell parent, IWorkbenchPart part, IFindReplaceTarget
targetPart = part;
targetPartVisibilityHandler = new TargetPartVisibilityHandler(targetPart, this::asyncExecIfOpen, this::close,
this::updatePlacementAndVisibility);
this.searchDecoration = new SearchDecoration();
}

@Override
Expand Down Expand Up @@ -581,6 +589,11 @@ private void createRegexSearchButton() {
wholeWordSearchButton.setEnabled(findReplaceLogic.isAvailable(SearchOptions.WHOLE_WORD));
updateIncrementalSearch();
updateContentAssistAvailability();
if (!regexSearchButton.getSelection()) {
controldecoration.hide();
} else {
searchDecoration.decorateA(controldecoration, getFindString());
}
}).withShortcuts(KeyboardShortcuts.OPTION_REGEX).build();
regexSearchButton.setSelection(findReplaceLogic.isActive(SearchOptions.REGEX));
}
Expand Down Expand Up @@ -650,6 +663,7 @@ private void createSearchBar() {
HistoryStore searchHistory = new HistoryStore(getDialogSettings(), "searchhistory", //$NON-NLS-1$
HISTORY_SIZE);
searchBar = new HistoryTextWrapper(searchHistory, searchBarContainer, SWT.SINGLE);
controldecoration = new ControlDecoration(searchBar, SWT.BOTTOM | SWT.LEFT);
GridDataFactory.fillDefaults().grab(true, true).align(GridData.FILL, GridData.FILL).applyTo(searchBar);
searchBar.forceFocus();
searchBar.selectAll();
Expand All @@ -674,6 +688,8 @@ public void focusLost(FocusEvent e) {
});
searchBar.setMessage(FindReplaceMessages.FindReplaceOverlay_searchBar_message);
contentAssistSearchField = createContentAssistField(searchBar, true);

decorate();
}

private void updateIncrementalSearch() {
Expand Down Expand Up @@ -1061,4 +1077,15 @@ private void setContentAssistsEnablement(boolean enable) {
private void updateContentAssistAvailability() {
setContentAssistsEnablement(findReplaceLogic.isAvailableAndActive(SearchOptions.REGEX));
}

private void decorate() {
searchBar.addModifyListener(event -> {
if (regexSearchButton.getSelection()) {
searchDecoration.decorateA(controldecoration, getFindString());
} else
controldecoration.hide();
});

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.fieldassist.ComboContentAdapter;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.util.Util;

import org.eclipse.jface.text.FindReplaceDocumentAdapter;
Expand All @@ -64,13 +64,12 @@

import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
import org.eclipse.ui.internal.SearchDecoration;
import org.eclipse.ui.internal.findandreplace.FindReplaceLogic;
import org.eclipse.ui.internal.findandreplace.FindReplaceLogicMessageGenerator;
import org.eclipse.ui.internal.findandreplace.FindReplaceMessages;
import org.eclipse.ui.internal.findandreplace.HistoryStore;
import org.eclipse.ui.internal.findandreplace.IFindReplaceLogic;
import org.eclipse.ui.internal.findandreplace.SearchOptions;
import org.eclipse.ui.internal.findandreplace.status.IFindReplaceStatus;
import org.eclipse.ui.internal.texteditor.SWTUtil;

/**
Expand Down Expand Up @@ -147,7 +146,8 @@ public void modifyText(ModifyEvent e) {
fIgnoreNextEvent = false;
return;
}
evaluateFindReplaceStatus();
modificationHandler.run();
decorate();

updateButtonState(!findReplaceLogic.isActive(SearchOptions.INCREMENTAL));
}
Expand Down Expand Up @@ -196,6 +196,8 @@ public void modifyText(ModifyEvent e) {
* @since 3.0
*/
private boolean fGiveFocusToFindField = true;
private ControlDecoration fFindFieldDecoration;
private SearchDecoration fFindFieldSearchDecoration = new SearchDecoration();

/**
* Holds the mnemonic/button pairs for all buttons.
Expand Down Expand Up @@ -311,7 +313,7 @@ public void widgetSelected(SelectionEvent e) {
writeSelection();
updateButtonState(!somethingFound);
updateFindHistory();
evaluateFindReplaceStatus();
decorate();
}
});
setGridData(fFindNextButton, SWT.FILL, true, SWT.FILL, false);
Expand All @@ -325,7 +327,7 @@ public void widgetSelected(SelectionEvent e) {
writeSelection();
updateButtonState();
updateFindAndReplaceHistory();
evaluateFindReplaceStatus();
decorate();
}
});
setGridData(fSelectAllButton, SWT.FILL, true, SWT.FILL, false);
Expand All @@ -342,7 +344,7 @@ public void widgetSelected(SelectionEvent e) {
}
updateButtonState();
updateFindAndReplaceHistory();
evaluateFindReplaceStatus();
decorate();
}
});
setGridData(fReplaceFindButton, SWT.FILL, false, SWT.FILL, false);
Expand All @@ -356,7 +358,7 @@ public void widgetSelected(SelectionEvent e) {
}
updateButtonState();
updateFindAndReplaceHistory();
evaluateFindReplaceStatus();
decorate();
}
});
setGridData(fReplaceSelectionButton, SWT.FILL, false, SWT.FILL, false);
Expand All @@ -370,7 +372,7 @@ public void widgetSelected(SelectionEvent e) {
writeSelection();
updateButtonState();
updateFindAndReplaceHistory();
evaluateFindReplaceStatus();
decorate();
}
});
setGridData(fReplaceAllButton, SWT.FILL, true, SWT.FILL, false);
Expand Down Expand Up @@ -634,6 +636,8 @@ private Composite createInputPanel(Composite parent) {
FindReplaceDocumentAdapterContentProposalProvider findProposer = new FindReplaceDocumentAdapterContentProposalProvider(
true);
fFindField = new Combo(panel, SWT.DROP_DOWN | SWT.BORDER);
fFindFieldDecoration = new ControlDecoration(fFindField, SWT.BOTTOM | SWT.LEFT);

fContentAssistFindField = new ContentAssistCommandAdapter(fFindField, contentAdapter, findProposer,
ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, new char[0], true);
setGridData(fFindField, SWT.FILL, true, SWT.CENTER, false);
Expand Down Expand Up @@ -750,6 +754,11 @@ public void widgetDefaultSelected(SelectionEvent e) {
@Override
public void widgetSelected(SelectionEvent e) {
boolean newState = fIsRegExCheckBox.getSelection();
if (!newState) {
fFindFieldDecoration.hide();
} else {
fFindFieldSearchDecoration.decorateA(fFindFieldDecoration, getFindString());
}
setupFindReplaceLogic();
storeSettings();
updateButtonState();
Expand Down Expand Up @@ -1050,9 +1059,10 @@ private void addDecorationMargin(Control control) {
if (!(layoutData instanceof GridData))
return;
GridData gd = (GridData) layoutData;
FieldDecoration dec = FieldDecorationRegistry.getDefault()

FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
gd.horizontalIndent = dec.getImage().getBounds().width;
gd.horizontalIndent = fieldDecoration.getImage().getBounds().width;
}

/**
Expand Down Expand Up @@ -1102,7 +1112,6 @@ private void updateButtonState(boolean disableReplace) {
}
}


/**
* Updates the given combo with the given content.
*
Expand Down Expand Up @@ -1335,19 +1344,15 @@ private void activateInFindReplaceLogicIf(SearchOptions option, boolean shouldAc
}
}

/**
* Evaluate the status of the FindReplaceLogic object.
*/
private void evaluateFindReplaceStatus() {
IFindReplaceStatus status = findReplaceLogic.getStatus();
private void decorate() {

String dialogMessage = status.accept(new FindReplaceLogicMessageGenerator());
fStatusLabel.setText(dialogMessage);
if (status.isInputValid()) {
fStatusLabel.setForeground(fReplaceLabel.getForeground());
} else {
fStatusLabel.setForeground(JFaceColors.getErrorText(fStatusLabel.getDisplay()));
}
fFindField.addModifyListener(event -> {
if (fIsRegExCheckBox.getSelection()) {
fFindFieldSearchDecoration.decorateA(fFindFieldDecoration, fFindField.getText());
} else {
fFindFieldDecoration.hide();
}
});
}

private String getCurrentSelection() {
Expand Down
2 changes: 1 addition & 1 deletion bundles/org.eclipse.ui/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Bundle-Activator: org.eclipse.ui.internal.UIPlugin
Bundle-ActivationPolicy: lazy
Bundle-Vendor: %Plugin.providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.ui.internal;x-internal:=true
Export-Package: org.eclipse.ui.internal;x-friends:="org.eclipse.ui.workbench.texteditor,org.eclipse.search"
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.29.0,4.0.0)",
org.eclipse.swt;bundle-version="[3.126.0,4.0.0)";visibility:=reexport,
org.eclipse.jface;bundle-version="[3.34.0,4.0.0)";visibility:=reexport,
Expand Down
Loading

0 comments on commit e65493d

Please sign in to comment.