package com.redhat.ceylon.eclipse.code.outline; import static com.redhat.ceylon.model.typechecker.model.ModelUtil.isNameMatching; import static com.redhat.ceylon.eclipse.code.open.OpenDeclarationDialog.isMatchingGlob; import static com.redhat.ceylon.eclipse.code.outline.CeylonOutlineNode.DEFAULT_CATEGORY; import static com.redhat.ceylon.eclipse.code.outline.CeylonOutlineNode.IMPORT_LIST_CATEGORY; import org.eclipse.jface.viewers.ITreeContentProvider; 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 com.redhat.ceylon.model.typechecker.model.Declaration; /** * The NamePatternFilter selects the elements which * match the given string patterns. * * @since 2.0 */ class OutlineNamePatternFilter extends ViewerFilter { private final Text filterText; OutlineNamePatternFilter(Text filterText) { this.filterText = filterText; } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { TreeViewer treeViewer = (TreeViewer) viewer; String filter = filterText.getText(); String name = null; if (element instanceof CeylonOutlineNode) { CeylonOutlineNode on = (CeylonOutlineNode) element; int category = on.getCategory(); if (category!=DEFAULT_CATEGORY && category!=IMPORT_LIST_CATEGORY) { return false; } name = on.getName(); } else if (element instanceof Declaration) { name = ((Declaration) element).getName(); } else { return true; } if (name==null) { return filter.isEmpty() || filter.equals("*"); } else { if (filter.contains("*")) { return isMatchingGlob(filter, name) || hasUnfilteredChild(treeViewer, element); } else { return isNameMatching(filter, name) || hasUnfilteredChild(treeViewer, element); } } } private boolean hasUnfilteredChild(TreeViewer viewer, Object element) { ITreeContentProvider cp = (ITreeContentProvider) viewer.getContentProvider(); Object[] children = cp.getChildren(element); if (children!=null) { for (int i=0; i<children.length; i++) { if (select(viewer, element, children[i])) { return true; } } } return false; } }