package rocks.inspectit.ui.rcp.menu; import java.util.HashMap; import java.util.Map; import java.util.Objects; import org.apache.commons.lang.StringUtils; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.menus.WorkbenchWindowControlContribution; import org.eclipse.ui.services.IEvaluationService; import rocks.inspectit.ui.rcp.InspectIT; import rocks.inspectit.ui.rcp.handlers.OpenUrlHandler.SearchDocumentationHandler; /** * The documentation search contribution item displayed in the main toolbar. * * @author Ivan Senic * */ public class SearchDocumentationContributionItem extends WorkbenchWindowControlContribution { /** * Default text. */ private static final String DEFAULT_TEXT = "Wiki search"; /** * Text box for documentation search. */ private Text searchText; /** * Default constructor. */ public SearchDocumentationContributionItem() { } /** * Secondary constructor. * * @param id * Id of contribution item */ public SearchDocumentationContributionItem(String id) { super(id); } /** * {@inheritDoc} */ @Override protected Control createControl(Composite parent) { Composite main = new Composite(parent, SWT.NONE); GridLayout gl = new GridLayout(1, false); gl.marginHeight = 0; main.setLayout(gl); searchText = new Text(main, SWT.SINGLE | SWT.BORDER | SWT.ICON_SEARCH | SWT.SEARCH); setDefaultText(); GridData gridData = new GridData(SWT.CENTER, SWT.CENTER, false, false); gridData.widthHint = 150; searchText.setLayoutData(gridData); searchText.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { if (Objects.equals(searchText.getText(), DEFAULT_TEXT)) { setEmptyText(); } } @Override public void focusLost(FocusEvent e) { if (Objects.equals(searchText.getText(), "")) { setDefaultText(); } } }); searchText.addTraverseListener(new TraverseListener() { @Override public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_ESCAPE) { setDefaultText(); searchText.getParent().forceFocus(); } else if (e.detail == SWT.TRAVERSE_RETURN) { executeSearch(); } } }); return main; } /** * Sets default text in gray color. */ private void setDefaultText() { searchText.setText(DEFAULT_TEXT); searchText.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY)); } /** * Empties the text box and set font color to black. */ private void setEmptyText() { searchText.setText(""); searchText.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); } /** * Executes the search. */ private void executeSearch() { String searchString = searchText.getText(); if (StringUtils.isNotBlank(searchString)) { ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class); IEvaluationService evaluationService = (IEvaluationService) PlatformUI.getWorkbench().getService(IEvaluationService.class); try { Command searchCommand = commandService.getCommand("rocks.inspectit.ui.rcp.commands.searchDocumentation"); Map<String, String> params = new HashMap<>(); params.put(SearchDocumentationHandler.SEARCH_DOCUMENTATION_PARAMETER, searchString); searchCommand.executeWithChecks(new ExecutionEvent(searchCommand, params, searchText, evaluationService.getCurrentState())); } catch (Exception e) { InspectIT.getDefault().createErrorDialog("There was an exception executing the wiki search.", e, -1); } } } }