/******************************************************************************* * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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 *******************************************************************************/ package gov.redhawk.ide.graphiti.ui.palette; import java.util.ArrayList; import java.util.List; import org.eclipse.gef.palette.CombinedTemplateCreationEntry; import org.eclipse.gef.palette.ConnectionCreationToolEntry; import org.eclipse.gef.palette.PaletteContainer; 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.PaletteSeparator; import org.eclipse.gef.palette.PaletteStack; import org.eclipse.gef.requests.CreationFactory; import org.eclipse.gef.tools.AbstractTool; import org.eclipse.graphiti.dt.IDiagramTypeProvider; import org.eclipse.graphiti.features.ICreateFeature; import org.eclipse.graphiti.palette.IConnectionCreationToolEntry; import org.eclipse.graphiti.palette.ICreationToolEntry; import org.eclipse.graphiti.palette.IObjectCreationToolEntry; import org.eclipse.graphiti.palette.IPaletteCompartmentEntry; import org.eclipse.graphiti.palette.IPaletteSeparatorEntry; import org.eclipse.graphiti.palette.IStackToolEntry; import org.eclipse.graphiti.palette.IToolEntry; import org.eclipse.graphiti.tb.IToolBehaviorProvider; import org.eclipse.graphiti.ui.editor.IEclipseImageDescriptor; import org.eclipse.graphiti.ui.internal.Messages; import org.eclipse.graphiti.ui.internal.editor.GFConnectionCreationTool; import org.eclipse.graphiti.ui.internal.editor.GFCreationTool; import org.eclipse.graphiti.ui.internal.util.gef.MultiCreationFactory; import org.eclipse.graphiti.ui.services.GraphitiUi; import org.eclipse.jface.resource.ImageDescriptor; @SuppressWarnings("restriction") public class RHGraphitiPaletteRoot extends PaletteRoot { private IDiagramTypeProvider diagramTypeProvider; private PaletteContainer paletteTools = null; /** * Creates a new GenericPaletteRoot for the given Model. It is constructed * by calling createModelIndependentTools() and createCreationTools(). * * @param configurationProvider * the configuration provider */ public RHGraphitiPaletteRoot(IDiagramTypeProvider diagramTypeProvider) { this.diagramTypeProvider = diagramTypeProvider; updatePaletteEntries(); } private PaletteDrawer getEmptyDrawer(String label) { for (Object obj: this.getChildren()) { if (obj instanceof PaletteDrawer) { PaletteDrawer drawer = (PaletteDrawer) obj; if (drawer.getLabel().equals(label)) { // Can't just clear(), doesn't send property change // notification to update GUI drawer.setChildren(new ArrayList<Object>()); return (PaletteDrawer) obj; } } } return null; } /** * Creates resp. updates the PaletteEntries. All old PaletteEntries will be * removed and new ones will be created by calling the corresponding * create-methods. */ public void updatePaletteEntries() { // remove old entries setDefaultEntry(null); boolean setInitialDrawerState = false; // create new entries if (paletteTools == null) { paletteTools = createModelIndependentTools(); add(new PaletteEntry(null, null) { @Override public Object getType() { return "paletteFilter"; } }); setInitialDrawerState = true; } IToolBehaviorProvider currentToolBehaviorProvider = diagramTypeProvider.getCurrentToolBehaviorProvider(); IPaletteCompartmentEntry[] paletteCompartments = currentToolBehaviorProvider.getPalette(); List <String> compartmentLabels = new ArrayList<String>(); for (IPaletteCompartmentEntry compartmentEntry : paletteCompartments) { compartmentLabels.add(compartmentEntry.getLabel()); PaletteDrawer drawer = getEmptyDrawer(compartmentEntry.getLabel()); if (drawer == null) { drawer = new PaletteDrawer(compartmentEntry.getLabel(), getImageDescriptor(compartmentEntry)); if (setInitialDrawerState && !compartmentEntry.isInitiallyOpen()) { drawer.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED); } add(drawer); } List<IToolEntry> toolEntries = compartmentEntry.getToolEntries(); fillContainer(drawer, toolEntries); } // Hide the drawers for which no compartment entry was returned (empty) for (Object obj: getChildren()) { if (obj instanceof PaletteDrawer) { PaletteDrawer drawer = (PaletteDrawer) obj; if (!compartmentLabels.contains(drawer.getLabel())) { // Can't just call clear(), doesn't send property change // notification to update the GUI drawer.setChildren(new ArrayList<Object>()); } } } } protected PaletteEntry produceEntry(IToolEntry model) { if (model instanceof ICreationToolEntry) { return createTool((ICreationToolEntry) model); } if (model instanceof IStackToolEntry) { IStackToolEntry stackToolEntry = (IStackToolEntry) model; PaletteStack stack = new PaletteStack(stackToolEntry.getLabel(), stackToolEntry.getDescription(), GraphitiUi.getImageService().getImageDescriptorForId(diagramTypeProvider.getProviderId(), stackToolEntry.getIconId())); fillContainer(stack, stackToolEntry.getCreationToolEntries()); return stack; } if (model instanceof IPaletteSeparatorEntry) { return new PaletteSeparator(); } if (model instanceof PaletteTreeEntry) { PaletteTreeEntry treeEntry = (PaletteTreeEntry) model; PaletteNamespaceFolder folder = new PaletteNamespaceFolder(treeEntry.getLabel()); folder.setInitialState(treeEntry.isInitiallyOpen() ? PaletteDrawer.INITIAL_STATE_OPEN : PaletteDrawer.INITIAL_STATE_CLOSED); fillContainer(folder, treeEntry.getToolEntries()); return folder; } return null; } protected void fillContainer(PaletteContainer container, List<? extends IToolEntry> entries) { for (IToolEntry entry: entries) { container.add(produceEntry(entry)); } } /** * Creates and adds the model-independent tools to a new PaletteContainer. * This currently includes only the component/device filter. * * @return The PaletteContainer with the model-independent tools. */ protected PaletteContainer createModelIndependentTools() { PaletteGroup controlGroup = new PaletteGroup(Messages.GraphicsPaletteRoot_0_xmen); return controlGroup; } private PaletteEntry createTool(ICreationToolEntry creationToolEntry) { String label = creationToolEntry.getLabel(); String description = creationToolEntry.getDescription(); if (creationToolEntry instanceof IObjectCreationToolEntry) { IObjectCreationToolEntry objectCreationToolEntry = (IObjectCreationToolEntry) creationToolEntry; DefaultCreationFactory factory = new DefaultCreationFactory(objectCreationToolEntry.getCreateFeature(), ICreateFeature.class); CombinedTemplateCreationEntry pe = new CombinedTemplateCreationEntry(label, description, factory, factory, getImageDescriptor(creationToolEntry, true), getImageDescriptor(creationToolEntry, false)); pe.setId(objectCreationToolEntry.getCreateFeature().getName()); pe.setToolClass(GFCreationTool.class); return pe; } else if (creationToolEntry instanceof IConnectionCreationToolEntry) { IConnectionCreationToolEntry connectionCreationToolEntry = (IConnectionCreationToolEntry) creationToolEntry; MultiCreationFactory multiCreationFactory = new MultiCreationFactory( connectionCreationToolEntry.getCreateConnectionFeatures()); ConnectionCreationToolEntry pe = new ConnectionCreationToolEntry(label, description, multiCreationFactory, getImageDescriptor(creationToolEntry, true), getImageDescriptor(creationToolEntry, false)); pe.setToolClass(GFConnectionCreationTool.class); if (!diagramTypeProvider.getCurrentToolBehaviorProvider().isStayActiveAfterExecution( connectionCreationToolEntry)) { pe.setToolProperty(AbstractTool.PROPERTY_UNLOAD_WHEN_FINISHED, true); } return pe; } return null; } private class DefaultCreationFactory implements CreationFactory { private Object obj; private Object objType; /** * */ public DefaultCreationFactory(Object obj, Object objType) { super(); this.obj = obj; this.objType = objType; } /* * (non-Javadoc) * * @see org.eclipse.gef.requests.CreationFactory#getNewObject() */ public Object getNewObject() { return obj; } /* * (non-Javadoc) * * @see org.eclipse.gef.requests.CreationFactory#getObjectType() */ public Object getObjectType() { return objType; } } private ImageDescriptor getImageDescriptor(ICreationToolEntry creationToolEntry, boolean smallImage) { ImageDescriptor imageDescriptor = null; if (creationToolEntry instanceof IEclipseImageDescriptor) { imageDescriptor = ((IEclipseImageDescriptor) creationToolEntry).getImageDescriptor(); } else { String iconId = (smallImage) ? creationToolEntry.getIconId() : creationToolEntry.getLargeIconId(); imageDescriptor = GraphitiUi.getImageService().getImageDescriptorForId(diagramTypeProvider.getProviderId(), iconId); } return imageDescriptor; } private ImageDescriptor getImageDescriptor(IPaletteCompartmentEntry compartmentEntry) { ImageDescriptor imageDescriptor = null; if (compartmentEntry instanceof IEclipseImageDescriptor) { imageDescriptor = ((IEclipseImageDescriptor) compartmentEntry).getImageDescriptor(); } else { imageDescriptor = GraphitiUi.getImageService().getImageDescriptorForId(diagramTypeProvider.getProviderId(), compartmentEntry.getIconId()); } return imageDescriptor; } @Override public boolean acceptsType(Object type) { if ("paletteFilter".equals(type)) { return true; } return super.acceptsType(type); } }