/******************************************************************************* * Copyright (c) 2010 Neil Bartlett. * 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: * Neil Bartlett - initial API and implementation *******************************************************************************/ package bndtools.utils; import java.util.Locale; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; public class FileExtensionFilter extends ViewerFilter { private final String[] extensions; private final boolean caseInsensitive; /** * Construct a filter from a list of supported extensions. */ public FileExtensionFilter(String[] extensions, boolean caseInsensitive) { this.caseInsensitive = caseInsensitive; this.extensions = new String[extensions.length]; for (int i = 0; i < extensions.length; i++) { if (extensions[i].length() > 0 && extensions[i].charAt(0) == '.') this.extensions[i] = extensions[i]; else this.extensions[i] = "." + extensions[i]; if (caseInsensitive) this.extensions[i] = this.extensions[i].toLowerCase(); } } /** * Construct a filter from a single supported extension. */ public FileExtensionFilter(String extension, boolean caseInsensitive) { this(new String[] { extension }, caseInsensitive); } /** * Construct a case-insensitive filter from a list of supported extensions. * * @param extensions */ public FileExtensionFilter(String[] extensions) { this(extensions, true); } /** * Construct a case-insensitive filter from a single supported extension. * * @param extension */ public FileExtensionFilter(String extension) { this(extension, true); } @Override public boolean select(Viewer viewer, Object parent, Object element) { if (element instanceof IFile) { String fileName = ((IFile) element).getName(); if (caseInsensitive) fileName = fileName.toLowerCase(Locale.ENGLISH); for (String extension : this.extensions) { if (fileName.endsWith(extension)) return true; } return false; } if (element instanceof IProject && !((IProject) element).isOpen()) return false; if (element instanceof IContainer) { try { IResource[] resources = ((IContainer) element).members(); for (int i = 0; i < resources.length; i++) { if (select(viewer, parent, resources[i])) return true; } } catch (CoreException e) {} } return false; } }