package org.activiti.designer.features;
import java.util.Collection;
import java.util.List;
import org.activiti.bpmn.model.Association;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SubProcess;
import org.activiti.designer.util.editor.ModelHandler;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICustomContext;
import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
public class DeleteAssociationFeature extends AbstractCustomFeature {
public DeleteAssociationFeature(IFeatureProvider fp) {
super(fp);
}
@Override
public String getDescription() {
return "Delete Association";
}
@Override
public String getName() {
return "Delete Association";
}
@Override
public boolean canExecute(ICustomContext context) {
final PictogramElement[] pictogramElements = context.getPictogramElements();
if (context.getPictogramElements() == null) {
return false;
}
for (final PictogramElement pictogramElement : pictogramElements) {
final Object bo = getBusinessObjectForPictogramElement(pictogramElement);
if (bo == null) {
continue;
}
if (!(bo instanceof Association)) {
return false;
}
}
return true;
}
@Override
public void execute(ICustomContext context) {
final PictogramElement[] pictogramElements = context.getPictogramElements();
for (final PictogramElement pictogramElement : pictogramElements) {
final Object bo = getBusinessObjectForPictogramElement(pictogramElement);
if (bo == null) {
continue;
}
final Association association = (Association) bo;
getDiagram().getPictogramLinks().remove(pictogramElement.getLink());
getDiagram().getConnections().remove(pictogramElement);
final List<Process> processes = ModelHandler.getModel(EcoreUtil.getURI(getDiagram())).getBpmnModel().getProcesses();
for (final Process process : processes) {
process.getArtifacts().remove(association);
removeArtifact(association, process);
}
}
}
private void removeArtifact(Association association, BaseElement parentElement) {
Collection<FlowElement> elementList = null;
if (parentElement instanceof Process) {
elementList = ((Process) parentElement).getFlowElements();
} else if (parentElement instanceof SubProcess) {
elementList = ((SubProcess) parentElement).getFlowElements();
}
for (final FlowElement flowElement : elementList) {
if (flowElement instanceof SubProcess) {
final SubProcess subProcess = (SubProcess) flowElement;
subProcess.removeArtifact(association.getId());
removeArtifact(association, subProcess);
}
}
}
}