/***************************************************************************** * Copyright (c) 2012 CEA LIST. * * 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: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.infra.widgets.providers; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.papyrus.infra.tools.util.ListHelper; import org.eclipse.papyrus.infra.widgets.Activator; import com.ibm.icu.text.Collator; /** * A ContentProvider for resources located in the current workspace * * @author Camille Letavernier */ public class SemanticWorkspaceContentProvider extends AbstractStaticContentProvider implements IHierarchicContentProvider { /** * Constructor */ public SemanticWorkspaceContentProvider() { } /** * {@inheritDoc} */ public Object[] getElements() { try { return filterAccessibleElements(ResourcesPlugin.getWorkspace().getRoot().members()); } catch (Exception ex) { Activator.log.error(ex); return new Object[0]; } } protected Object[] filterAccessibleElements(IResource[] members) { List<IResource> accessibleElements = ListHelper.asList(members); Iterator<IResource> resourceIterator = accessibleElements.iterator(); while(resourceIterator.hasNext()) { IResource resource = resourceIterator.next(); if(!resource.isAccessible()) { resourceIterator.remove(); } } Collections.sort(accessibleElements, resourceComparator); return accessibleElements.toArray(); } /** * {@inheritDoc} */ public Object[] getChildren(Object parentElement) { if(parentElement instanceof IContainer) { try { IResource[] members = ((IContainer)parentElement).members(); return filterAccessibleElements(members); } catch (CoreException ex) { Activator.log.error(ex); } } return new Object[0]; } /** * {@inheritDoc} */ public Object getParent(Object element) { if(element instanceof IContainer) { return ((IContainer)element).getParent(); } return null; } /** * {@inheritDoc} */ public boolean hasChildren(Object element) { return getChildren(element).length > 0; } /** * {@inheritDoc} */ public boolean isValidValue(Object element) { return !(element instanceof IWorkspaceRoot); } /** * Compares two resources (IResource) */ private static final Comparator<IResource> resourceComparator = createComparator(); private static Comparator<IResource> createComparator() { final int folderTypes = IResource.FOLDER | IResource.PROJECT | IResource.ROOT; return new Comparator<IResource>() { public int compare(IResource resource1, IResource resource2) { int typeCompare = compareType(resource1, resource2); if(typeCompare == 0) { return compareName(resource1, resource2); } return typeCompare; } private int compareType(IResource resource1, IResource resource2) { if(resource1.getType() == resource2.getType()) { return 0; } if((resource1.getType() & folderTypes) > (resource2.getType() & folderTypes)) { return -1; } else { return 1; } } private int compareName(IResource resource1, IResource resource2) { return Collator.getInstance().compare(resource1.getName(), resource2.getName()); } }; } }