/*******************************************************************************
* 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.core.features.activity;
import org.eclipse.bpmn2.Activity;
import org.eclipse.bpmn2.LoopCharacteristics;
import org.eclipse.bpmn2.MultiInstanceLoopCharacteristics;
import org.eclipse.bpmn2.StandardLoopCharacteristics;
import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Loop;
import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.MultiInstance;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
public class ActivityLoopAndMultiInstanceMarkerUpdateFeature extends AbstractMarkerUpdateFeature {
public static String IS_LOOP_OR_MULTI_INSTANCE = "marker.loop.or.multi";
enum LoopCharacteristicType {
NULL("null"),
LOOP(StandardLoopCharacteristics.class.getSimpleName()),
MULTI_PARALLEL(MultiInstanceLoopCharacteristics.class.getSimpleName() + ":parallel"),
MULTI_SEQUENTIAL(MultiInstanceLoopCharacteristics.class.getSimpleName() + ":sequential");
private String name;
private LoopCharacteristicType(String name) {
this.name = name;
}
String getName() {
return name;
}
}
public ActivityLoopAndMultiInstanceMarkerUpdateFeature(IFeatureProvider fp) {
super(fp);
}
@Override
String getPropertyKey() {
return IS_LOOP_OR_MULTI_INSTANCE;
}
@Override
boolean isPropertyChanged(Activity activity, String propertyValue) {
return !getLoopCharacteristicsValue(activity).getName().equals(propertyValue);
}
@Override
void doUpdate(Activity activity, ContainerShape markerContainer) {
GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_LOOP_CHARACTERISTIC);
switch (getLoopCharacteristicsValue(activity)) {
case LOOP:
Loop loop = GraphicsUtil.createActivityMarkerStandardLoop(markerContainer);
loop.circle.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
loop.arrow.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
break;
case MULTI_PARALLEL:
MultiInstance multiParallel = GraphicsUtil.createActivityMarkerMultiParallel(markerContainer);
multiParallel.line1.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
multiParallel.line2.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
multiParallel.line3.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
break;
case MULTI_SEQUENTIAL:
MultiInstance multiSeq = GraphicsUtil.createActivityMarkerMultiSequential(markerContainer);
multiSeq.line1.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
multiSeq.line2.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
multiSeq.line3.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
break;
}
}
@Override
String convertPropertyToString(Activity activity) {
return getLoopCharacteristicsValue(activity).getName();
}
public static LoopCharacteristicType getLoopCharacteristicsValue(Activity activity) {
LoopCharacteristics loopCharacteristics = activity.getLoopCharacteristics();
LoopCharacteristicType type = LoopCharacteristicType.NULL;
if (loopCharacteristics != null) {
if (loopCharacteristics instanceof MultiInstanceLoopCharacteristics) {
MultiInstanceLoopCharacteristics multi = (MultiInstanceLoopCharacteristics) loopCharacteristics;
type = multi.isIsSequential() ? LoopCharacteristicType.MULTI_SEQUENTIAL
: LoopCharacteristicType.MULTI_PARALLEL;
} else {
type = LoopCharacteristicType.LOOP;
}
}
return type;
}
}