/**
*
*/
package org.activiti.designer.features;
import java.util.List;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.designer.util.CloneUtil;
import org.activiti.designer.util.editor.Bpmn2MemoryModel;
import org.activiti.designer.util.editor.ModelHandler;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.graphiti.features.IAddFeature;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IPasteContext;
import org.eclipse.graphiti.features.context.impl.AddContext;
import org.eclipse.graphiti.features.context.impl.AreaContext;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.ui.features.AbstractPasteFeature;
/**
* Paste feature for flow elements.
*
* @author Tiese Barrell
* @since 0.6.1
* @version 1
*
*/
public class PasteFlowElementFeature extends AbstractPasteFeature {
public static final int PASTE_OFFSET = 25;
public PasteFlowElementFeature(IFeatureProvider fp) {
super(fp);
}
public boolean canPaste(IPasteContext context) {
// only support pasting directly in the diagram (nothing else selected)
PictogramElement[] pes = context.getPictogramElements();
if (pes.length != 1 || !isPasteableContext(pes)) {
return false;
}
List<FlowElement> copyList = ModelHandler.getModel(EcoreUtil.getURI(getDiagram())).getClipboard();
if(copyList.size() > 0) {
return true;
} else {
return false;
}
}
private boolean isPasteableContext(PictogramElement[] pes) {
return (pes[0] instanceof Diagram) || (pes[0] instanceof ContainerShape);
}
public void paste(IPasteContext context) {
// we already verified, that we paste directly in the diagram
Bpmn2MemoryModel model = ModelHandler.getModel(EcoreUtil.getURI(getDiagram()));
List<FlowElement> copyList = model.getClipboard();
for (FlowElement element : copyList) {
FlowElement clone = CloneUtil.clone(element, getDiagram());
AddContext addContext = new AddContext(new AreaContext(), clone);
IAddFeature addFeature = getFeatureProvider().getAddFeature(addContext);
PictogramElement pictogram = getFeatureProvider().getPictogramElementForBusinessObject(element);
addContext.setLocation(pictogram.getGraphicsAlgorithm().getX() + PASTE_OFFSET, pictogram.getGraphicsAlgorithm().getY() + PASTE_OFFSET);
addContext.setSize(pictogram.getGraphicsAlgorithm().getWidth(), pictogram.getGraphicsAlgorithm().getHeight());
addContext.setTargetContainer(getDiagram());
if(addFeature.canAdd(addContext)) {
addFeature.add(addContext);
}
}
}
}