package com.isencia.passerelle.workbench.model.ui.command;
import java.util.Iterator;
import java.util.List;
import org.eclipse.gef.commands.Command;
import ptolemy.actor.IOPort;
import ptolemy.actor.TypedIORelation;
import ptolemy.kernel.ComponentRelation;
import ptolemy.kernel.CompositeEntity;
import ptolemy.kernel.Port;
import ptolemy.kernel.Relation;
import ptolemy.kernel.util.IllegalActionException;
import ptolemy.kernel.util.NamedObj;
import ptolemy.moml.Vertex;
import com.isencia.passerelle.editor.common.model.Link;
import com.isencia.passerelle.editor.common.model.LinkHolder;
import com.isencia.passerelle.workbench.model.utils.ModelChangeRequest;
public class DeleteLinkCommand extends Command implements IRefreshConnections {
private Link link;
private CompositeEntity parent;
private LinkHolder linkHolder;
/**
* @param linkHolder
* the linkHolder to set
*/
public void setLinkHolder(LinkHolder linkHolder) {
this.linkHolder = linkHolder;
}
public void setParent(CompositeEntity p) {
parent = p;
}
public DeleteLinkCommand(CompositeEntity p, Link link,LinkHolder linkHolder) {
this();
this.link = link;
this.parent = p;
this.linkHolder = linkHolder;
}
public DeleteLinkCommand() {
super("DeleteLink");
}
public void execute() {
doExecute();
}
protected void doExecute() {
// Perform Change in a ChangeRequest so that all Listeners are notified
parent.requestChange(new ModelChangeRequest(this.getClass(), link, "delete") {
@SuppressWarnings("unchecked")
@Override
protected void _execute() throws Exception {
try {
if (link.getHead() instanceof Vertex && link.getTail() instanceof Vertex) {
unlinkRelation(link.getRelation(), (NamedObj) link.getHead());
unlinkRelation(link.getRelation(), (NamedObj) link.getTail());
} else {
if (!(link.getHead() instanceof Vertex)) {
unlinkRelation(link.getRelation(), (NamedObj) link.getHead());
}
if (!(link.getTail() instanceof Vertex)) {
unlinkRelation(link.getRelation(), (NamedObj) link.getTail());
}
}
linkHolder.removeLink(link);
} catch (Exception e) {
}
}
});
}
public void redo() {
doExecute();
}
public void undo() {
// Perform Change in a ChangeRequest so that all Listeners are notified
parent.requestChange(new ModelChangeRequest(this.getClass(), link.getRelation(), "undo-delete") {
@Override
protected void _execute() throws Exception {
try {
if (link.getRelation().getContainer() == null) {
link.getRelation().setContainer(parent);
}
if (link.getHead() instanceof Vertex && link.getTail() instanceof Vertex) {
((TypedIORelation) ((Vertex) link.getHead()).getContainer()).link(((TypedIORelation) ((Vertex) link.getTail()).getContainer()));
} else {
if (!(link.getHead() instanceof Vertex)) {
((IOPort) link.getHead()).link(link.getRelation());
}
if (!(link.getTail() instanceof Vertex)) {
((IOPort) link.getTail()).link(link.getRelation());
}
}
linkHolder.registerLink(link);
} catch (Exception e) {
}
}
});
}
private void unlinkRelation(ComponentRelation connection, NamedObj namedObjToRemove) throws IllegalActionException {
List linkedPortList = connection.linkedObjectsList();
connection.unlinkAll();
for (Iterator<Object> iterator = linkedPortList.iterator(); iterator.hasNext();) {
Object temp = (Object) iterator.next();
if (temp instanceof Port && !temp.equals(namedObjToRemove)) {
((Port) temp).link(connection);
}
if (temp instanceof TypedIORelation) {
if (namedObjToRemove instanceof Vertex) {
if (!temp.equals(namedObjToRemove.getContainer())) {
((Relation) temp).link(connection);
}
} else {
((Relation) temp).link(connection);
}
}
}
}
}