package statechart.diagram.edit.commands;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IUndoContext;
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.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.SemanticEditPolicy;
import org.eclipse.gmf.runtime.diagram.ui.render.editparts.RenderedDiagramRootEditPart;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
import statechart.Model;
import statechart.Node;
import statechart.StatechartFactory;
import statechart.Transition;
import statechart.Variable;
import statechart.diagram.edit.commands.StateChartPasteCommand;
import statechart.diagram.edit.parts.ModelEditPart;
import statechart.diagram.edit.policies.ModelCanonicalEditPolicy;
/**
* @generated NOT
*/
public class PasteTransactionalCommand extends AbstractTransactionalCommand {
private EObject targetElement;
private List<EObject>elementsToPaste;
private StateChartPasteCommand enclosingPasteCommand;
private List<Transition> transitions;
private List<Node> nodes;
private List<Variable> variables;
private Model model;
private EditPart targetEditPart;
private List<EditPart> editparts;
public PasteTransactionalCommand(TransactionalEditingDomain domain,
String label, List affectedFiles) {
super(domain, label, affectedFiles);
// TODO Auto-generated constructor stub
}
public PasteTransactionalCommand(TransactionalEditingDomain domain,
String label, Map options, List affectedFiles) {
super(domain, label, options, affectedFiles);
// TODO Auto-generated constructor stub
}
public PasteTransactionalCommand(TransactionalEditingDomain domain, List elemToPaste,
EObject targetElement,
StateChartPasteCommand pasteCommand, List<EditPart> editparts){
super(domain, PasteTransactionalCommand.class.getName(), getWorkspaceFiles(elemToPaste));
this.targetElement = targetElement;
this.elementsToPaste = elemToPaste;
this.enclosingPasteCommand = pasteCommand;
EObject ob= targetElement.eContainer();
Model m = StatechartFactory.eINSTANCE.createModel();
while(!ob.getClass().equals(m.getClass())){
ob = ob.eContainer();
}
this.model = (Model)ob;
this.editparts = editparts;
this.targetEditPart = pasteCommand.targetEditPart;
System.out.println("Model : " + model.toString());
}
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor,
IAdaptable info) throws ExecutionException {
// TODO Relabeling nodes and transitions, add
Node root = StatechartFactory.eINSTANCE.createNode();
root = (Node)targetElement;
if (elementsToPaste==null){
return this.getCommandResult();
}
List<EObject> myObjectsToPaste = new LinkedList<EObject> (EcoreUtil.copyAll(elementsToPaste));
nodes = new LinkedList<Node>();
Transition t = StatechartFactory.eINSTANCE.createTransition();
transitions = new LinkedList<Transition>();
Variable v = StatechartFactory.eINSTANCE.createVariable();
variables = new LinkedList<Variable>();
for(int i=0; i<myObjectsToPaste.size(); i++){
if(myObjectsToPaste.get(i).getClass().equals(root.getClass())){
if(((Node)myObjectsToPaste.get(i)).getFather_of()==null){
System.out.println("Attach Node: " +myObjectsToPaste.get(i).toString());
nodes.add((Node)myObjectsToPaste.get(i));
}
}
if(myObjectsToPaste.get(i).getClass().equals(t.getClass())){
System.out.println("Transition To Paste: "+myObjectsToPaste.get(i).toString());
transitions.add((Transition)myObjectsToPaste.get(i));
}
if(myObjectsToPaste.get(i).getClass().equals(v.getClass())){
System.out.println("Variable To Paste: "+myObjectsToPaste.get(i).toString());
variables.add((Variable)myObjectsToPaste.get(i));
}
}
relabeling(root, nodes,transitions, true);
targetEditPart.refresh();
if(!transitions.isEmpty()){
System.out.println("Source: "+ transitions.get(0).getSource().getLabel()+" Target: "+transitions.get(0).getTarget().getLabel());
model.getTransitions().addAll(transitions);
}
for(int j=0; j<variables.size(); j++){
if(!model.getVariables().contains(variables.get(j)))
model.getVariables().add(variables.get(j));
}
RenderedDiagramRootEditPart rootPart = (RenderedDiagramRootEditPart) targetEditPart.getRoot();
rootPart.refresh();
rootPart.refreshVisuals();
rootPart.activate();
rootPart.refresh();
rootPart.refreshVisuals();
SemanticEditPolicy sep = (SemanticEditPolicy) ((EditPart) rootPart.getChildren().get(0)).getEditPolicy(EditPolicyRoles.SEMANTIC_ROLE);
if(sep!=null)
sep.activate();
refreshChildren((EditPart) rootPart);
ModelEditPart mep = new ModelEditPart(null);
EditPart ep = targetEditPart;
while(!ep.getClass().equals(mep.getClass()))
ep = ep.getParent();
mep = (ModelEditPart) ep;
ModelCanonicalEditPolicy mcep = (ModelCanonicalEditPolicy) mep.getEditPolicy(EditPolicyRoles.CANONICAL_ROLE);
mcep.activate();
mcep.refresh();
mcep.refreshConnections();
mcep.refreshSemantic();
mcep.refresh();
JOptionPane.showMessageDialog(null,"Please select one or all figures and arrange all!!!");
return this.getCommandResult();
}
protected CommandResult doUndoWithResult(IProgressMonitor progressMonitor,
IAdaptable info) throws ExecutionException {
// TODO Auto-generated method stub
if(!transitions.isEmpty()){
model.getTransitions().removeAll(transitions);
}
if(!variables.isEmpty()){
model.getVariables().removeAll(variables);
}
if(!nodes.isEmpty()){
for(int i=0; i<nodes.size(); i++)
DFSDelete(model.getNodes().get(0), nodes.get(i));
}
return null;
}
public void addContext(IUndoContext context){
super.addContext(context);
this.enclosingPasteCommand.addContext(context);
}
private void refreshChildren(EditPart part){
for(int i =0; i<part.getChildren().size(); i++){
((EditPart) part.getChildren().get(i)).refresh();
SemanticEditPolicy sep= (SemanticEditPolicy) ((EditPart) part.getChildren().get(i)).getEditPolicy(EditPolicyRoles.SEMANTIC_ROLE);
if(sep!=null)
sep.activate();
ConnectionEditPolicy cep = (ConnectionEditPolicy) ((EditPart)part.getChildren().get(i)).getEditPolicy(EditPolicyRoles.CONNECTION_LABELS_ROLE);
if(cep!=null)
cep.activate();
CanonicalEditPolicy ccep = (CanonicalEditPolicy) ((EditPart)part.getChildren().get(i)).getEditPolicy(EditPolicyRoles.CANONICAL_ROLE);
if(ccep!=null)
ccep.refresh();
refreshChildren((EditPart) part.getChildren().get(i));
}
}
/**
* This function sets the new labels for the pasted objects!!!
* @param Node root
* @param List<Node> nodes
* @param List<Transition> transitions
* @param boolean addAsChildren
*/
public void relabeling( Node root, List<Node> nodes,List<Transition>transitions, boolean addAsChildren){
String rootLabel = root.getLabel();
int rootChildren = root.getChildren().size()+1;
for(int i=0; i<nodes.size(); i++){
Node temp = EcoreUtil.copy(nodes.get(i));
if(temp.getName().equals(temp.getLabel())){
temp.setName(rootLabel+"." + Integer.toString(rootChildren+i));
}
temp.setLabel(rootLabel+"." + Integer.toString(rootChildren+i));
if(addAsChildren)
root.getChildren().add(temp);
for(int j =0; j<transitions.size(); j++){
if(transitions.get(j).getSource().getLabel()!=null &&
nodes.get(i).getLabel().equals(transitions.get(j).getSource().getLabel())){
System.out.println("Relabeling Source");
Transition t = transitions.get(j);
t.setSource(temp);
if(t.getName().length()>0){
int index =0;
index=t.getName().indexOf("TO");
String newName = t.getName().substring(index, t.getName().length()-1);
t.setName(t.getSource().getLabel().concat(newName));
}
transitions.set(j, t);
}
if(transitions.get(j).getTarget().getLabel()!=null &&
nodes.get(i).getLabel().equals(transitions.get(j).getTarget().getLabel())){
System.out.println("Relabeling Target");
Transition t = transitions.get(j);
t.setTarget(temp);
if(t.getName().length()>0){
int index =0;
index= t.getName().indexOf("TO");
String newName = t.getName().substring(0, index+2);
t.setName(newName.concat(t.getTarget().getLabel()));
}
for(int e=0; e<editparts.size(); e++){
if(editparts.get(e).getModel().equals(transitions.get(j))){
EditPart ep = editparts.get(e);
ep.setModel(t);
editparts.set(e,ep);
}
}
transitions.set(j, t);
System.out.println("New transition: "+ t.toString());
}
}
nodes.set(i, temp);
if(temp.getChildren().size()>0){
List<Node> nd = new LinkedList<Node>();
nd=(List<Node>) EcoreUtil.copyAll(temp.getChildren());
temp.getChildren().removeAll(temp.getChildren());
relabeling(temp, nd, transitions, true);
}
}
}
public void DFSDelete(Node root, Node node){
Iterator<Node> it = root.getChildren().iterator();
Node search = null;
while( it.hasNext()){
search = it.next();
if(search.getName().equals(node.getName()) && !search.getLabel().equals(node.getLabel())){
root.getChildren().remove(search);
}
else if(search.getChildren().size()>0){
DFSDelete(search, node);
}
}
}
public void printChildrensClass(EditPart part){
for(int i=0; i<part.getChildren().size(); i++){
System.out.println("Parent " + part.toString()+" child "+part.getChildren().get(i).toString());
if(!((EditPart)part.getChildren().get(i)).getChildren().isEmpty())
printChildrensClass((EditPart)part.getChildren().get(i));
}
}
}