package net.ms.designer.editors.workflow.commands; import java.util.ArrayList; import java.util.List; import net.ms.designer.core.MsContext; import net.ms.designer.core.MsElement; import net.ms.designer.editors.packages.ui.PackageEditor; import net.ms.designer.editors.workflow.Messages; import net.ms.designer.editors.workflow.models.StartNode; import net.ms.designer.editors.workflow.models.SubFlowActivity; import net.ms.designer.editors.workflow.models.Wire; import net.ms.designer.editors.workflow.models.WorkflowDiagram; import net.ms.designer.editors.workflow.models.WorkflowSubPart; import org.eclipse.gef.commands.Command; import org.eclipse.ui.internal.UIPlugin; public class DeleteNodeCommand extends Command { private WorkflowSubPart child; private WorkflowDiagram parent; // private WorkflowGuide vGuide, hGuide; // private int vAlign, hAlign; private int index = -1; private List sourceConnections = new ArrayList(); private List targetConnections = new ArrayList(); public DeleteNodeCommand() { super(Messages.getString("DeleteCommand.name")); //$NON-NLS-1$ } public void setParent(WorkflowDiagram parent) { this.parent = parent; } public void setChild(WorkflowSubPart child) { this.child = child; } public void execute() { index = this.parent.getChildren().indexOf(child); this.deleteConnections(child); this.parent.removeChild(child); if (this.child instanceof SubFlowActivity) { MsContext context = ((PackageEditor) UIPlugin.getDefault() .getWorkbench().getActiveWorkbenchWindow().getActivePage() .getActiveEditor()).getContext(); MsElement childElement = context.getElement("subflow_" + child.getName()); MsElement parentElement = childElement.getParent(); if (parentElement != null) parentElement.removeChild(childElement); context.removeElement("subflow_" + child.getName()); } } private void deleteConnections(WorkflowSubPart part) { if (part instanceof WorkflowDiagram) { List children = ((WorkflowDiagram) part).getChildren(); for (int i = 0; i < children.size(); i++) deleteConnections((WorkflowSubPart) children.get(i)); } sourceConnections.addAll(part.getInputs()); for (int i = 0; i < sourceConnections.size(); i++) { Wire wire = (Wire) sourceConnections.get(i); wire.removeSource(); wire.removeTarget(); } targetConnections.addAll(part.getOutputs()); for (int i = 0; i < targetConnections.size(); i++) { Wire wire = (Wire) targetConnections.get(i); wire.removeSource(); wire.removeTarget(); } } public void redo() { this.execute(); } public void undo() { this.parent.addChild(child, index); this.restoreConnections(); } public boolean canExecute() { if (child instanceof StartNode || child.ifEditAble() == false) { return false; } return true; } private void restoreConnections() { for (int i = 0; i < sourceConnections.size(); i++) { Wire wire = (Wire) sourceConnections.get(i); wire.addSource(); wire.addTarget(); } sourceConnections.clear(); for (int i = 0; i < targetConnections.size(); i++) { Wire wire = (Wire) targetConnections.get(i); wire.addSource(); wire.addTarget(); } targetConnections.clear(); } }