package com.isencia.passerelle.workbench.model.ui.command;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.gef.commands.Command;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ptolemy.actor.Actor;
import ptolemy.actor.TypedIORelation;
import ptolemy.kernel.CompositeEntity;
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.editor.common.utils.EditorUtils;
import com.isencia.passerelle.model.Flow;
import com.isencia.passerelle.workbench.model.ui.IPasserelleMultiPageEditor;
import com.isencia.passerelle.workbench.model.ui.utils.EclipseUtils;
import com.isencia.passerelle.workbench.model.utils.ModelChangeRequest;
public class DeleteComponentCommand extends Command implements IRefreshConnections {
private IPasserelleMultiPageEditor multiPageEditor;
public void setMultiPageEditor(IPasserelleMultiPageEditor multiPageEditor) {
this.multiPageEditor = multiPageEditor;
}
private List<Integer> indexList = new ArrayList<Integer>();
public void addIndex(Integer index) {
indexList.add(index);
}
public void emptyIndexList() {
indexList.removeAll(indexList);
}
private static Logger logger = LoggerFactory.getLogger(DeleteComponentCommand.class);
private NamedObj container;
private NamedObj child;
private CompositeEntity parent;
private List<DeleteLinkCommand> delecteListCommands = new ArrayList<DeleteLinkCommand>();
public DeleteComponentCommand() {
super("Delete");
}
public Logger getLogger() {
return logger;
}
public void execute() {
doExecute();
}
protected void doExecute() {
parent.requestChange(new ModelChangeRequest(this.getClass(), parent, "delete", child) {
@Override
protected void _execute() throws Exception {
// Flow toplevel = (Flow) child.toplevel();
Set<Link> links = new HashSet<Link>();
if (child instanceof Actor) {
Actor actor = (Actor) child;
List ports = new ArrayList();
ports.addAll(actor.inputPortList());
ports.addAll(actor.outputPortList());
for (Object p : ports) {
Set<Link> portLinks = multiPageEditor.getLinks(p);
if (portLinks != null) {
links.addAll(portLinks);
}
}
} else if (multiPageEditor != null) {
links = multiPageEditor.getLinks(child);
}
if (links != null && links.size() > 0) {
delecteListCommands = new ArrayList<DeleteLinkCommand>(links.size());
for (Link link : links) {
DeleteLinkCommand deleteLinkCommand = new DeleteLinkCommand((CompositeEntity)link.getRelation().getContainer(), link,multiPageEditor);
deleteLinkCommand.execute();
delecteListCommands.add(deleteLinkCommand);
}
}
if (child instanceof Vertex) {
Vertex vertex = (Vertex) child;
container = ((TypedIORelation) vertex.getContainer()).getContainer();
((TypedIORelation) vertex.getContainer()).setContainer(null);
} else {
container = child.getContainer();
EditorUtils.setContainer(child, null);
for (Integer index : indexList) {
Comparator comparator = Collections.reverseOrder();
Collections.sort(indexList, comparator);
multiPageEditor.removePage(index);
}
}
}
});
}
public void redo() {
doExecute();
}
private void restoreConnections(NamedObj child) {
for (Command cmd : delecteListCommands) {
cmd.undo();
}
}
public void setChild(NamedObj c) {
child = c;
}
public void setParent(CompositeEntity p) {
parent = p;
}
public void undo() {
// Perform Change in a ChangeRequest so that all Listeners are notified
parent.requestChange(new ModelChangeRequest(this.getClass(),parent, "undo-delete",child) {
@Override
protected void _execute() throws Exception {
try {
if (child instanceof Vertex) {
Vertex vertex = (Vertex) child;
((TypedIORelation) vertex.getContainer()).setContainer((CompositeEntity) container);
} else {
EditorUtils.setContainer(child, container);
}
restoreConnections(child);
} catch (Exception e) {
logger.error("Unable to undo deletion of component", e);
EclipseUtils.logError(e, "Unable to undo deletion of component", IStatus.ERROR);
}
}
});
}
}