package org.openlca.app; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuCreator; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.menus.WorkbenchWindowControlContribution; import org.openlca.app.db.Database; import org.openlca.app.rcp.images.Icon; import org.openlca.app.rcp.images.Images; import org.openlca.app.util.Controls; import org.openlca.app.util.InformationPopup; import org.openlca.app.util.UI; import org.openlca.core.model.ModelType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SearchText extends WorkbenchWindowControlContribution { private Logger log = LoggerFactory.getLogger(getClass()); private Text text; private DropDownAction action; @Override protected Control createControl(Composite parent) { parent.setLayout(new FillLayout()); log.trace("create search text control"); Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.horizontalSpacing = 5; layout.marginHeight = 0; layout.marginWidth = 5; layout.verticalSpacing = 0; composite.setLayout(layout); text = new Text(composite, SWT.BORDER | SWT.SEARCH); text.addTraverseListener(e -> { if (e.detail == SWT.TRAVERSE_RETURN) { doSearch(action.typeFilter); } }); UI.gridData(text, true, false).minimumWidth = 180; createActionMenu(composite); return composite; } private void createActionMenu(Composite composite) { ToolBar toolBar = new ToolBar(composite, SWT.NONE); ToolBarManager manager = new ToolBarManager(toolBar); action = new DropDownAction(); manager.add(action); manager.update(true); toolBar.pack(); } private void doSearch(ModelType typeFilter) { if (Database.get() == null) { InformationPopup.show(M.NeedOpenDatabase); return; } String term = text.getText(); Search search = new Search(Database.get(), text.getText()); search.typeFilter = typeFilter; App.run(M.Searching, search, () -> SearchResultView.show(term, search.getResult())); } @SuppressWarnings("unused") private class SearchAction extends Action { public SearchAction() { setText(M.Search); setImageDescriptor(Icon.SEARCH.descriptor()); } @Override public void run() { doSearch(null); } } /** * A drop down menu for optionally selecting a model type as a search * filter. */ private class DropDownAction extends Action implements IMenuCreator { private Menu menu; private ModelType typeFilter; public DropDownAction() { setText(M.Search); setImageDescriptor(Icon.SEARCH.descriptor()); setMenuCreator(this); } @Override public void dispose() { if (menu == null) return; if (!menu.isDisposed()) menu.dispose(); menu = null; } @Override public Menu getMenu(Menu parent) { return null; } @Override public Menu getMenu(Control parent) { if (menu != null) menu.dispose(); menu = new Menu(parent); ModelType[] types = { null, ModelType.PROJECT, ModelType.PRODUCT_SYSTEM, ModelType.IMPACT_METHOD, ModelType.PROCESS, ModelType.FLOW, ModelType.SOCIAL_INDICATOR, ModelType.PARAMETER, ModelType.FLOW_PROPERTY, ModelType.UNIT_GROUP, ModelType.CURRENCY, ModelType.ACTOR, ModelType.SOURCE, ModelType.LOCATION, ModelType.DQ_SYSTEM }; for (int i = 0; i < types.length; i++) { ModelType type = types[i]; createItem(menu, getSeachLabel(type), type); } return menu; } private String getSeachLabel(ModelType type) { if (type == null) return M.SearchAllTypes; switch (type) { case PROJECT: return M.SearchInProjects; case PRODUCT_SYSTEM: return M.SearchInProductSystems; case IMPACT_METHOD: return M.SearchInLCIAMethods; case PROCESS: return M.SearchInProcesses; case FLOW: return M.SearchInFlows; case SOCIAL_INDICATOR: return M.SearchInSocialIndicators; case PARAMETER: return M.SearchInParameters; case FLOW_PROPERTY: return M.SearchInFlowProperties; case UNIT_GROUP: return M.SearchInUnitGroups; case CURRENCY: return M.SearchInCurrencies; case ACTOR: return M.SearchInActors; case SOURCE: return M.SearchInSources; case LOCATION: return M.SearchInLocations; case DQ_SYSTEM: return M.SearchInDataQualitySystems; default: return M.Unknown; } } private void createItem(Menu menu, final String text, final ModelType type) { Image image = null; if (type == null) image = Icon.SEARCH.get(); else image = Images.get(type); MenuItem item = new MenuItem(menu, SWT.NONE); item.setText(text); item.setImage(image); Controls.onSelect(item, e -> updateSelection(text, type)); } private void updateSelection(String text, ModelType type) { setText(text); ImageDescriptor imageDescriptor = null; if (type == null) imageDescriptor = Icon.SEARCH.descriptor(); else imageDescriptor = Images.descriptor(type); setImageDescriptor(imageDescriptor); typeFilter = type; } public void run() { doSearch(typeFilter); } } }