/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import de.rcenvironment.core.component.model.api.ComponentDescription;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.EndpointType;
import de.rcenvironment.core.gui.resources.api.ImageManager;
import de.rcenvironment.core.gui.resources.api.StandardImages;
import de.rcenvironment.core.gui.workflow.editor.connections.EndpointTreeViewer;
/**
* {@link LabelProvider} for the contents of the {@link EndpointTreeViewer}.
*
* @author Heinrich Wendel
* @author Oliver Seebach
*
*/
public class EndpointLabelProvider extends LabelProvider {
private static final int INPUT_REQUIRED_DECORATOR_LOCATION = 1; // 1 = top right
private static final int INPUT_CONNECTED_DECORATOR_LOCATION = 0; // 0 = top left
private static final int ICON_SIZE = 16;
private Log log = LogFactory.getLog(EndpointLabelProvider.class);
private Image componentImage = ImageManager.getInstance().getSharedImage(StandardImages.RCE_LOGO_16);
private Image inputImage = ImageManager.getInstance().getSharedImage(StandardImages.INPUT_16);
private Image outputImage = ImageManager.getInstance().getSharedImage(StandardImages.OUTPUT_16);
private ImageDescriptor inputConnectedDecorationIcon = ImageDescriptor.createFromURL(
EndpointLabelProvider.class.getResource("/resources/icons/inputDecorationArrow.gif"));
private ImageDescriptor inputRequiredDecorationIcon = ImageDescriptor.createFromURL(
EndpointLabelProvider.class.getResource("/resources/icons/inputDecorationAsteriks.gif"));
private Map<String, Image> componentImages = new HashMap<String, Image>();
private EndpointType type;
private Map<Image, Image> connectedDecoratorCache = new HashMap<>();
private Map<Image, Image> requiredDecoratorCache = new HashMap<>();
public EndpointLabelProvider(EndpointType type) {
this.type = type;
}
@Override
public String getText(Object element) {
String name;
if (element instanceof WorkflowNode) {
name = ((WorkflowNode) element).getName();
} else if (element instanceof EndpointContentProvider.Endpoint) {
name = ((EndpointContentProvider.Endpoint) element).getName();
} else {
name = ""; //$NON-NLS-1$
}
return name;
}
@Override
public Image getImage(Object element) {
Image image = null;
if (element instanceof WorkflowNode) {
ComponentDescription componentDesc = ((WorkflowNode) element).getComponentDescription();
if (componentImages.containsKey(componentDesc.getIdentifier())) {
image = componentImages.get(componentDesc.getIdentifier());
} else {
byte[] icon = componentDesc.getIcon16();
if (icon != null) {
image = new Image(Display.getCurrent(), new ByteArrayInputStream(icon));
if (!image.isDisposed() && image != null) {
componentImages.put(componentDesc.getIdentifier(), image);
}
} else {
image = componentImage;
}
}
} else if (element instanceof EndpointContentProvider.Endpoint) {
if (type == EndpointType.INPUT) {
image = inputImage;
} else {
image = outputImage;
}
if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.ShortText) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_SHORTTEXT_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.Boolean) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_BOOLEAN_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.Integer) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_INTEGER_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.Float) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_FLOAT_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.Vector) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_VECTOR_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.Matrix) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_MATRIX_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.SmallTable) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_SMALLTABLE_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.DateTime) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_DATETIME_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.FileReference) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_FILE_16);
} else if (((EndpointContentProvider.Endpoint) element).getEndpointDescription().getDataType() == DataType.DirectoryReference) {
image = ImageManager.getInstance().getSharedImage(StandardImages.DATATYPE_DIRECTORY_16);
}
image = checkForDecorators(((EndpointContentProvider.Endpoint) element).getEndpointDescription(), image);
}
if (image == null || image.isDisposed()) {
log.warn("Image for " + element + " is null or disposed.");
}
return image;
}
private Image checkForDecorators(EndpointDescription endpointDescription, Image image) {
boolean inputRequired = false;
boolean inputConnected = false;
if (type == EndpointType.INPUT & endpointDescription.isConnected()) {
inputConnected = true;
}
if (type == EndpointType.INPUT & endpointDescription.isRequired()) {
inputRequired = true;
}
// Required and not connected
if (inputRequired && !inputConnected) {
if (requiredDecoratorCache.keySet().contains(image)) {
image = requiredDecoratorCache.get(image);
} else {
ImageDescriptor[] decorations = new ImageDescriptor[5];
decorations[INPUT_REQUIRED_DECORATOR_LOCATION] = inputRequiredDecorationIcon;
Image originalImage = image;
image = createDecoratedImage(originalImage, decorations);
requiredDecoratorCache.put(originalImage, image);
}
// Connected
} else if (inputConnected) {
if (connectedDecoratorCache.keySet().contains(image)) {
image = connectedDecoratorCache.get(image);
} else {
ImageDescriptor[] decorations = new ImageDescriptor[5];
decorations[INPUT_CONNECTED_DECORATOR_LOCATION] = inputConnectedDecorationIcon;
final Image originalImage = image;
image = createDecoratedImage(originalImage, decorations);
connectedDecoratorCache.put(originalImage, image);
}
}
return image;
}
private Image createDecoratedImage(Image originalImage, ImageDescriptor[] decorations) {
DecorationOverlayIcon decorationOverlayIcon =
new DecorationOverlayIcon(originalImage, decorations, new Point(ICON_SIZE, ICON_SIZE));
Image decoratedImage = decorationOverlayIcon.createImage();
return decoratedImage;
}
@Override
public void dispose() {
for (Image image : componentImages.values()) {
image.dispose();
}
for (Image image : connectedDecoratorCache.values()) {
image.dispose();
}
connectedDecoratorCache.clear();
for (Image image : requiredDecoratorCache.values()) {
image.dispose();
}
requiredDecoratorCache.clear();
}
}