package statechart.diagram.edit.commands; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gef.EditPart; import org.eclipse.gmf.runtime.common.core.command.AbstractCommand; import org.eclipse.gmf.runtime.common.core.command.CommandResult; import org.eclipse.gmf.runtime.common.core.command.ICommand; import statechart.Model; import statechart.Node; import statechart.StatechartFactory; import statechart.Transition; import statechart.Variable; public class StateChartCutCommand extends AbstractCommand implements ICommand { private List<EObject>elements; private List<EditPart>editparts; private static List<EObject> objectsToPaste; private Model model; public StateChartCutCommand(String label) { super(label); // TODO Auto-generated constructor stub } public StateChartCutCommand(String label, List affectedFiles) { super(label, affectedFiles); // TODO Auto-generated constructor stub } public StateChartCutCommand(String label, List<EObject> elements, List<EditPart> editparts, Model model) { super(label); this.elements = elements; this.editparts = editparts; this.model = model; } @Override protected CommandResult doExecuteWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException { List<EObject> myObjectsToCopy = new LinkedList<EObject> (EcoreUtil.copyAll(elements)); //check if it is consistent List<Node> fathers = new LinkedList<Node>(); List<Node> trNodes = new LinkedList<Node>(); List<Node> nodes = new LinkedList<Node>(); List<Transition> transitions = new LinkedList<Transition>(); List<Variable> variables = new LinkedList<Variable>(); for (Iterator<EObject> it = myObjectsToCopy.iterator(); it.hasNext();){ EObject cur = it.next(); Node node = StatechartFactory.eINSTANCE.createNode(); Transition tr = StatechartFactory.eINSTANCE.createTransition(); Variable var = StatechartFactory.eINSTANCE.createVariable(); if(cur.getClass().equals( node.getClass())){ node = (Node)cur; System.out.println("Node Name: "+node.getName()); if(!nodes.contains(node.getFather_of()) && !myObjectsToCopy.contains(node.getFather_of()) && node.getFather_of()!=null){ System.out.println(node.getFather_of().getLabel()); nodes.add(node.getFather_of()); } }else if(cur.getClass().equals( tr.getClass())){ tr = (Transition)cur; System.out.println("Transition Name: "+tr.getName()); if( !transitions.contains(tr) ) transitions.add(tr); }else if(cur.getClass().equals( var.getClass())){ var = (Variable)cur; System.out.println("Variable Name: "+var.getName()); if( !variables.contains(var)) variables.add(var); } } for(int i=0; i<nodes.size(); i++){ if(nodes.get(i).getFather_of()!=null) if(((!fathers.isEmpty() && !fathers.contains(nodes.get(i).getFather_of())) || fathers.isEmpty() ) && !nodes.isEmpty() && !nodes.contains(nodes.get(i).getFather_of())) fathers.add(nodes.get(i).getFather_of()); } for(int i=0; i<transitions.size(); i++){ if(((!trNodes.isEmpty() && !trNodes.contains(transitions.get(i).getSource())) || trNodes.isEmpty()) && !nodes.isEmpty() && !nodes.contains(transitions.get(i).getSource())) trNodes.add(transitions.get(i).getSource()); if(((!trNodes.isEmpty() && !trNodes.contains(transitions.get(i).getTarget())) || trNodes.isEmpty()) && !nodes.isEmpty() && !nodes.contains(transitions.get(i).getTarget())) trNodes.add(transitions.get(i).getTarget()); } //remove dependencies for(Iterator<Node> it = fathers.iterator(); it.hasNext();){ Node node = it.next(); if(!nodes.isEmpty() && !nodes.contains(node)){ nodes = deleteFatherFromNode(node, nodes); } } for(Iterator<Node> it = trNodes.iterator(); it.hasNext();){ Node node = it.next(); if(!nodes.isEmpty() && !nodes.contains(node)){ transitions = deleteTransitionFromList(node, transitions); } } objectsToPaste = new LinkedList<EObject>(); if(!nodes.isEmpty()){ objectsToPaste.addAll(nodes); Node root = model.getNodes().get(0); //TODO recursive deletion of nodes' children } if(!transitions.isEmpty()){ objectsToPaste.addAll(transitions); model.getTransitions().removeAll(transitions); } if(!variables.isEmpty()){ objectsToPaste.addAll(variables); model.getVariables().removeAll(variables); } this.setResult(CommandResult.newOKCommandResult()); return this.getCommandResult(); } private List<Node> deleteFatherFromNode(Node father, List<Node> list){ for (int i=0; i<list.size(); i++){ Node n = (Node)list.get(i); if(n.getFather_of().equals(father)){ n.setFather_of(null); list.set(i, n); } } return list; } public static List<EObject> getObjectsToPaste(){ return objectsToPaste; } private List<Transition> deleteTransitionFromList(Node node, List<Transition> list){ Transition t = StatechartFactory.eINSTANCE.createTransition(); List<Transition> localList = list; for (int i=0; i<list.size(); i++){ t = (Transition)list.get(i); if(t.getSource().equals(node) || t.getTarget().equals(node)){ localList.remove(t); } } return localList; } @Override protected CommandResult doRedoWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException { // TODO Auto-generated method stub return null; } @Override protected CommandResult doUndoWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException { // TODO Auto-generated method stub return null; } }