/** * Copyright (c) 2013 committers of YAKINDU and others. * 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.ui.wizards; import java.util.LinkedHashSet; import java.util.Set; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; /** * * @author oliver bohl - Initial contribution and API * */ public class WorkspaceTreeContentProvider implements ITreeContentProvider { protected String fileExtension; public WorkspaceTreeContentProvider() { } public WorkspaceTreeContentProvider(String fileExtension) { this.fileExtension = fileExtension; } public Object[] getElements(Object inputElement) { if (inputElement instanceof IContainer) { IContainer container = (IContainer) inputElement; try { return filterForContent(container.members()); } catch (CoreException e) { e.printStackTrace(); } } return new Object[] {}; } public boolean hasChildren(Object element) { return element instanceof IContainer; } public Object[] getChildren(Object parentElement) { Object[] result = getElements(parentElement); try { return filterForContent(result); } catch (CoreException e) { e.printStackTrace(); return new Object[0]; } } public boolean containsFile(IFolder folder) throws CoreException { if (folder.members() != null) { for (Object member : folder.members()) { // No file extension check if (member instanceof IFile && hasFileExtension((IFile) member)) { return false; } // check if file extension is proper else if (member instanceof IFile && ((IFile) member).getFileExtension().equals(fileExtension)) { return true; } else if (member instanceof IFolder) { return containsFile((IFolder) member); } } } return false; } public Object[] filterForContent(Object[] inputElements) throws CoreException { final Set<Object> result = new LinkedHashSet<Object>(); for (final Object obj : inputElements) { ((IResource) obj).accept(new IResourceVisitor() { public boolean visit(IResource resource) throws CoreException { // no file extension check if (resource instanceof IFile && hasFileExtension((IFile) resource)) { return false; } // check if file extension is proper else if (resource instanceof IFile && resource.getFileExtension().equals(fileExtension)) { result.add(obj); return true; } else if (resource instanceof IFolder && containsFile((IFolder) resource)) { result.add(obj); return true; } return false; } }); } return result.toArray(new IResource[0]); } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // not handled } public void dispose() { // not handled } public Object getParent(Object element) { return null; } public String getFileExtension() { return fileExtension; } public void setFileExtension(String fileExtension) { this.fileExtension = fileExtension; } public boolean hasFileExtension(IFile res) { return (res.getFileExtension() == null); } }