in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/flowOrthogonalLayout/EmbeddedGraphModifier.java [287:366]
public Set<Edge> reduceNodesDegree(Map<Node, List<Node>> nodeMap, Map<Edge, Edge> edgeMap, boolean splitAllNodes) {
Set<Edge> addedEdges = SetSequence.fromSet(new HashSet<Edge>());
List<Node> realNodes = ListSequence.fromList(new ArrayList<Node>());
ListSequence.fromList(realNodes).addSequence(ListSequence.fromList(myGraph.getNodes()));
for (final Node node : ListSequence.fromList(realNodes)) {
List<Edge> edges = node.getEdges();
if (!(splitAllNodes) && ListSequence.fromList(edges).count() <= 4) {
continue;
}
List<Node> newNodes = ListSequence.fromList(new ArrayList<Node>());
MapSequence.fromMap(nodeMap).put(node, newNodes);
Edge firstEdge = ListSequence.fromList(edges).first();
Dart firstDart = ListSequence.fromList(myEmbeddedGraph.getDarts(firstEdge)).findFirst(new IWhereFilter<Dart>() {
public boolean accept(Dart dart) {
return dart.getSource() == node;
}
});
Dart curDart = firstDart;
Node firstNewNode = myGraph.createDummyNode();
Node curNewNode = firstNewNode;
Edge firstNewEdge = myGraph.connect(firstNewNode, firstEdge.getOpposite(node));
if (firstEdge.getSource() == node) {
myGraph.removeEdge(firstEdge);
}
ListSequence.fromList(newNodes).addElement(firstNewNode);
MapSequence.fromMap(edgeMap).put(firstEdge, firstNewEdge);
Edge curNewEdge = firstNewEdge;
Face newFace = new Face(myGraph);
do {
Face curFace = myEmbeddedGraph.getFace(curDart);
List<Dart> darts = curFace.getDarts();
int curPos = ListSequence.fromList(darts).indexOf(curDart);
int nextPos = curPos - 1;
if (nextPos == -1) {
nextPos = ListSequence.fromList(darts).count() - 1;
}
Dart nextDart = myEmbeddedGraph.getOpposite(ListSequence.fromList(darts).getElement(nextPos));
if (nextDart == null) {
nextDart = firstDart;
}
Node oppositeNode = nextDart.getEdge().getOpposite(node);
Node nextNewNode;
if (nextDart == firstDart) {
nextNewNode = firstNewNode;
} else {
nextNewNode = myGraph.createDummyNode();
ListSequence.fromList(newNodes).addElement(nextNewNode);
}
Edge nextNewEdge;
if (nextDart == firstDart) {
nextNewEdge = firstNewEdge;
} else {
nextNewEdge = myGraph.connect(nextNewNode, oppositeNode);
if (firstEdge.getSource() == node) {
myGraph.removeEdge(firstEdge);
}
MapSequence.fromMap(edgeMap).put(nextDart.getEdge(), nextNewEdge);
}
Edge edgeBetweenNewNodes = myGraph.connect(curNewNode, nextNewNode);
SetSequence.fromSet(addedEdges).addElement(edgeBetweenNewNodes);
newFace.addLast(new Dart(edgeBetweenNewNodes, curNewNode));
myEmbeddedGraph.setDart(curFace, nextPos, new Dart(nextNewEdge, oppositeNode));
myEmbeddedGraph.setDart(curFace, curPos, new Dart(curNewEdge, curNewNode));
myEmbeddedGraph.insertDart(curFace, nextPos + 1, new Dart(edgeBetweenNewNodes, nextNewNode));
curDart = nextDart;
curNewNode = nextNewNode;
curNewEdge = nextNewEdge;
} while (curDart != firstDart);
myEmbeddedGraph.addFace(newFace);
myGraph.deleteNode(node);
}
// edge has been modified two times
for (Edge edge : SetSequence.fromSet(MapSequence.fromMap(edgeMap).keySet())) {
Edge newEdge = MapSequence.fromMap(edgeMap).get(edge);
if (MapSequence.fromMap(edgeMap).containsKey(newEdge)) {
MapSequence.fromMap(edgeMap).put(edge, MapSequence.fromMap(edgeMap).get(newEdge));
}
}
return addedEdges;
}