String vname = fromName + "_" + to.name + "[" + (from.layer + delta) + "]";
if(debug)System.err.println("Creating virtual node " + vname + " between " + fromName + " and " + to.name);
LayeredGraphNode virtual = new LayeredGraphNode(this, vname, hgap/2, vgap);
IValueFactory vf = ValueFactoryFactory.getValueFactory();
IString vfVname = vf.string(vname);
nodes.add(virtual);
registerNodeId(vname, virtual);
LinkedList<LayeredGraphNode> vlayer = layers.get(from.layer+delta);
virtual.layer = from.layer + delta;
virtual.pos = vlayer.size();
virtual.in.add(from);
virtual.out.add(to);
from.out.set(from.out.indexOf(to), virtual);
to.in.set(to.in.indexOf(from), virtual);
vlayer.add(virtual);
LayeredGraphEdge old = null;
for(LayeredGraphEdge e : edges){
if(debug)System.err.println("Consider edge " + e.getFrom().name + " -> " + e.getTo().name);
if(e.getFrom() == from && e.getTo() == to){
old = e;
if(from == orgFrom){
orgEdgeLabel = e.getLabel();
}
if(debug)System.err.println("Removing old edge " + from.name + " -> " + to.name);
break;
}
}
//if(old == null)
// throw RuntimeExceptionFactory.figureException("Internal error in insertVirtualNode", vfVname, fpa.getRascalContext().getCurrentAST(), fpa.getRascalContext().getStackTrace());
IString vfGname = vf.string(from.name);
IString vfOname = vf.string(to.name);
if(old != null){
if(old.isReversed()){
LayeredGraphEdge e1 = new LayeredGraphEdge(this, fpa, old.prop, vfGname, vfVname, old.fromArrow, old.toArrow);
LayeredGraphEdge e2 = new LayeredGraphEdge(this, fpa, old.prop, vfVname, vfOname, old.fromArrow, old.toArrow);
e2.label = orgEdgeLabel;