/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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 com.google.dart.tools.ui.internal.viewsupport;
import com.google.dart.engine.ast.Identifier;
import com.google.dart.engine.element.CompilationUnitElement;
import com.google.dart.engine.element.Element;
import com.google.dart.engine.element.ElementKind;
import com.google.dart.engine.element.FieldElement;
import com.google.dart.engine.element.MethodElement;
import com.google.dart.tools.core.DartCore;
import com.google.dart.tools.core.analysis.model.ResourceMap;
import com.google.dart.tools.ui.DartElementImageDescriptor;
import com.google.dart.tools.ui.DartPluginImages;
import com.google.dart.tools.ui.DartToolsPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.model.IWorkbenchAdapter;
/**
* Dart element image provider.
*/
public class NewDartElementImageProvider {
/**
* Flag to generate images with overlays.
*/
public final static int OVERLAY_ICONS = 0x1;
/**
* Flag to generate small sized images.
*/
public final static int SMALL_ICONS = 0x2;
public static final Point SMALL_SIZE = new Point(16, 16);
public static final Point BIG_SIZE = new Point(22, 16);
private static ImageDescriptor DESC_READ_ONLY;
static {
DESC_READ_ONLY = DartToolsPlugin.getImageDescriptor("icons/full/ovr16/lock_ovr.png"); //$NON-NLS-1$
}
public static Image getDecoratedImage(ImageDescriptor baseImage, int adornments, Point size) {
return DartToolsPlugin.getImageDescriptorRegistry().get(
new DartElementImageDescriptor(baseImage, adornments, size));
}
public static ImageDescriptor getFieldImageDescriptor(boolean isInInterfaceOrAnnotation,
boolean isPrivate) {
if (isInInterfaceOrAnnotation) {
return DartPluginImages.DESC_DART_FIELD_PUBLIC;
}
if (isPrivate) {
return DartPluginImages.DESC_DART_FIELD_PRIVATE;
}
return DartPluginImages.DESC_DART_FIELD_PUBLIC;
}
public static ImageDescriptor getLibraryImageDescriptor(int flags) {
return DartPluginImages.DESC_DART_LIB_FILE;
}
public static ImageDescriptor getMethodImageDescriptor(boolean isInInterfaceOrAnnotation,
boolean isPrivate) {
if (isInInterfaceOrAnnotation) {
return DartPluginImages.DESC_DART_METHOD_PUBLIC;
}
if (isPrivate) {
return DartPluginImages.DESC_DART_METHOD_PRIVATE;
}
return DartPluginImages.DESC_DART_METHOD_PUBLIC;
}
private static ImageDescriptor decorate(ImageDescriptor main, ImageDescriptor badge) {
return new DecorationOverlayIcon(
DartToolsPlugin.getImageDescriptorRegistry().get(main),
badge,
IDecoration.BOTTOM_RIGHT);
}
// @SuppressWarnings("unused")
// private static ImageDescriptor getFunctionTypeDescriptor(DartFunctionTypeAlias element) {
// if (element.isPrivate()) {
// return DartPluginImages.DESC_DART_FUNCTIONTYPE_PRIVATE;
// } else {
// return DartPluginImages.DESC_DART_FUNCTIONTYPE_PUBLIC;
// }
// }
private static ImageDescriptor getClassImageDescriptor(boolean isPrivate) {
return isPrivate ? DartPluginImages.DESC_DART_CLASS_PRIVATE
: DartPluginImages.DESC_DART_CLASS_PUBLIC;
}
private static boolean showOverlayIcons(int flags) {
return (flags & OVERLAY_ICONS) != 0;
}
private static boolean useSmallSize(int flags) {
return (flags & SMALL_ICONS) != 0;
}
private ImageDescriptorRegistry descriptorRegistry;
public void dispose() {
}
/**
* Returns an image descriptor for a Dart element. This is the base image, no overlays.
*/
public ImageDescriptor getBaseImageDescriptor(Element element, int renderFlags) {
switch (element.getKind()) {
case ANGULAR_COMPONENT:
case ANGULAR_CONTROLLER:
case ANGULAR_DIRECTIVE:
case ANGULAR_FORMATTER:
case ANGULAR_PROPERTY:
case ANGULAR_SELECTOR:
return DartPluginImages.DESC_ANGULAR_BLUE;
case HTML:
return DartPluginImages.DESC_DART_HTML_FILE;
case FUNCTION:
if (isPrivate(element)) {
return DartPluginImages.DESC_DART_METHOD_PRIVATE;
}
if (element.getEnclosingElement().getKind() == ElementKind.COMPILATION_UNIT) {
return DartPluginImages.DESC_DART_METHOD_PUBLIC;
} else {
// If functions defined within methods are displayed in the outline (or elsewhere) then a
// new icon should be added, since they are private but not defined by the user as such.
return DartPluginImages.DESC_MISC_DEFAULT;
}
// case ???:
// return getFunctionTypeDescriptor((DartFunctionTypeAlias) element);
case CONSTRUCTOR:
case GETTER:
case SETTER:
case METHOD:
return getMethodImageDescriptor(false, isPrivate(element));
case FIELD:
return getFieldImageDescriptor(false, isPrivate(element));
case IMPORT:
return DartPluginImages.DESC_OBJS_IMPCONT;
case CLASS:
return getClassImageDescriptor(isPrivate(element));
case COMPILATION_UNIT:
return getCompilationUnitDescriptor((CompilationUnitElement) element);
case LIBRARY:
return getLibraryImageDescriptor(renderFlags);
//TODO (pquitslund): projects are not in the new model
// case DartElement.DART_PROJECT:
// DartProject project = (DartProject) element;
// if (project.getProject().isOpen()) {
// IProject project2 = project.getProject();
// IWorkbenchAdapter adapter = (IWorkbenchAdapter) project2.getAdapter(IWorkbenchAdapter.class);
// if (adapter != null) {
// ImageDescriptor result = adapter.getImageDescriptor(project2);
// if (result != null) {
// return result;
// }
// }
// return DESC_OBJ_PROJECT;
// }
// return DESC_OBJ_PROJECT_CLOSED;
//
// case DartElement.DART_MODEL:
// return DartPluginImages.DESC_OBJS_JAVA_MODEL;
case LOCAL_VARIABLE:
case TOP_LEVEL_VARIABLE:
//TODO (pquitslund): top-level vars should have their own descriptors
return getFieldImageDescriptor(false, isPrivate(element));
case FUNCTION_TYPE_ALIAS:
return DartPluginImages.DESC_DART_CLASS_TYPE_ALIAS;
}
return DartPluginImages.DESC_OBJS_GHOST;
}
/**
* Returns an image descriptor for a compilation unit resource. The descriptor includes overlays,
* if specified.
*/
public ImageDescriptor getCUResourceImageDescriptor(IFile file, int flags) {
Point size = useSmallSize(flags) ? SMALL_SIZE : BIG_SIZE;
return new DartElementImageDescriptor(DartPluginImages.DESC_OBJS_CUNIT_RESOURCE, 0, size);
}
/**
* Returns an image descriptor for a Dart element. The descriptor includes overlays, if specified.
*/
public ImageDescriptor getDartImageDescriptor(Element element, int flags) {
Point size = useSmallSize(flags) ? SMALL_SIZE : BIG_SIZE;
ImageDescriptor baseDesc = getBaseImageDescriptor(element, flags);
if (baseDesc != null) {
if (element instanceof CompilationUnitElement) {
ResourceMap map = DartCore.getProjectManager().getResourceMap(element.getContext());
if (map != null) {
IResource resource = map.getResource(element.getSource());
// files in packages
if (resource != null && DartCore.isContainedInPackages((IFile) resource)) {
baseDesc = decorateReadOnly(baseDesc);
}
} else { // check if files in sdk
if (element.getSource().isInSystemLibrary()) {
baseDesc = decorateReadOnly(baseDesc);
}
}
}
int adornmentFlags = computeDecorators(element, flags);
return new DartElementImageDescriptor(baseDesc, adornmentFlags, size);
}
return new DartElementImageDescriptor(DartPluginImages.DESC_OBJS_GHOST, 0, size);
}
/**
* Returns the icon for a given element. The icon depends on the element type and element
* properties. If configured, overlay icons are constructed for <code>SourceReference</code>s.
*
* @param flags Flags as defined by the DartElementImageProvider
*/
public Image getImageLabel(Object element, int flags) {
return getImageLabel(computeDescriptor(element, flags));
}
/**
* Returns an image descriptor for a IAdaptable. The descriptor includes overlays, if specified
* (only error ticks apply). Returns <code>null</code> if no image could be found.
*/
public ImageDescriptor getWorkbenchImageDescriptor(IAdaptable adaptable, int flags) {
IWorkbenchAdapter wbAdapter = (IWorkbenchAdapter) adaptable.getAdapter(IWorkbenchAdapter.class);
if (wbAdapter == null) {
return null;
}
ImageDescriptor descriptor = wbAdapter.getImageDescriptor(adaptable);
if (descriptor == null) {
return null;
}
Point size = useSmallSize(flags) ? SMALL_SIZE : BIG_SIZE;
return new DartElementImageDescriptor(descriptor, 0, size);
}
private int computeDecorators(Element element, int renderFlags) {
int flags = 0;
if (showOverlayIcons(renderFlags)) {
switch (element.getKind()) {
case CONSTRUCTOR:
flags |= DartElementImageDescriptor.CONSTRUCTOR;
break;
case GETTER:
flags |= DartElementImageDescriptor.GETTER;
break;
case SETTER:
flags |= DartElementImageDescriptor.SETTER;
break;
case METHOD:
MethodElement method = (MethodElement) element;
if (method.isAbstract()) {
flags |= DartElementImageDescriptor.ABSTRACT;
}
if (method.isStatic()) {
flags |= DartElementImageDescriptor.STATIC;
}
break;
case FIELD:
FieldElement field = (FieldElement) element;
if (field.isStatic()) {
flags |= DartElementImageDescriptor.STATIC;
}
if (field.isConst()) {
flags |= DartElementImageDescriptor.CONST;
}
break;
}
}
return flags;
}
private ImageDescriptor computeDescriptor(Object element, int flags) {
if (element instanceof Element) {
return getDartImageDescriptor((Element) element, flags);
} else if (element instanceof IFile) {
IFile file = (IFile) element;
ImageDescriptor imageDescriptor = getWorkbenchImageDescriptor(file, flags);
if (file.isReadOnly() || !file.exists()) {
return decorateReadOnly(imageDescriptor);
} else {
return imageDescriptor;
}
} else if (element instanceof FileStoreEditorInput) {
// the only external dart files are in SDK and Installed Packages - these
// should be read only. If this changes, add check here
ImageDescriptor imageDescriptor = DartPluginImages.DESC_DART_COMP_UNIT;
// File file = new File(((FileStoreEditorInput) element).getURI());
imageDescriptor = DartPluginImages.DESC_DART_COMP_UNIT;
// if (!file.canWrite()) {
return decorateReadOnly(imageDescriptor);
// }
} else if (element instanceof IAdaptable) {
return getWorkbenchImageDescriptor((IAdaptable) element, flags);
}
return null;
}
private ImageDescriptor decorateReadOnly(ImageDescriptor imageDescriptor) {
return decorate(imageDescriptor, DESC_READ_ONLY);
}
private ImageDescriptor getCompilationUnitDescriptor(CompilationUnitElement element) {
return DartPluginImages.DESC_DART_COMP_UNIT;
}
private Image getImageLabel(ImageDescriptor descriptor) {
if (descriptor == null) {
return null;
}
return getRegistry().get(descriptor);
}
private ImageDescriptorRegistry getRegistry() {
if (descriptorRegistry == null) {
descriptorRegistry = DartToolsPlugin.getImageDescriptorRegistry();
}
return descriptorRegistry;
}
private boolean isPrivate(Element elem) {
return Identifier.isPrivateName(elem.getDisplayName());
}
}