/*
* Copyright 2009-2017 the original author 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 org.codehaus.groovy.eclipse.ui.decorators;
import static org.eclipse.jdt.groovy.core.util.ContentTypeUtils.isGroovyLikeFileName;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.groovy.eclipse.GroovyPlugin;
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.jdt.core.ICompilationUnit;
import org.eclipse.jdt.groovy.core.util.ContentTypeUtils;
import org.eclipse.jdt.groovy.core.util.ScriptFolderSelector;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
import org.eclipse.jdt.ui.JavaElementImageDescriptor;
import org.eclipse.jdt.ui.ProblemsLabelDecorator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.internal.WorkbenchPlugin;
public class GroovyImageDecorator extends BaseLabelProvider implements ILabelDecorator {
private ILabelDecorator problemsDecorator = new ProblemsLabelDecorator();
private Map<IProject, ScriptFolderSelector> scriptFolderSelectors = new HashMap<IProject, ScriptFolderSelector>(); // TODO: GroovyParser maintains this same cache
public Image decorateImage(Image image, Object element) {
if (preventRecursion) {
return null;
}
boolean isGroovyFile = false, noBaseImage = (image == null);
if (element instanceof String && (isGroovyFile = isGroovyLikeFileName((String) element))) {
// a request where an IResource cannot be located (probably opening from source control)
image = getImage(new JavaElementImageDescriptor(GroovyPluginImages.DESC_GROOVY_FILE, 0, JavaElementImageProvider.SMALL_SIZE));
} else {
IResource resource = null;
if (element instanceof IFile) {
resource = (IResource) element;
} else if (element instanceof ICompilationUnit) {
resource = ((ICompilationUnit) element).getResource();
}
if (resource != null && (isGroovyFile = isGroovyLikeFileName(resource.getName()))) {
image = getJavaElementImageDescriptor(image, resource);
}
}
if (image != null && isGroovyFile) {
preventRecursion = true;
try {
// the Java ProblemsDecorator is not registered in the official
// decorator list of eclipse, so we need it to call ourself.
// problem: if jdt includes more decorators, we won't know it.
image = problemsDecorator.decorateImage(image, element);
// add non-problem decor, like type indicator and version control status, only if not for editor title
if (!noBaseImage) {
if (defaultDecorator == null) {
defaultDecorator = WorkbenchPlugin.getDefault().getDecoratorManager();
}
image = defaultDecorator.decorateImage(image, element);
}
} finally {
preventRecursion = false;
}
return image;
}
return null;
}
private boolean preventRecursion;
private ILabelDecorator defaultDecorator;
private Image getJavaElementImageDescriptor(Image image, IResource resource) {
int flags = 0;
Point size = JavaElementImageProvider.SMALL_SIZE;
if (image != null && image.getBounds().width > 16) {
size = JavaElementImageProvider.BIG_SIZE;
}
boolean isGradle = (GroovyPluginImages.DESC_GRADLE_FILE != null && ContentTypeUtils.isGradleLikeFileName(resource.getName()));
ImageDescriptor desc = isGradle ? GroovyPluginImages.DESC_GRADLE_FILE : GroovyPluginImages.DESC_GROOVY_FILE;
if (!isGradle)
try {
if (isGroovyProject(resource.getProject())) {
if (isRuntimeCompiled(resource)) {
// display "circle slash" in lower left corner
flags |= 0x8000/*JavaElementImageDescriptor.IGNORE_OPTIONAL_PROBLEMS*/; // TODO: Restore when e37 is no longer supported.
}
} else {
// display "red exclamation" in lower left corner
flags |= JavaElementImageDescriptor.BUILDPATH_ERROR;
}
} catch (Exception e) {
GroovyPlugin.getDefault().logError("Failed to apply image overlay(s) to: " + resource.getName(), e);
}
return getImage(new JavaElementImageDescriptor(desc, flags, size));
}
private boolean isGroovyProject(IProject project) throws CoreException {
// do not link to static constant to prevent activation of bundle
return project.hasNature("org.eclipse.jdt.groovy.core.groovyNature");
}
private boolean isRuntimeCompiled(IResource resource) throws CoreException {
ScriptFolderSelector scriptFolderSelector = scriptFolderSelectors.get(resource.getProject());
if (scriptFolderSelector == null) {
scriptFolderSelectors.put(resource.getProject(), (scriptFolderSelector = new ScriptFolderSelector(resource.getProject())));
}
return scriptFolderSelector.isScript(resource);
}
private Image getImage(ImageDescriptor descriptor) {
return JavaPlugin.getImageDescriptorRegistry().get(descriptor);
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public String decorateText(String text, Object element) {
return null;
}
}