/******************************************************************************* * Copyright (c) 2014 Inria * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Generoso Pagano, Inria - Initial API and implementation *******************************************************************************/ package org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.dialogs.PatternFilter; /** * A filter extending the <code>org.eclipse.ui.dialogs.PatternFilter<code>. * * It redefines the {@link #isElementVisible(Viewer, Object)}} method in order * to have a match on a node if: the node matches or one of the children matches * or one of the parents matches. * * @author "Generoso Pagano <generoso.pagano@inria.fr>" */ public class TreePatternFilter extends PatternFilter { @Override public boolean isElementVisible(Viewer viewer, Object element) { return super.isElementVisible(viewer, element) || isChildMatch(viewer, element); } /** * Check if at least one of the parents of this element is a match with the * filter text. * * @param viewer * the viewer that contains the element * @param element * the tree element to check * @return true if the given element has a parent that matches the filter * text */ private boolean isChildMatch(Viewer viewer, Object element) { Object parent = ((ITreeContentProvider) ((AbstractTreeViewer) viewer).getContentProvider()) .getParent(element); while (parent != null) { if (isLeafMatch(viewer, parent)) { return true; } parent = ((ITreeContentProvider) ((AbstractTreeViewer) viewer).getContentProvider()) .getParent(parent); } return false; } }