/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.ConnectionCreationToolEntry;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteGroup;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.PanningSelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.gef.requests.SimpleFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import de.rcenvironment.core.communication.api.PlatformService;
import de.rcenvironment.core.communication.common.LogicalNodeId;
import de.rcenvironment.core.component.api.ComponentConstants;
import de.rcenvironment.core.component.api.ComponentUtils;
import de.rcenvironment.core.component.integration.ToolIntegrationContextRegistry;
import de.rcenvironment.core.component.model.api.ComponentInstallation;
import de.rcenvironment.core.component.model.api.ComponentInterface;
import de.rcenvironment.core.component.workflow.model.api.WorkflowLabel;
import de.rcenvironment.core.gui.resources.api.ComponentImageManager;
import de.rcenvironment.core.gui.workflow.Activator;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.core.utils.incubator.ServiceRegistry;
import de.rcenvironment.core.utils.incubator.ServiceRegistryAccess;
/**
* Factory for creating a new palette with all running components.
*
* @author Heinrich Wendel
*
*/
public class WorkflowPaletteFactory {
/**
* Returns a new (up to date) palette by consuming the ComponentRegistry.
*
* @param componentInstallations {@link List} of {@link ComponentInstallation}s
* @return A palette.
*/
public PaletteRoot createPalette(List<ComponentInstallation> componentInstallations) {
PaletteRoot palette = new PaletteRoot();
createToolsGroup(palette);
createComponentsGroup(palette, componentInstallations);
return palette;
}
private void createComponentsGroup(PaletteRoot palette, List<ComponentInstallation> componentInstallations) {
ServiceRegistryAccess serviceRegistryAccess = ServiceRegistry.createAccessFor(this);
PlatformService platformService = serviceRegistryAccess.getService(PlatformService.class);
LogicalNodeId localNode = platformService.getLocalDefaultLogicalNodeId();
Map<String, List<PaletteEntry>> groupedComponents = new HashMap<String, List<PaletteEntry>>();
componentInstallations = ComponentUtils.eliminateComponentInterfaceDuplicates(componentInstallations, localNode);
Collections.sort(componentInstallations);
for (ComponentInstallation ci : componentInstallations) {
ComponentInterface componentInterface = ci.getComponentRevision().getComponentInterface();
// prepare the icon of the component
ImageDescriptor imageDescriptor = null;
Image image = ComponentImageManager.getInstance().getIcon16Image(componentInterface);
if (image == null) {
imageDescriptor = Activator.getInstance().getImageRegistry().getDescriptor(Activator.IMAGE_RCE_ICON_16);
} else {
imageDescriptor = ImageDescriptor.createFromImage(image);
}
String name = componentInterface.getDisplayName();
ToolIntegrationContextRegistry toolIntegrationRegistry = serviceRegistryAccess.getService(ToolIntegrationContextRegistry.class);
if (componentInterface.getVersion() != null
&& (toolIntegrationRegistry.hasId(componentInterface.getIdentifier()) || componentInterface.getIdentifier()
.startsWith(ComponentConstants.COMPONENT_IDENTIFIER_PREFIX + "remoteaccess"))) {
name = name + StringUtils.format(WorkflowEditor.COMPONENTNAMES_WITH_VERSION, componentInterface.getVersion());
}
// create the palette entry
CombinedTemplateCreationEntry component = new CombinedTemplateCreationEntry(name, name,
new WorkflowNodeFactory(ci), imageDescriptor, imageDescriptor);
if (!groupedComponents.containsKey(componentInterface.getGroupName())) {
groupedComponents.put(componentInterface.getGroupName(), new ArrayList<PaletteEntry>());
}
groupedComponents.get(componentInterface.getGroupName()).add(component);
}
for (Map.Entry<String, List<PaletteEntry>> map : groupedComponents.entrySet()) {
List<PaletteEntry> list = map.getValue();
Collections.sort(list, new PaletteComperator());
}
List<String> specialGroups = new ArrayList<String>();
List<String> standardGroups = new ArrayList<String>();
// separate components into special ones (e.g. deprecated) to appear in the end and normal
// ones
for (String group : groupedComponents.keySet()) {
if (group.startsWith("_")) {
specialGroups.add(group);
} else {
standardGroups.add(group);
}
}
// sort and add them separately
Collections.sort(specialGroups, String.CASE_INSENSITIVE_ORDER);
Collections.sort(standardGroups, String.CASE_INSENSITIVE_ORDER);
for (String standardGroup : standardGroups) {
PaletteDrawer componentsDrawer = new PaletteDrawer(standardGroup);
componentsDrawer.addAll(groupedComponents.get(standardGroup));
componentsDrawer.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
palette.add(componentsDrawer);
}
for (String specialGroup : specialGroups) {
PaletteDrawer componentsDrawer = new PaletteDrawer(specialGroup);
componentsDrawer.addAll(groupedComponents.get(specialGroup));
componentsDrawer.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
palette.add(componentsDrawer);
}
}
private void createToolsGroup(PaletteRoot palette) {
PaletteGroup toolsGroup = new PaletteGroup(Messages.tools);
List<PaletteEntry> entries = new ArrayList<PaletteEntry>();
// Add a selection tool to the group
ToolEntry tool = new PanningSelectionToolEntry();
tool.setLabel(Messages.select);
palette.setDefaultEntry(tool);
entries.add(tool);
// Add (solid-line) connection tool
tool = new ConnectionCreationToolEntry(
Messages.connection,
Messages.newConnection,
new SimpleFactory(null),
ImageDescriptor.createFromURL(WorkflowPaletteFactory.class.getResource("/resources/icons/connection16.gif")), //$NON-NLS-1$
ImageDescriptor.createFromURL(WorkflowPaletteFactory.class.getResource("/resources/icons/connection24.gif"))); //$NON-NLS-1$
tool.setLabel(tool.getLabel());
entries.add(tool);
tool = new CombinedTemplateCreationEntry(WorkflowLabel.PALETTE_ENTRY_NAME,
Messages.label, new LabelFactory(), null, null);
tool.setDescription(Messages.labelDescription);
tool.setLargeIcon(ImageDescriptor.createFromURL(WorkflowPaletteFactory.class.getResource("/resources/icons/label_24.png")));
tool.setSmallIcon(ImageDescriptor.createFromURL(WorkflowPaletteFactory.class.getResource("/resources/icons/label_16.png")));
entries.add(tool);
toolsGroup.addAll(entries);
palette.add(toolsGroup);
}
/**
* Sorting help for entries.
*
* @author guer_go
*
*/
private class PaletteComperator implements Comparator<PaletteEntry> {
@Override
public int compare(PaletteEntry pal1, PaletteEntry pal2) {
return pal1.getLabel().compareToIgnoreCase(pal2.getLabel());
}
}
}