/* * $Id$ * * SARL is an general-purpose agent programming language. * More details on http://www.sarl.io * * Copyright (C) 2014-2017 the original authors or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.sarl.eclipse.explorer; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import javax.inject.Inject; import javax.inject.Named; import org.eclipse.core.resources.IFile; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.xtext.Constants; /** * Provides the images for the Package Explorer. * * <p>This provider inherits its behavior from the JDT package explorer image provider, * and add the following changes: * <ul> * <li>the icon of the package fragments are computed in order to consider the SARL scripts inside.</li> * </ul> * * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ * @since 0.6 */ public class SARLElementImageProvider extends JavaElementImageProvider { private final Set<String> fileExtensions = new HashSet<>(); /** Set the file extensions. * * @param fileExtensions the file extensions. */ @Inject public void setFileExtensions(@Named(Constants.FILE_EXTENSIONS) String fileExtensions) { this.fileExtensions.clear(); this.fileExtensions.addAll(Arrays.asList(fileExtensions.split("[,;: ]+"))); //$NON-NLS-1$ } /** Replies the file extensions. * * @return the file extensions. */ public Set<String> getFileExtensions() { return this.fileExtensions; } @Override public ImageDescriptor getBaseImageDescriptor(IJavaElement element, int renderFlags) { if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { final ImageDescriptor desc = getPackageFragmentIcon((IPackageFragment) element); if (desc != null) { return desc; } } return super.getBaseImageDescriptor(element, renderFlags); } /** Replies the image description of the package fragment. * * @param fragment the element. * @return the descriptor. */ @SuppressWarnings("checkstyle:all") private ImageDescriptor getPackageFragmentIcon(IPackageFragment fragment) { boolean containsJavaElements = false; try { containsJavaElements = fragment.hasChildren(); } catch (JavaModelException e) { // assuming no children; } try { if (!containsJavaElements) { final Object[] resources = fragment.getNonJavaResources(); if (resources.length > 0) { for (final Object child : resources) { if (isSarlResource(child)) { return JavaPluginImages.DESC_OBJS_PACKAGE; } } return JavaPluginImages.DESC_OBJS_EMPTY_PACKAGE_RESOURCES; } } } catch (JavaModelException exception) { // } if (!containsJavaElements) { return JavaPluginImages.DESC_OBJS_EMPTY_PACKAGE; } return JavaPluginImages.DESC_OBJS_PACKAGE; } /** Replies if the given resource is a SARL resource. * * @param resource the resource. * @return {@code true} if the given resource is a SARL resource. */ protected boolean isSarlResource(Object resource) { if (resource instanceof IFile) { final IFile file = (IFile) resource; return getFileExtensions().contains(file.getFileExtension()); } return false; } }