/******************************************************************************* * Copyright (c) 2013 Kalray.eu * 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: * Xavier Raynaud <xavier.raynaud@kalray.eu> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.dataviewers.abstractviewers; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; /** * Implementation of ViewerFilter based on a ISTDataViewersField. Object are filtered according 3 conditions: * <ul> * <li> {@link ISTDataViewersField#getValue(Object)} matches the given pattern * <li>At least one child of the Object matches the given pattern * <li>Optionally, a parent of the children matches the given pattern * </ul> * * Note: content provider of the given TreeViewer must be a ITreeContentProvider * * @since 5.0 */ public class TreeColumnViewerFilter extends ViewerFilter { private String matchingText = ""; private final TreeViewer treeViewer; private final ISTDataViewersField field; private final boolean keepAllChildIfParentMatch; /** * Creates the filter for the given viewer and field to filter on. * @param viewer The viewer to filter. * @param field The field to filter on. * @param keepAllChildIfParentMatch Whether to keep all children of matching element. */ public TreeColumnViewerFilter(TreeViewer viewer, ISTDataViewersField field, boolean keepAllChildIfParentMatch) { super(); this.treeViewer = viewer; this.field = field; this.keepAllChildIfParentMatch = keepAllChildIfParentMatch; } /** * @param matchingText * the matchingText to set */ public void setMatchingText(String matchingText) { this.matchingText = matchingText; treeViewer.refresh(); } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { ITreeContentProvider provider = (ITreeContentProvider) treeViewer.getContentProvider(); String s = field.getValue(element); if (s.contains(matchingText)) { return true; } if (provider.hasChildren(element)) { for (Object o : provider.getChildren(element)) { if (select(viewer, element, o)) { return true; } } } if (keepAllChildIfParentMatch) { while (parentElement != null) { String ps = field.getValue(parentElement); if (ps.contains(matchingText)) { return true; } parentElement = provider.getParent(parentElement); } } return false; } }