/******************************************************************************* * Copyright (c) 2010-2015 Henshin developers. All rights reserved. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ /** * CreateSubtreeEdgeCommand.java * created on 14.07.2012 14:08:06 */ package de.tub.tfs.henshin.editor.commands.graph; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.draw2d.ChopboxAnchor; import org.eclipse.draw2d.PolylineConnection; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.henshin.model.Node; import org.eclipse.gef.EditPart; import org.eclipse.gef.commands.CompoundCommand; import de.tub.tfs.henshin.editor.commands.SimpleSetEFeatureCommand; import de.tub.tfs.henshin.editor.editparts.graph.graphical.NodeEditPart; import de.tub.tfs.henshin.editor.editparts.graph.graphical.SubtreeEdgeEditPart; import de.tub.tfs.henshin.editor.editparts.graph.graphical.SubtreeEditPart; import de.tub.tfs.henshin.editor.util.HenshinCache; import de.tub.tfs.henshin.editor.util.HenshinSelectionUtil; import de.tub.tfs.henshin.model.subtree.Edge; import de.tub.tfs.henshin.model.subtree.Subtree; import de.tub.tfs.henshin.model.subtree.SubtreeFactory; import de.tub.tfs.henshin.model.subtree.SubtreePackage; /** * @author huuloi * */ public class CreateSubtreeEdgeCommand extends CompoundCommand { private Node sourceNode; private Node targetNode; private Subtree source; private Subtree target; private Edge edge; public CreateSubtreeEdgeCommand(Subtree source, Node targetNode, EReference type) { edge = SubtreeFactory.eINSTANCE.createEdge(); edge.setType(type); this.source = source; this.targetNode = targetNode; Set<Edge> incomingEdgeMap = HenshinCache.getInstance().getIncomingEdgeMap().get(targetNode); if (incomingEdgeMap == null) { incomingEdgeMap = new HashSet<Edge>(); HenshinCache.getInstance().getIncomingEdgeMap().put(targetNode, incomingEdgeMap); } incomingEdgeMap.add(edge); Set<Edge> incomingSubtreeEdgeMap = HenshinCache.getInstance().getOutgoingSubtreeEdgeMap().get(source); if (incomingSubtreeEdgeMap == null) { incomingSubtreeEdgeMap = new HashSet<Edge>(); HenshinCache.getInstance().getOutgoingSubtreeEdgeMap().put(source, incomingSubtreeEdgeMap); } incomingSubtreeEdgeMap.add(edge); add(new SimpleSetEFeatureCommand<Edge, Subtree>(edge, source, SubtreePackage.EDGE__SOURCE)); add(new SimpleSetEFeatureCommand<Edge, Node>(edge, targetNode, SubtreePackage.EDGE__TARGET_NODE)); SubtreeEdgeEditPart subtreeEdgeEditPart = new SubtreeEdgeEditPart(edge); PolylineConnection figure = (PolylineConnection) subtreeEdgeEditPart.getFigure(); Map<?, ?> editPartRegistry = HenshinSelectionUtil.getInstance().getEditPartRegistry(targetNode.getGraph()); SubtreeEditPart sourceEditPart = (SubtreeEditPart) editPartRegistry.get(source); figure.setSourceAnchor(new ChopboxAnchor(sourceEditPart.getFigure())); subtreeEdgeEditPart.setSource(sourceEditPart); NodeEditPart targetEditPart = (NodeEditPart) editPartRegistry.get(targetNode); figure.setTargetAnchor(new ChopboxAnchor(targetEditPart.getFigure())); subtreeEdgeEditPart.setTarget(targetEditPart); } @SuppressWarnings("unchecked") public CreateSubtreeEdgeCommand(Node sourceNode, Subtree target, EReference type) { edge = SubtreeFactory.eINSTANCE.createEdge(); edge.setType(type); this.sourceNode = sourceNode; this.target = target; Set<Edge> outgoingEdgeMap = HenshinCache.getInstance().getOutgoingEdgeMap().get(sourceNode); if (outgoingEdgeMap == null) { outgoingEdgeMap = new HashSet<Edge>(); HenshinCache.getInstance().getOutgoingEdgeMap().put(sourceNode, outgoingEdgeMap); } outgoingEdgeMap.add(edge); Set<Edge> incomingSubtreeMap = HenshinCache.getInstance().getIncomingSubtreeEdgeMap().get(target); if (incomingSubtreeMap == null) { incomingSubtreeMap = new HashSet<Edge>(); HenshinCache.getInstance().getIncomingSubtreeEdgeMap().put(target, incomingSubtreeMap); } incomingSubtreeMap.add(edge); add(new SimpleSetEFeatureCommand<Edge, Node>(edge, sourceNode, SubtreePackage.EDGE__SOURCE_NODE)); add(new SimpleSetEFeatureCommand<Edge, Subtree>(edge, target, SubtreePackage.EDGE__TARGET)); SubtreeEdgeEditPart subtreeEdgeEditPart = new SubtreeEdgeEditPart(edge); PolylineConnection figure = (PolylineConnection) subtreeEdgeEditPart.getFigure(); Map<?, ?> editPartRegistry = HenshinSelectionUtil.getInstance().getEditPartRegistry(sourceNode.getGraph()); NodeEditPart sourceEditPart = (NodeEditPart) editPartRegistry.get(sourceNode); figure.setSourceAnchor(new ChopboxAnchor(sourceEditPart.getFigure())); List<EditPart> sourceConnections = sourceEditPart.getSourceConnections(); sourceConnections.add(subtreeEdgeEditPart); subtreeEdgeEditPart.setSource(sourceEditPart); SubtreeEditPart targetEditPart = (SubtreeEditPart) editPartRegistry.get(target); figure.setTargetAnchor(new ChopboxAnchor(targetEditPart.getFigure())); subtreeEdgeEditPart.setTarget(targetEditPart); } public CreateSubtreeEdgeCommand(Subtree source, Subtree target, EReference type) { edge = SubtreeFactory.eINSTANCE.createEdge(); edge.setType(type); this.source = source; this.target = target; add(new SimpleSetEFeatureCommand<Edge, Subtree>(edge, source, SubtreePackage.EDGE__SOURCE)); add(new SimpleSetEFeatureCommand<Edge, Subtree>(edge, target, SubtreePackage.EDGE__TARGET)); SubtreeEdgeEditPart subtreeEdgeEditPart = new SubtreeEdgeEditPart(edge); PolylineConnection figure = (PolylineConnection) subtreeEdgeEditPart.getFigure(); Map<?, ?> editPartRegistry = HenshinSelectionUtil.getInstance().getEditPartRegistry(source.getRoot().getGraph()); SubtreeEditPart sourceEditPart = (SubtreeEditPart) editPartRegistry.get(source); figure.setSourceAnchor(new ChopboxAnchor(sourceEditPart.getFigure())); subtreeEdgeEditPart.setSource(sourceEditPart); SubtreeEditPart targetEditPart = (SubtreeEditPart) editPartRegistry.get(target); figure.setTargetAnchor(new ChopboxAnchor(targetEditPart.getFigure())); subtreeEdgeEditPart.setTarget(targetEditPart); } @Override public boolean canExecute() { return (source != null && targetNode != null) || (sourceNode != null && target != null) || (source != null && target != null); } public Node getSourceNode() { return sourceNode; } public void setSourceNode(Node sourceNode) { this.sourceNode = sourceNode; } public Node getTargetNode() { return targetNode; } public void setTargetNode(Node targetNode) { this.targetNode = targetNode; } public Subtree getSource() { return source; } public void setSource(Subtree source) { this.source = source; } public Subtree getTarget() { return target; } public void setTarget(Subtree target) { this.target = target; } public Edge getEdge() { return edge; } public void setEdge(Edge edge) { this.edge = edge; } }