/* * Copyright (c) 2006 Eclipse.org * * 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: * Dmitry Stadnik - initial API and implementation */ package org.eclipse.gmf.internal.common.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.common.util.URI; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; /** * Adapts selection to resource locations. * * @author dstadnik */ public class ResourceLocationProvider { private final List<IResource> selectedResources; private final List<URI> selectedURIs; public ResourceLocationProvider(ISelection selection) { selectedResources = new ArrayList<IResource>(); selectedURIs = new ArrayList<URI>(); if (selection instanceof IStructuredSelection) { for (Object element : ((IStructuredSelection) selection).toList()) { if (element instanceof IResource) { selectedResources.add((IResource) element); } else if (element instanceof URI) { selectedURIs.add((URI) element); } } } } /** * Returns selected files with specified extension. * * @param explicit If true then if folder was selected looks for appropriate files in it. */ public List<IFile> getSelectedFiles(String extension, boolean explicit) { List<IFile> files = new ArrayList<IFile>(); if (extension == null) { return files; } addFiles(files, selectedResources, extension); if (!explicit) { // add files from containers; they are at the end since explicitly selected files are more important addContainers(files, selectedResources, extension); } return files; } protected void addFiles(List<IFile> files, List<? extends IResource> resources, String extension) { for (IResource resource : resources) { if (resource instanceof IFile && extension.equals(((IFile) resource).getFileExtension())) { files.add((IFile) resource); } } } protected void addContainers(List<IFile> files, List<? extends IResource> resources, String extension) { for (IResource resource : resources) { if (resource instanceof IContainer) { try { List<IResource> members = Arrays.asList(((IContainer) resource).members()); addFiles(files, members, extension); } catch (CoreException ce) { // ignore } } } } /** * Returns selected resources with specified extension. * * @param explicit If true then examines folders in selection. */ public List<URI> getSelectedURIs(String extension, boolean explicit) { List<URI> uris = new ArrayList<URI>(); if (extension == null) { return uris; } for (URI uri : selectedURIs) { if (extension.equals(uri.fileExtension())) { uris.add(uri); } } // files follow uris since uris are more specific List<IFile> files = getSelectedFiles(extension, explicit); for (IFile file : files) { uris.add(URI.createPlatformResourceURI(file.getFullPath().toString(), true)); } return uris; } public final List<URI> getSelectedURIs(String extension) { return getSelectedURIs(extension, false); } }