/*******************************************************************************
* 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.
*******************************************************************************/
package de.tub.tfs.henshin.tggeditor.util;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.henshin.model.Edge;
import org.eclipse.emf.henshin.model.Node;
import de.tub.tfs.henshin.tgg.EdgeLayout;
import de.tub.tfs.henshin.tgg.TEdge;
import de.tub.tfs.henshin.tgg.TGG;
import de.tub.tfs.henshin.tgg.interpreter.util.RuleUtil;
import de.tub.tfs.muvitor.commands.SimpleDeleteEObjectCommand;
public class EdgeUtil {
/**
* Gets the edgelayout to the given edge
* @param edge
* @return edgelayout
*/
public static EdgeLayout getEdgeLayout(Edge edge) {
TGG layoutSys = GraphicalNodeUtil.getLayoutSystem(edge.getSource().getGraph());
if(layoutSys == null)
{
return null;
}
return getEdgeLayout(edge, layoutSys);
}
/**
* Gets the edgelayout in the given layoutsystem to the given edge
* @param edge
* @param layoutModel
* @return edgelayout
*/
public static EdgeLayout getEdgeLayout(Edge edge, TGG layoutModel) {
EdgeLayout result = null;
if (layoutModel != null) {
result = findEdgeLayout(edge, layoutModel);
}
return result;
}
private static EdgeLayout findEdgeLayout(Edge ruleEdgeRHS) {
TGG layoutSys = GraphicalNodeUtil.getLayoutSystem(ruleEdgeRHS.getSource().getGraph());
return findEdgeLayout(ruleEdgeRHS,layoutSys);
}
/**
* finds the edge layout in layout system
* @param edge
* @param layoutSystem
* @return the edge layout
*/
protected static EdgeLayout findEdgeLayout(Edge edge, TGG layoutSystem) {
EdgeLayout result = null;
for (EdgeLayout edgeLayout : layoutSystem.getEdgelayouts()) {
if (edgeLayout.getRhsedge() == edge || edgeLayout.getLhsedge() == edge) {
result = edgeLayout;
break;
}
}
// if (result == null) {
// result = TggFactory.eINSTANCE.createEdgeLayout();
// layoutSystem.getEdgelayouts().add(result);
// }
return result;
}
public static void refreshIsMarked(Edge ruleEdgeRHS) {
computeAndCreateIsMarked(ruleEdgeRHS);
}
// public static Boolean getIsMarked(Edge ruleEdgeRHS) {
// if (ruleEdgeRHS.getIsMarked() != null)
// return ruleEdgeRHS.getIsMarked();
// else { // marker is not available, thus copy from layout model and
// // delete entry in layout model
// return computeAndCreateIsMarked(ruleEdgeRHS);
// }
// }
private static void computeAndCreateIsMarked(Edge ruleEdgeRHS) {
if (1==1)
return;
// marker value is not available in ruleAttributeRHS, thus compute it
if (RuleUtil.Translated.equals(((TEdge)ruleEdgeRHS).getMarkerType())){
return;
}
EdgeLayout edgeLayout = getEdgeLayout(ruleEdgeRHS);
if (edgeLayout == null) { // no layout is found
// determine type of marker
// Rule rule = ruleEdgeRHS.getGraph().getContainerRule();
// if (ModelUtil.getRuleLayout(rule)!=null)
// ruleEdgeRHS.setMarkerType(RuleUtil.Translated);
// else
((TEdge) ruleEdgeRHS).setMarkerType(RuleUtil.NEW);
// check for existing edge in LHS
Edge lhsEdge = RuleUtil
.getLHSEdge(ruleEdgeRHS);
if (lhsEdge != null) {
// edge is preserved -> no marker
((TEdge) ruleEdgeRHS).setMarkerType(null);
} else {
// edge is created -> add marker
((TEdge) ruleEdgeRHS).setMarkerType(RuleUtil.NEW);
}
} else { // edge layout is found
Boolean isTranslatedLHS = edgeLayout.getLhsTranslated();
boolean isNew = edgeLayout.isNew();
if (isTranslatedLHS == null) {
if (isNew)
((TEdge) ruleEdgeRHS).setMarkerType(RuleUtil.NEW);
else
((TEdge) ruleEdgeRHS).setMarkerType(null);
} else {
if (isTranslatedLHS){
((TEdge) ruleEdgeRHS).setMarkerType(null);
} else {
((TEdge) ruleEdgeRHS).setMarkerType(RuleUtil.Translated);
}
}
}
// delete layout entry in layout model
while (edgeLayout != null) {
SimpleDeleteEObjectCommand cmd = new SimpleDeleteEObjectCommand(
edgeLayout);
cmd.execute();
// find possible duplicates of layout
edgeLayout = findEdgeLayout(ruleEdgeRHS);
}
return;
}
/**
* Find the edge between a source node and a target node with a specific type. Is just working
* when there is not more than one one type of edge between the two nodes allowed.
* @param source source node
* @param target target node
* @param type type of the edge
* @return edge between the source and the target node with a specific type
*/
public static Edge findEdge(Node source, Node target, EReference type) {
for (Edge e : source.getOutgoing()) {
if (e.getType() == type &&
e.getTarget() == target) {
return e;
}
}
return null;
}
}