package org.openlca.app.navigation; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.TreeItem; import org.openlca.app.util.Labels; /** * A class for filtering model elements from an navigation tree via a text * filter. The filter directly registers a listener on the text field. */ public class ModelTextFilter extends ViewerFilter { private Text filterText; public ModelTextFilter(Text filterText, final TreeViewer viewer) { this.filterText = filterText; filterText.addModifyListener((e) -> { viewer.refresh(); expand(viewer); }); } private void expand(TreeViewer viewer) { TreeItem[] items = viewer.getTree().getItems(); while (items != null && items.length > 0) { TreeItem next = items[0]; next.setExpanded(true); for (int i = 1; i < items.length; i++) items[i].setExpanded(false); items = next.getItems(); viewer.refresh(); } } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { String text = filterText.getText(); if (text == null || text.trim().isEmpty()) return true; text = text.trim().toLowerCase(); return select((INavigationElement<?>) element, text); } private boolean select(INavigationElement<?> element, String text) { if (element instanceof ModelElement) { ModelElement modelElement = (ModelElement) element; String feed = Labels.getDisplayName(modelElement.getContent()) .toLowerCase(); return feed.contains(text); } for (INavigationElement<?> child : element.getChildren()) if (select(child, text)) return true; return false; } }