/*******************************************************************************
* 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.features.data;
import java.util.Iterator;
import org.eclipse.bpmn2.BaseElement;
import org.eclipse.bpmn2.DataObject;
import org.eclipse.bpmn2.modeler.core.ModelHandler;
import org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature;
import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
import org.eclipse.bpmn2.modeler.core.features.UpdateBaseElementNameFeature;
import org.eclipse.bpmn2.modeler.core.features.data.AddDataFeature;
import org.eclipse.bpmn2.modeler.core.features.data.Properties;
import org.eclipse.bpmn2.modeler.ui.ImageProvider;
import org.eclipse.graphiti.features.IAddFeature;
import org.eclipse.graphiti.features.ICreateFeature;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.IReason;
import org.eclipse.graphiti.features.IUpdateFeature;
import org.eclipse.graphiti.features.context.ICreateContext;
import org.eclipse.graphiti.features.context.IUpdateContext;
import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
import org.eclipse.graphiti.features.impl.Reason;
import org.eclipse.graphiti.mm.algorithms.Polyline;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Shape;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.services.IPeService;
public class DataObjectFeatureContainer extends AbstractDataFeatureContainer {
@Override
public boolean canApplyTo(Object o) {
return super.canApplyTo(o) && o instanceof DataObject;
}
@Override
public ICreateFeature getCreateFeature(IFeatureProvider fp) {
return new CreateDataObjectFeature(fp);
}
@Override
public IAddFeature getAddFeature(IFeatureProvider fp) {
return new AddDataFeature<DataObject>(fp) {
@Override
public String getName(DataObject t) {
return t.getName();
}
};
}
@Override
public IUpdateFeature getUpdateFeature(IFeatureProvider fp) {
MultiUpdateFeature multiUpdate = new MultiUpdateFeature(fp);
multiUpdate.addUpdateFeature(new UpdateMarkersFeature(fp));
multiUpdate.addUpdateFeature(new UpdateBaseElementNameFeature(fp));
return multiUpdate;
}
private class UpdateMarkersFeature extends AbstractUpdateFeature {
public UpdateMarkersFeature(IFeatureProvider fp) {
super(fp);
}
@Override
public boolean canUpdate(IUpdateContext context) {
Object o = getBusinessObjectForPictogramElement(context.getPictogramElement());
return o != null && o instanceof BaseElement && canApplyTo(o);
}
@Override
public IReason updateNeeded(IUpdateContext context) {
IPeService peService = Graphiti.getPeService();
ContainerShape container = (ContainerShape) context.getPictogramElement();
DataObject data = (DataObject) getBusinessObjectForPictogramElement(container);
boolean isCollection = Boolean.parseBoolean(peService.getPropertyValue(container,
Properties.COLLECTION_PROPERTY));
return data.isIsCollection() != isCollection ? Reason.createTrueReason() : Reason.createFalseReason();
}
@Override
public boolean update(IUpdateContext context) {
IPeService peService = Graphiti.getPeService();
ContainerShape container = (ContainerShape) context.getPictogramElement();
DataObject data = (DataObject) getBusinessObjectForPictogramElement(container);
boolean drawCollectionMarker = data.isIsCollection();
Iterator<Shape> iterator = peService.getAllContainedShapes(container).iterator();
while (iterator.hasNext()) {
Shape shape = iterator.next();
String prop = peService.getPropertyValue(shape, Properties.HIDEABLE_PROPERTY);
if (prop != null && new Boolean(prop)) {
Polyline line = (Polyline) shape.getGraphicsAlgorithm();
line.setLineVisible(drawCollectionMarker);
}
}
peService.setPropertyValue(container, Properties.COLLECTION_PROPERTY,
Boolean.toString(data.isIsCollection()));
return true;
}
}
public static class CreateDataObjectFeature extends AbstractCreateFlowElementFeature<DataObject> {
public CreateDataObjectFeature(IFeatureProvider fp) {
super(fp, "Data Object",
"Provides information about what activities require to be performed or what they produce");
}
@Override
protected DataObject createFlowElement(ICreateContext context) {
DataObject data = ModelHandler.FACTORY.createDataObject();
data.setIsCollection(false);
data.setName("Data Object");
return data;
}
@Override
public String getCreateImageId() {
return ImageProvider.IMG_16_DATA_OBJECT;
}
@Override
public String getCreateLargeImageId() {
return getCreateImageId();
}
}
}