package com.isencia.passerelle.workbench.model.ui.command; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.gef.commands.Command; import org.eclipse.gef.ui.actions.Clipboard; import ptolemy.actor.Actor; import ptolemy.actor.CompositeActor; import ptolemy.actor.Director; import ptolemy.actor.IOPort; import ptolemy.kernel.ComponentEntity; import ptolemy.kernel.Port; import ptolemy.kernel.util.NamedObj; import com.isencia.passerelle.editor.common.business.ICommand; import com.isencia.passerelle.editor.common.model.Link; import com.isencia.passerelle.editor.common.utils.EditorUtils; import com.isencia.passerelle.workbench.model.opm.LinkWithBendPoints; import com.isencia.passerelle.workbench.model.ui.IPasserelleMultiPageEditor; public class PasteNodeCommand extends Command { private IPasserelleMultiPageEditor editor; public PasteNodeCommand(IPasserelleMultiPageEditor editor) { super(); this.editor = editor; } private List<ICommand> list = new ArrayList<ICommand>(); @Override public boolean canExecute() { ArrayList clipBoardList = (ArrayList) Clipboard.getDefault().getContents(); if (clipBoardList == null || clipBoardList.isEmpty()) return false; return true; } public boolean isPastableNamedObj(NamedObj namedObj) { if (namedObj instanceof Director) return false; return true; } private NamedObj getParent(NamedObj actor) { if (actor == null) return null; if (actor.getContainer() == null) { return actor; } return (getParent(actor.getContainer())); } @Override public void execute() { if (!canExecute()) return; ArrayList clipboardList = (ArrayList) Clipboard.getDefault().getContents(); CompositeActor selectedContainer = editor.getSelectedContainer(); Map<NamedObj, NamedObj> map = new HashMap<NamedObj, NamedObj>(); Iterator<Object> it = clipboardList.iterator(); list.clear(); // first create all the copied nodes: the nodes have to exist before you // can create the copied connections while (it.hasNext()) { try { Object o = it.next(); if (o instanceof NamedObj) { NamedObj child = (NamedObj) o; double[] location = EditorUtils.getLocation(child); CopyComponentCommand cmd = new CopyComponentCommand(selectedContainer, child,new double[] { location[0] + 100, location[1] + 100 }); cmd.execute(); list.add(cmd); NamedObj newChild = cmd.getNewChild(); map.put(child, newChild); } } catch (Exception e) { e.printStackTrace(); } } it = clipboardList.iterator(); boolean hasLinks = false; while (it.hasNext()) { try { Object o = it.next(); if (o instanceof LinkWithBendPoints) { hasLinks = true; Link link = (Link) o; NamedObj head = (NamedObj) link.getHead(); NamedObj tail = (NamedObj) link.getTail(); NamedObj newHead = map.get(head); if (newHead == null) { newHead = searchPort(head, map); } NamedObj newTail = map.get(tail); if (newTail == null) { newTail = searchPort(tail, map); } if (newTail != null && newHead != null) { CreateConnectionCommand createLinkCommand = new CreateConnectionCommand(newHead, newTail, editor); list.add(createLinkCommand); createLinkCommand.execute(); } } } catch (Exception e) { redo(); } } } @Override public void redo() { Iterator<ICommand> it = list.iterator(); while (it.hasNext()) { ICommand cmd = it.next(); if (cmd != null) cmd.redo(); } } @Override public boolean canUndo() { return !(list.isEmpty()); } @Override public void undo() { Iterator<ICommand> it = list.iterator(); while (it.hasNext()) { ICommand cmd = it.next(); cmd.undo(); } } private NamedObj searchPort(NamedObj head, Map<NamedObj, NamedObj> map) { NamedObj container = head.getContainer(); if (container == null) { return null; } Actor parentActor = (Actor) map.get(container); if (head instanceof IOPort) { IOPort port = (IOPort) head; String portName = port.getName(); if (parentActor instanceof ComponentEntity) { ComponentEntity ce = (ComponentEntity) parentActor; for (Object p : ce.portList()) { Port cPort = (Port) p; if (cPort.getName().equals(portName)) { return cPort; } } } } return null; } }