/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.erlide.ui.editors.erl.outline;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.ErlElementKind;
import org.erlide.engine.model.IErlElement;
import org.erlide.engine.model.erlang.IErlFunction;
import org.erlide.engine.model.root.IErlElementLocator;
import org.erlide.engine.model.root.IErlFolder;
import org.erlide.ui.ErlideImage;
import org.erlide.ui.internal.ErlideUIPlugin;
import org.erlide.ui.util.ImageDescriptorRegistry;
/**
* Default strategy of the Erlang plugin for the construction of Erlang element
* icons.
*/
public class ErlangElementImageProvider {
/**
* Flags for the ErlangImageLabelProvider: Generate images with overlays.
*/
public static final int OVERLAY_ICONS = 0x1;
/**
* Generate small sized images.
*/
public static final int SMALL_ICONS = 0x2;
/**
* Use the 'light' style for rendering types.
*/
public static final int LIGHT_TYPE_ICONS = 0x4;
public static final Point SMALL_SIZE = new Point(16, 16);
public static final Point BIG_SIZE = new Point(22, 16);
// private static ImageDescriptor DESC_OBJ_PROJECT_CLOSED;
//
// private static ImageDescriptor DESC_OBJ_PROJECT;
// {
// final ISharedImages images = ErlideUIPlugin.getDefault().getWorkbench()
// .getSharedImages();
// DESC_OBJ_PROJECT_CLOSED = images
// .getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED);
// DESC_OBJ_PROJECT = images
// .getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT);
// }
private ImageDescriptorRegistry fRegistry;
public ErlangElementImageProvider() {
fRegistry = null; // lazy initialization
}
/**
* 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>ISourceReference</code>s.
*
* @param flags
* Flags as defined by the ErlangImageLabelProvider
*/
public Image getImageLabel(final Object element, final int flags) {
return getImageLabel(computeDescriptor(element, flags));
}
public Image getImageLabel(final ImageDescriptor descriptor) {
if (descriptor == null) {
return null;
}
return getRegistry().get(descriptor);
}
private ImageDescriptorRegistry getRegistry() {
if (fRegistry == null) {
fRegistry = ErlideUIPlugin.getImageDescriptorRegistry();
}
return fRegistry;
}
private ImageDescriptor computeDescriptor(final Object element, final int flags) {
if (element instanceof IErlElement) {
return getErlImageDescriptor((IErlElement) element, flags);
} else if (element instanceof IFile) {
final IFile file = (IFile) element;
if ("erl".equals(file.getFileExtension())) { //$NON-NLS-1$
return getErlResourceImageDescriptor(file, flags);
// image for a CU not on the build path
}
return getWorkbenchImageDescriptor(file, flags);
} else if (element instanceof IFolder) {
final IErlElementLocator model = ErlangEngine.getInstance().getModel();
final IErlFolder ef = (IErlFolder) model.findElement((IResource) element);
if (ef != null && (ef.isOnSourcePath() || ef.isOnIncludePath())) {
return getErlImageDescriptor(ef, flags);
}
} else if (element instanceof IAdaptable) {
return getWorkbenchImageDescriptor((IAdaptable) element, flags);
}
return null;
}
@SuppressWarnings("unused")
private static boolean showOverlayIcons(final int flags) {
return (flags & OVERLAY_ICONS) != 0;
}
private static boolean useSmallSize(final int flags) {
return (flags & SMALL_ICONS) != 0;
}
@SuppressWarnings("unused")
private static boolean useLightIcons(final int flags) {
return (flags & LIGHT_TYPE_ICONS) != 0;
}
/**
* Returns an image descriptor for a module not on the class path. The
* descriptor includes overlays, if specified.
*/
public ImageDescriptor getErlResourceImageDescriptor(final IFile file,
final int flags) {
final Point size = useSmallSize(flags) ? SMALL_SIZE : BIG_SIZE;
return new ErlangElementImageDescriptor(
ErlideImage.MODULE_RESOURCE.getDescriptor(), 0, size);
}
/**
* Returns an image descriptor for an erlang element. The descriptor
* includes overlays, if specified.
*/
static public ImageDescriptor getErlImageDescriptor(final IErlElement element,
final int flags) {
final int adornmentFlags = 0; // computeAdornmentFlags(element,
// flags);
final Point size = useSmallSize(flags) ? SMALL_SIZE : BIG_SIZE;
return new ErlangElementImageDescriptor(getBaseImageDescriptor(element, flags),
adornmentFlags, size);
}
/**
* 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(final IAdaptable adaptable,
final int flags) {
final IWorkbenchAdapter wbAdapter = (IWorkbenchAdapter) adaptable
.getAdapter(IWorkbenchAdapter.class);
if (wbAdapter == null) {
return null;
}
final ImageDescriptor descriptor = wbAdapter.getImageDescriptor(adaptable);
if (descriptor == null) {
return null;
}
final Point size = useSmallSize(flags) ? SMALL_SIZE : BIG_SIZE;
return new ErlangElementImageDescriptor(descriptor, 0, size);
}
// ---- Computation of base image key
// -------------------------------------------------
/**
* Returns an image descriptor for an Erlang element. This is the base
* image, no overlays.
*/
static public ImageDescriptor getBaseImageDescriptor(final IErlElement element,
final int renderFlags) {
if (element instanceof IErlFunction) {
final IErlFunction fun = (IErlFunction) element;
if (fun.isExported()) {
return ErlideImage.FUNCTION_EXPORTED.getDescriptor();
}
}
return getImageDescriptionFromKind(element.getKind());
}
public static ImageDescriptor getImageDescriptionFromKind(final ErlElementKind kind) {
ErlideImage result = ErlideImage.UNKNOWN;
switch (kind) {
case ATTRIBUTE:
result = ErlideImage.ATTRIBUTE;
break;
case CLAUSE:
result = ErlideImage.FUNCTION_CLAUSE;
break;
case EXPORT:
result = ErlideImage.EXPORT;
break;
case EXPORTFUNCTION:
result = ErlideImage.FUNCTION_EXPORTED;
break;
case FOLDER:
result = ErlideImage.SRC_FOLDER;
break;
case FUNCTION:
result = ErlideImage.FUNCTION_DEFAULT;
break;
case EXTERNAL_ROOT:
result = ErlideImage.EXTERNAL_ROOT;
break;
case EXTERNAL_APP:
result = ErlideImage.EXTERNAL_APP;
break;
case EXTERNAL_FOLDER:
result = ErlideImage.EXTERNAL_FOLDER;
break;
case IMPORT:
result = ErlideImage.IMPORT;
break;
case MACRO_DEF:
result = ErlideImage.MACRO_DEF;
break;
case MODULE:
result = ErlideImage.MODULE;
break;
case RECORD_DEF:
result = ErlideImage.RECORD_DEF;
break;
case TYPESPEC:
result = ErlideImage.TYPESPEC_DEF;
break;
case RECORD_FIELD:
result = ErlideImage.RECORD_FIELD;
break;
case COMMENT:
case PROBLEM:
case HEADERCOMMENT:
case MODEL:
case LIBRARY:
case PROJECT:
result = ErlideImage.UNKNOWN;
break;
}
return result.getDescriptor();
}
public void dispose() {
}
// ---- Methods to compute the adornments flags
// ---------------------------------
// protected int computeAdornmentFlags(final IErlElement element,
// final int renderFlags) {
// int flags = 0;
// if (showOverlayIcons(renderFlags) && element instanceof IErlFunction) {
// try {
// final IErlFunction member = (IErlFunction) element;
//
// if (member.isExported()) {
// flags |= ErlangElementImageDescriptor.EXPORTED;
// }
//
// } catch (final Exception e) {
// // do nothing. Can't compute runnable adornment or get flags
// }
// }
// if (element instanceof ISourceReference) {
// final ISourceReference sr = (ISourceReference) element;
// try {
// flags |= ProblemsLabelDecorator.getErrorTicksFromMarkers(
// element.getResource(), IResource.DEPTH_INFINITE, sr);
// if (element instanceof IParent) {
// final IParent p = (IParent) element;
// for (final IErlElement e : p.getChildren()) {
// if (e instanceof ISourceReference) {
// final ISourceReference esr = (ISourceReference) e;
// flags |= ProblemsLabelDecorator
// .getErrorTicksFromMarkers(e.getResource(),
// IResource.DEPTH_INFINITE, esr);
// }
// }
// }
// } catch (final CoreException e) {
// }
// }
// return flags;
// }
public static Image getDecoratedImage(final ImageDescriptor baseImage,
final int adornments, final Point size) {
return ErlideUIPlugin.getImageDescriptorRegistry()
.get(new ErlangElementImageDescriptor(baseImage, adornments, size));
}
}