/**
* Copyright (c) 2013-2016 Angelo ZERR.
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.eclipse.jface.images;
import java.io.File;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.graphics.Image;
import tern.metadata.TernModuleMetadata;
import tern.server.ITernModule;
import tern.server.protocol.completions.TernCompletionItem;
import tern.server.protocol.completions.TernTypeHelper;
import tern.utils.StringUtils;
/**
* Image registry for tern images.
*
*/
public class TernImagesRegistry {
// ES5
public static final String IMG_FN = "tern.eclipse.jface.IMG_FN";
public static final String IMG_ARRAY = "tern.eclipse.jface.IMG_ARRAY";
public static final String IMG_NUMBER = "tern.eclipse.jface.IMG_NUMBER";
public static final String IMG_STRING = "tern.eclipse.jface.IMG_STRING";
public static final String IMG_BOOLEAN = "tern.eclipse.jface.IMG_BOOLEAN";
public static final String IMG_UNKNOWN = "tern.eclipse.jface.IMG_UNKNOWN";
// ES6
public static final String IMG_CLASS = "tern.eclipse.jface.IMG_CLASS";
public static final String IMG_IMPORT = "tern.eclipse.jface.IMG_IMPORT";
static {
registerImageDescriptor(IMG_FN, ImageDescriptor.createFromFile(
TernImagesRegistry.class, "fn.gif"));
registerImageDescriptor(getOvr(IMG_FN), ImageDescriptor.createFromFile(
TernImagesRegistry.class, "fn_ovr.gif"));
registerImageDescriptor(IMG_ARRAY, ImageDescriptor.createFromFile(
TernImagesRegistry.class, "array.gif"));
registerImageDescriptor(getOvr(IMG_ARRAY),
ImageDescriptor.createFromFile(TernImagesRegistry.class,
"array_ovr.gif"));
registerImageDescriptor(IMG_NUMBER, ImageDescriptor.createFromFile(
TernImagesRegistry.class, "number.gif"));
registerImageDescriptor(getOvr(IMG_NUMBER),
ImageDescriptor.createFromFile(TernImagesRegistry.class,
"number_ovr.gif"));
registerImageDescriptor(IMG_STRING, ImageDescriptor.createFromFile(
TernImagesRegistry.class, "string.gif"));
registerImageDescriptor(getOvr(IMG_STRING),
ImageDescriptor.createFromFile(TernImagesRegistry.class,
"string_ovr.gif"));
registerImageDescriptor(IMG_BOOLEAN, ImageDescriptor.createFromFile(
TernImagesRegistry.class, "boolean.gif"));
registerImageDescriptor(getOvr(IMG_BOOLEAN),
ImageDescriptor.createFromFile(TernImagesRegistry.class,
"boolean_ovr.gif"));
registerImageDescriptor(IMG_UNKNOWN, ImageDescriptor.createFromFile(
TernImagesRegistry.class, "unknown.gif"));
registerImageDescriptor(getOvr(IMG_UNKNOWN),
ImageDescriptor.createFromFile(TernImagesRegistry.class,
"unknown_ovr.gif"));
registerImageDescriptor(IMG_CLASS, ImageDescriptor.createFromFile(
TernImagesRegistry.class, "class.gif"));
registerImageDescriptor(IMG_IMPORT, ImageDescriptor.createFromFile(
TernImagesRegistry.class, "import.png"));
}
private TernImagesRegistry() {
}
/**
* Returns the image from the image registry with the given key.
*
* @param key
* of the image
* @return the image from the image registry with the given key.
*/
public static Image getImage(String key) {
ImageRegistry imageRegistry = JFaceResources.getImageRegistry();
return imageRegistry.get(key);
}
/**
* Returns the image descriptor from the image registry with the given key.
*
* @param key
* of the image
* @return the image descriptor from the image registry with the given key.
*/
public static ImageDescriptor getImageDescriptor(String key) {
ImageRegistry imageRegistry = JFaceResources.getImageRegistry();
return imageRegistry.getDescriptor(key);
}
public static String getJSType(String jsType, boolean isFunction, boolean isArray, boolean returnNullIfUnknown) {
if (isFunction) {
return TernImagesRegistry.IMG_FN;
}
if (isArray) {
return TernImagesRegistry.IMG_ARRAY;
}
if (TernTypeHelper.isStringType(jsType)) {
return TernImagesRegistry.IMG_STRING;
} else if (TernTypeHelper.isNumberType(jsType)) {
return TernImagesRegistry.IMG_NUMBER;
} else if (TernTypeHelper.isBoolType(jsType)) {
return TernImagesRegistry.IMG_BOOLEAN;
}
if (TernTypeHelper.isFunctionRefType(jsType)) {
return TernImagesRegistry.IMG_FN;
}
if (returnNullIfUnknown) {
return null;
}
return TernImagesRegistry.IMG_UNKNOWN;
}
public static Image getImage(String jsType, boolean isFunction, boolean isArray, boolean returnNullIfUnknown) {
String key = getJSType(jsType, isFunction, isArray, returnNullIfUnknown);
return key != null ? getImage(key) : null;
}
public static String getJSType(TernCompletionItem item, boolean returnNullIfUnknown) {
return getJSType(item.getJsType(), item.isFunction(), item.isArray(), returnNullIfUnknown);
}
public static Image getImage(TernCompletionItem item,
boolean returnNullIfUnknown) {
String key = getJSType(item, returnNullIfUnknown);
return key != null ? getImage(key) : null;
}
public static ImageDescriptor getImageDescriptor(TernCompletionItem item,
boolean returnNullIfUnknown) {
String key = getJSType(item, returnNullIfUnknown);
return key != null ? getImageDescriptor(key) : null;
}
private static void registerImageDescriptor(String key,
ImageDescriptor descriptor) {
ImageRegistry imageRegistry = JFaceResources.getImageRegistry();
imageRegistry.put(key, descriptor);
}
static String getOvr(String typeKey) {
return new StringBuilder(typeKey).append("_ovr").toString();
}
public static Image getImage(ITernModule module) {
TernModuleMetadata metadata = module.getMetadata();
if (metadata == null) {
return null;
}
File icon = metadata.getFileIcon();
if (icon == null) {
return null;
}
String key = icon.getPath();
Image image = getImage(key);
if (image != null) {
return image;
}
ImageDescriptor desc = ImageDescriptor.createFromFile(null,
icon.getPath());
registerImageDescriptor(key, desc);
return TernImagesRegistry.getImage(key);
}
public static Image getImage(String jsType, ITernModule module) {
boolean hasJSType = !StringUtils.isEmpty(jsType);
boolean hasOrigin = module != null;
if (!hasJSType) {
// JS type is unknown, try to retrieve the image of the origin tern
// module
Image originImage = hasOrigin ? getImage(module) : null;
return originImage != null ? originImage : TernImagesRegistry
.getImage(TernImagesRegistry.IMG_UNKNOWN);
}
// here JS Type is known, try to retrieve the image of the origin tern
// module
if (!hasOrigin) {
// None origin, returns the JS type
return TernImagesRegistry.getImage(jsType);
}
// origin + js type is known, try to merge
String imageKey = getImageKey(jsType, module.getOrigin());
Image image = TernImagesRegistry.getImage(imageKey);
if (image != null) {
return image;
}
ImageDescriptor originImageDescriptor = getImageDescriptor(module);
if (originImageDescriptor == null) {
return TernImagesRegistry.getImage(jsType);
}
TernCompositeImageDescriptor desc = new TernCompositeImageDescriptor(
originImageDescriptor, jsType);
TernImagesRegistry.registerImageDescriptor(imageKey, desc);
return TernImagesRegistry.getImage(imageKey);
}
public static ImageDescriptor getImageDescriptor(ITernModule module) {
TernModuleMetadata metadata = module.getMetadata();
if (metadata == null) {
return null;
}
File icon = metadata.getFileIcon();
if (icon == null) {
return null;
}
String key = icon.getPath();
ImageDescriptor desc = getImageDescriptor(key);
if (desc != null) {
return desc;
}
desc = ImageDescriptor.createFromFile(null, icon.getPath());
registerImageDescriptor(key, desc);
return desc;
}
private static String getImageKey(String jsType, String origin) {
return jsType + "_" + origin;
}
public static ImageDescriptor getImageDescriptor(String jsType,
ITernModule module) {
boolean hasJSType = !StringUtils.isEmpty(jsType);
boolean hasOrigin = module != null;
if (!hasJSType) {
// JS type is unknown, try to retrieve the image of the origin tern
// module
ImageDescriptor originImage = hasOrigin ? getImageDescriptor(module)
: null;
return originImage != null ? originImage : TernImagesRegistry
.getImageDescriptor(TernImagesRegistry.IMG_UNKNOWN);
}
// here JS Type is known, try to retrieve the image of the origin tern
// module
if (!hasOrigin) {
// None origin, returns the JS type
return TernImagesRegistry.getImageDescriptor(jsType);
}
// origin + js type is known, try to merge
String imageKey = getImageKey(jsType, module.getOrigin());
ImageDescriptor image = TernImagesRegistry.getImageDescriptor(imageKey);
if (image != null) {
return image;
}
ImageDescriptor originImageDescriptor = getImageDescriptor(module);
if (originImageDescriptor == null) {
return TernImagesRegistry
.getImageDescriptor(TernImagesRegistry.IMG_UNKNOWN);
}
TernCompositeImageDescriptor desc = new TernCompositeImageDescriptor(
originImageDescriptor, jsType);
TernImagesRegistry.registerImageDescriptor(imageKey, desc);
return TernImagesRegistry.getImageDescriptor(imageKey);
}
}