/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.eclipse.bpmn2.modeler.ui.diagram;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.bpmn2.modeler.core.Activator;
import org.eclipse.bpmn2.modeler.core.Bpmn2Preferences;
import org.eclipse.bpmn2.modeler.core.features.activity.ActivitySelectionBehavior;
import org.eclipse.bpmn2.modeler.core.features.activity.task.extension.ICustomTaskEditor;
import org.eclipse.bpmn2.modeler.core.features.event.EventSelectionBehavior;
import org.eclipse.bpmn2.modeler.ui.FeatureMap;
import org.eclipse.bpmn2.modeler.ui.features.activity.task.CustomTaskFeatureContainer;
import org.eclipse.bpmn2.modeler.ui.features.activity.task.TaskFeatureContainer;
import org.eclipse.bpmn2.modeler.ui.features.choreography.ChoreographySelectionBehavior;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.graphiti.dt.IDiagramTypeProvider;
import org.eclipse.graphiti.features.FeatureCheckerAdapter;
import org.eclipse.graphiti.features.ICreateConnectionFeature;
import org.eclipse.graphiti.features.ICreateFeature;
import org.eclipse.graphiti.features.IFeature;
import org.eclipse.graphiti.features.IFeatureChecker;
import org.eclipse.graphiti.features.IFeatureCheckerHolder;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IContext;
import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.palette.IPaletteCompartmentEntry;
import org.eclipse.graphiti.palette.impl.ConnectionCreationToolEntry;
import org.eclipse.graphiti.palette.impl.ObjectCreationToolEntry;
import org.eclipse.graphiti.palette.impl.PaletteCompartmentEntry;
import org.eclipse.graphiti.tb.DefaultToolBehaviorProvider;
public class BpmnToolBehaviourFeature extends DefaultToolBehaviorProvider implements IFeatureCheckerHolder {
public BpmnToolBehaviourFeature(IDiagramTypeProvider diagramTypeProvider) {
super(diagramTypeProvider);
}
@Override
public IPaletteCompartmentEntry[] getPalette() {
EList<Resource> resources = getDiagramTypeProvider().getDiagram().eResource().getResourceSet().getResources();
IProject project = null;
for (Resource resource : resources) {
if (resource.getURI().segmentCount() > 1) {
String projectName = resource.getURI().segment(1);
project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
if (project != null) {
break;
}
}
}
Bpmn2Preferences pref = Bpmn2Preferences.getPreferences(project);
List<IPaletteCompartmentEntry> ret = new ArrayList<IPaletteCompartmentEntry>();
// add compartments from super class
IFeatureProvider featureProvider = getFeatureProvider();
createConnectors(pref, ret, featureProvider);
createEventsCompartments(pref, ret, featureProvider);
createTasksCompartments(pref, ret, featureProvider);
createGatewaysCompartments(pref, ret, featureProvider);
createEventDefinitionsCompartments(pref, ret, featureProvider);
createDataCompartments(pref, ret, featureProvider);
createOtherCompartments(pref, ret, featureProvider);
createCustomTasks(ret, featureProvider);
return ret.toArray(new IPaletteCompartmentEntry[ret.size()]);
}
private void createEventsCompartments(Bpmn2Preferences pref, List<IPaletteCompartmentEntry> ret,
IFeatureProvider featureProvider) {
PaletteCompartmentEntry compartmentEntry = new PaletteCompartmentEntry("Events", null);
ret.add(compartmentEntry);
createEntries(pref, FeatureMap.EVENTS, compartmentEntry, featureProvider);
}
private void createOtherCompartments(Bpmn2Preferences pref, List<IPaletteCompartmentEntry> ret,
IFeatureProvider featureProvider) {
PaletteCompartmentEntry compartmentEntry = new PaletteCompartmentEntry("Other", null);
compartmentEntry.setInitiallyOpen(false);
ret.add(compartmentEntry);
createEntries(pref, FeatureMap.OTHER, compartmentEntry, featureProvider);
}
private void createDataCompartments(Bpmn2Preferences pref, List<IPaletteCompartmentEntry> ret,
IFeatureProvider featureProvider) {
PaletteCompartmentEntry compartmentEntry = new PaletteCompartmentEntry("Data Items", null);
compartmentEntry.setInitiallyOpen(false);
ret.add(compartmentEntry);
createEntries(pref, FeatureMap.DATA, compartmentEntry, featureProvider);
}
private void createEventDefinitionsCompartments(Bpmn2Preferences pref, List<IPaletteCompartmentEntry> ret,
IFeatureProvider featureProvider) {
PaletteCompartmentEntry compartmentEntry = new PaletteCompartmentEntry("Event Definitions", null);
compartmentEntry.setInitiallyOpen(false);
ret.add(compartmentEntry);
createEntries(pref, FeatureMap.EVENT_DEFINITIONS, compartmentEntry, featureProvider);
}
private void createGatewaysCompartments(Bpmn2Preferences pref, List<IPaletteCompartmentEntry> ret,
IFeatureProvider featureProvider) {
PaletteCompartmentEntry compartmentEntry = new PaletteCompartmentEntry("Gateways", null);
ret.add(compartmentEntry);
createEntries(pref, FeatureMap.GATEWAYS, compartmentEntry, featureProvider);
}
private void createTasksCompartments(Bpmn2Preferences pref, List<IPaletteCompartmentEntry> ret,
IFeatureProvider featureProvider) {
PaletteCompartmentEntry compartmentEntry = new PaletteCompartmentEntry("Tasks", null);
ret.add(compartmentEntry);
createEntries(pref, FeatureMap.TASKS, compartmentEntry, featureProvider);
}
private void createConnectors(Bpmn2Preferences pref, List<IPaletteCompartmentEntry> ret,
IFeatureProvider featureProvider) {
PaletteCompartmentEntry compartmentEntry;
compartmentEntry = new PaletteCompartmentEntry("Connectors", null);
ret.add(compartmentEntry);
// add all create-connection-features to the new stack-entry
ICreateConnectionFeature[] createConnectionFeatures = featureProvider.getCreateConnectionFeatures();
for (ICreateConnectionFeature cf : createConnectionFeatures) {
if (pref.isEnabled(FeatureMap.getElement(cf))) {
ConnectionCreationToolEntry connectionCreationToolEntry = new ConnectionCreationToolEntry(
cf.getCreateName(), cf.getCreateDescription(), cf.getCreateImageId(),
cf.getCreateLargeImageId());
connectionCreationToolEntry.addCreateConnectionFeature(cf);
compartmentEntry.addToolEntry(connectionCreationToolEntry);
}
}
}
private void createEntries(Bpmn2Preferences pref, List<Class<? extends IFeature>> neededEntries,
PaletteCompartmentEntry compartmentEntry, IFeatureProvider featureProvider) {
List<ICreateFeature> tools = Arrays.asList(featureProvider.getCreateFeatures());
for (ICreateFeature cf : tools) {
EClass feature = FeatureMap.getElement(cf);
if (pref.isEnabled(feature) && neededEntries.contains(cf.getClass())) {
ObjectCreationToolEntry objectCreationToolEntry = new ObjectCreationToolEntry(cf.getCreateName(),
cf.getCreateDescription(), cf.getCreateImageId(), cf.getCreateLargeImageId(), cf);
compartmentEntry.addToolEntry(objectCreationToolEntry);
}
}
}
private void createCustomTasks(List<IPaletteCompartmentEntry> ret, IFeatureProvider featureProvider) {
PaletteCompartmentEntry compartmentEntry;
compartmentEntry = new PaletteCompartmentEntry("Custom Task", null);
compartmentEntry.setInitiallyOpen(false);
ret.add(compartmentEntry);
IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(
ICustomTaskEditor.TASK_EDITOR_ID);
try {
for (IConfigurationElement e : config) {
String name = e.getAttribute("name");
String id = e.getAttribute("id");
final Object o = e.createExecutableExtension("createFeature");
if (o instanceof CustomTaskFeatureContainer) {
CustomTaskFeatureContainer container = (CustomTaskFeatureContainer)o;
container.setId(featureProvider, id);
ICreateFeature cf = container.getCreateFeature(featureProvider);
ObjectCreationToolEntry objectCreationToolEntry = new ObjectCreationToolEntry(name,
cf.getCreateDescription(), cf.getCreateImageId(), cf.getCreateLargeImageId(), cf);
compartmentEntry.addToolEntry(objectCreationToolEntry);
}
}
} catch (Exception ex) {
Activator.logError(ex);
}
}
@Override
public IFeatureChecker getFeatureChecker() {
return new FeatureCheckerAdapter(false) {
@Override
public boolean allowAdd(IContext context) {
return super.allowAdd(context);
}
@Override
public boolean allowCreate() {
return super.allowCreate();
}
};
}
@Override
public GraphicsAlgorithm[] getClickArea(PictogramElement pe) {
if (ActivitySelectionBehavior.canApplyTo(pe)) {
return ActivitySelectionBehavior.getClickArea(pe);
} else if (EventSelectionBehavior.canApplyTo(pe)) {
return EventSelectionBehavior.getClickArea(pe);
} else if (ChoreographySelectionBehavior.canApplyTo(pe)) {
return ChoreographySelectionBehavior.getClickArea(pe);
}
return super.getClickArea(pe);
}
@Override
public GraphicsAlgorithm getSelectionBorder(PictogramElement pe) {
if (ActivitySelectionBehavior.canApplyTo(pe)) {
return ActivitySelectionBehavior.getSelectionBorder(pe);
} else if (EventSelectionBehavior.canApplyTo(pe)) {
return EventSelectionBehavior.getSelectionBorder(pe);
} else if (ChoreographySelectionBehavior.canApplyTo(pe)) {
return ChoreographySelectionBehavior.getSelectionBorder(pe);
}
return super.getSelectionBorder(pe);
}
}