package com.isencia.passerelle.workbench.model.editor.ui.palette;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.ConnectionCreationToolEntry;
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.PaletteStack;
import org.eclipse.gef.palette.PanningSelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.gef.requests.CreationFactory;
import org.eclipse.gef.tools.MarqueeSelectionTool;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.part.EditorPart;
import ptolemy.actor.Director;
import com.isencia.passerelle.editor.common.model.PaletteGroup;
import com.isencia.passerelle.editor.common.model.PaletteItemDefinition;
import com.isencia.passerelle.editor.common.model.SubModelPaletteItemDefinition;
import com.isencia.passerelle.model.Flow;
import com.isencia.passerelle.starter.ActorBundleInitializer;
import com.isencia.passerelle.workbench.model.editor.ui.Activator;
import com.isencia.passerelle.workbench.model.editor.ui.ColorRegistry;
import com.isencia.passerelle.workbench.model.editor.ui.WorkbenchUtility;
import com.isencia.passerelle.workbench.model.ui.utils.EclipseUtils;
import com.isencia.passerelle.workbench.model.utils.ModelUtils;
public class PaletteBuilder extends com.isencia.passerelle.editor.common.model.PaletteBuilder {
static {
// The builder must load the passerelle plugins
// otherwise it cannot load properly. We do this
// in a lazy way otherwise DAWN takes a long time to start and
// this defect happens:
// http://jira.diamond.ac.uk/browse/DAWNSCI-858
ActorBundleInitializer initer = com.isencia.passerelle.starter.Activator.getInitializer();
if (initer!=null) initer.start();
}
@Override
public void logError(Exception e) {
EclipseUtils.logError(e, e.getMessage(), IStatus.ERROR);
// EclipseUtils.displayErrorDialog("Error during open palette", e.getMessage());
}
private static PaletteBuilder builder;
public static PaletteBuilder getInstance() {
if (builder == null) {
builder = new PaletteBuilder();
}
return builder;
}
public static final String FAVORITE_GROUPS = "FavoriteGroups";
public static final String DEFAULT_FAVORITES_NAME = "Favorites";
private CreationFactory selectedItem;
public CreationFactory getSelectedItem() {
return selectedItem;
}
public void setSelectedItem(CreationFactory selectedItem) {
this.selectedItem = selectedItem;
}
public static String[] getFavoriteGroupNames() throws Exception {
String groups = ModelUtils.getFavouritesStore().getString(FAVORITE_GROUPS);
if (groups == null || groups.trim().equals("")) {
return new String[] { DEFAULT_FAVORITES_NAME };
}
return groups.split(",");
}
/*
* (non-Javadoc)
* @see com.isencia.passerelle.editor.common.model.PaletteBuilder#newDefaultIdeIcon()
*/
@Override
protected Object newDefaultIdeIcon() {
return Activator.getImageDescriptor("icons/ide.gif");
}
@Override
protected Object newDefaultFolderIcon() {
return Activator.getImageDescriptor("icons/folder.gif");
}
@Override
protected Object createIcon(Object defaultIcon, String iconClazzAttribute, String iconAttribute, String bundleId) {
try {
if (iconAttribute != null && !iconAttribute.trim().equals("")) {
return Activator.getImageDescriptor(bundleId, iconAttribute);
}
} catch (Exception e) {
}
if (defaultIcon == null) {
return Activator.getImageDescriptor("icons/ide.gif");
}
return defaultIcon;
}
PaletteBuilder() {
super();
// TODO Auto-generated constructor stub
}
private static PaletteRoot paletteRoot;
public static PaletteContainer createFavoriteContainer(String favoriteGroup) {
PaletteContainer createPaletteContainer = createPaletteContainer(favoriteGroup, Activator.getImageDescriptor("icons/favourites.gif"), true);
return createPaletteContainer;
}
public static void synchFavorites(PaletteViewer paletteViewer) throws Exception {
StringBuffer containers = new StringBuffer();
List containertLis = paletteRoot.getChildren();
for (Object e : containertLis) {
if (e instanceof PaletteDrawer) {
PaletteContainer favoritesContainer = (PaletteDrawer) e;
containers.append(favoritesContainer.getLabel());
containers.append(",");
StringBuffer entries = new StringBuffer();
for (Object o : favoritesContainer.getChildren()) {
if (o instanceof CombinedTemplateCreationEntry) {
CombinedTemplateCreationEntry entry = (CombinedTemplateCreationEntry) o;
ClassTypeFactory entryType = (ClassTypeFactory) entry.getTemplate();
Object objectType = entryType.getObjectType();
if (entryType.getNewObject() instanceof SubModelPaletteItemDefinition) {
entries.append(((SubModelPaletteItemDefinition) entryType.getNewObject()).getName());
entries.append(",");
} else {
entries.append(((Class) objectType).getName());
entries.append(",");
}
}
addFavoriteGroup(favoritesContainer.getLabel(), favoritesContainer);
ModelUtils.getFavouritesStore().putValue(favoritesContainer.getLabel(), entries.toString());
}
}
}
ModelUtils.getFavouritesStore().putValue(PaletteBuilder.FAVORITE_GROUPS, containers.toString());
WorkbenchUtility.addMouseListenerToPaletteViewer(paletteViewer);
try {
ModelUtils.getFavouritesStore().save();
} catch (IOException ex) {
}
}
public static PaletteContainer getDefaultFavoriteGroup() {
PaletteEntry entry = favoritesContainers.get(PaletteBuilder.DEFAULT_FAVORITES_NAME);
if (entry instanceof PaletteContainer) {
return (PaletteContainer) entry;
}
return createFavoriteContainer(PaletteBuilder.DEFAULT_FAVORITES_NAME);
}
public static PaletteEntry getFavoriteGroup(String name) {
return favoritesContainers.get(name);
}
public static void addFavoriteGroup(String name, PaletteEntry e) {
favoritesContainers.put(name, e);
}
static public HashMap<String, PaletteEntry> favoritesContainers = new HashMap<String, PaletteEntry>();
static private PaletteContainer createControlGroup(PaletteRoot root) {
org.eclipse.gef.palette.PaletteGroup controlGroup = new org.eclipse.gef.palette.PaletteGroup("ControlGroup");
List entries = new ArrayList();
final ToolEntry tool = new PanningSelectionToolEntry();
entries.add(tool);
root.setDefaultEntry(tool);
PaletteStack marqueeStack = new PaletteStack("Stack", "", null); //$NON-NLS-1$
marqueeStack.add(new MarqueeToolEntry());
MarqueeToolEntry marquee = new MarqueeToolEntry();
marquee.setToolProperty(MarqueeSelectionTool.PROPERTY_MARQUEE_BEHAVIOR, new Integer(MarqueeSelectionTool.BEHAVIOR_CONNECTIONS_TOUCHED));
marqueeStack.add(marquee);
marquee = new MarqueeToolEntry();
marquee.setToolProperty(MarqueeSelectionTool.PROPERTY_MARQUEE_BEHAVIOR, new Integer(MarqueeSelectionTool.BEHAVIOR_CONNECTIONS_TOUCHED
| MarqueeSelectionTool.BEHAVIOR_NODES_CONTAINED));
marqueeStack.add(marquee);
marqueeStack.setUserModificationPermission(PaletteEntry.PERMISSION_NO_MODIFICATION);
entries.add(marqueeStack);
final ConnectionCreationToolEntry ctool = new ConnectionCreationToolEntry("Connection", "Connection", null,
Activator.getImageDescriptor("icons/connection16.gif"), Activator.getImageDescriptor("icons/connection24.gif"));
entries.add(ctool);
controlGroup.addAll(entries);
return controlGroup;
}
/**
* Change to make first palette open and others closed, as we will put the most important actors in this palette.
*
* @param name
* @param image
* @return
*/
static private PaletteContainer createPaletteContainer(final String name, final ImageDescriptor image, final boolean open) {
PaletteDrawer drawer = new PaletteDrawer(name, image);
if (open) {
drawer.setInitialState(PaletteDrawer.INITIAL_STATE_OPEN);
} else {
drawer.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
}
return drawer;
}
private EditorPart parent;
public PaletteRoot createPalette(EditorPart parent) throws Exception {
this.parent = parent;
if (paletteRoot == null) {
paletteRoot = new PaletteRoot();
paletteRoot.addAll(createCategories(paletteRoot, parent, null));
}
return paletteRoot;
}
List createCategories(PaletteRoot root, EditorPart parent, PaletteGroup utilitiesGroup) throws Exception {
List categories = new ArrayList();
categories.add(createControlGroup(root));
if (utilitiesGroup != null) {
PaletteContainer paletteContainer = createPaletteContainer(utilitiesGroup.getName(), (ImageDescriptor) utilitiesGroup.getIcon(), true);
for (PaletteItemDefinition def : utilitiesGroup.getPaletteItems()) {
CombinedTemplateCreationEntry entry = createPaletteEntryFromPaletteDefinition(def);
paletteContainer.add(entry);
}
categories.add(paletteContainer);
}
String[] favoriteGroups = getFavoriteGroupNames();
for (String favoriteGroup : favoriteGroups) {
PaletteContainer createPaletteContainer = createFavoriteContainer(favoriteGroup);
createPaletteContainer.setDescription("Click and drag favourite actors from the 'Palette' view.");
favoritesContainers.put(favoriteGroup, createPaletteContainer);
categories.add(createPaletteContainer);
String favorites = ModelUtils.getFavouritesStore().getString(favoriteGroup);
if (favorites != null && !favorites.trim().equals("")) {
String[] names = favorites.split(",");
for (String name : names) {
addFavorite(name, (PaletteContainer) createPaletteContainer);
}
}
}
return categories;
}
public boolean containsFavorite(PaletteContainer container, Object type, Object name) {
List children = container.getChildren();
for (Object child : children) {
if (child instanceof CombinedTemplateCreationEntry) {
CombinedTemplateCreationEntry entry = (CombinedTemplateCreationEntry) child;
ClassTypeFactory entryType = (ClassTypeFactory) entry.getTemplate();
if ((((Class) entryType.getObjectType()).getName().equals(type) && entryType.getNewObject().equals(name))
|| (entryType.getNewObject() instanceof SubModelPaletteItemDefinition && ((SubModelPaletteItemDefinition) entryType.getNewObject()).getName()
.equals(name))) {
return true;
}
}
}
return false;
}
public void removeFavorite(String name) throws Exception {
ModelUtils.getFavouritesStore().putValue(name, "");
}
public boolean addFavorite(String className, PaletteContainer container) {
PaletteItemDefinition paletteItem = getPaletteItem(className);
if (paletteItem == null) {
// not in default actors palette, maybe it's a submodel?
paletteItem = getSubModelGroup().getPaletteItem(className);
}
if (paletteItem != null && !containsFavorite(container, className, paletteItem.getName())) {
CombinedTemplateCreationEntry createPaletteEntryFromPaletteDefinition = createPaletteEntryFromPaletteDefinition(paletteItem);
container.add(createPaletteEntryFromPaletteDefinition);
return true;
}
return false;
}
public Color getColor(Class clazz) {
if (clazz == null) {
return null;
}
return getColor(clazz.getName());
}
public Color getColor(String clazz) {
PaletteItemDefinition itemDefinition = getPaletteItem(clazz);
if (itemDefinition != null) {
return ColorRegistry.getInstance().getColor(itemDefinition.getColor());
}
return null;
}
public String getType(Class clazz) {
if (clazz.equals(Flow.class)) {
return "Subflow";
}
return getType(clazz.getName());
}
public String getType(String clazz) {
try {
if (Director.class.isAssignableFrom(Class.forName(clazz))) {
return "Director";
}
} catch (ClassNotFoundException e) {
}
PaletteItemDefinition itemDefinition = getPaletteItem(clazz);
if (itemDefinition != null) {
return itemDefinition.getName();
}
return clazz;
}
public static CombinedTemplateCreationEntry createPaletteEntryFromPaletteDefinition(PaletteItemDefinition def) {
if (def instanceof SubModelPaletteItemDefinition) {
return new CombinedTemplateCreationEntry(def.getName(), def.getName(), new ClassTypeFactory(def.getClazz(), (SubModelPaletteItemDefinition) def),
(ImageDescriptor) def.getIcon(), //$NON-NLS-1$
(ImageDescriptor) def.getIcon()//$NON-NLS-1$
);
} else {
return new CombinedTemplateCreationEntry(def.getName(), def.getName(), new ClassTypeFactory(def.getClazz(), def.getName()),
(ImageDescriptor) def.getIcon(), //$NON-NLS-1$
(ImageDescriptor) def.getIcon()//$NON-NLS-1$
);
}
}
public void removeSubModel(String name) throws Exception {
PaletteGroup submodels = getSubModelGroup();
submodels.removePaletteItem(getPaletteItem(name));
}
public ImageDescriptor getIcon(Class clazz) {
if (clazz == null) {
return null;
}
return getIcon(clazz.getName());
}
public ImageDescriptor getIcon(String clazz) {
PaletteItemDefinition itemDefinition = getPaletteItem(clazz);
if (itemDefinition != null) {
return (ImageDescriptor) itemDefinition.getIcon();
}
return Activator.getImageDescriptor("icons/folder.gif");
}
}