in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/flowOrthogonalLayout/EmbeddedGraphModifier.java [190:275]
public void makeRectangleForSingleNode(Node node, Map<Edge, Edge> modifiedEdges) {
List<Direction2D> allDirections = Arrays.asList(Direction2D.values());
List<Dart> darts = myEmbeddedGraph.getDartWithSource(node);
Face nodeInnerFace = new Face(myGraph);
Node firstCornerNode = myGraph.createDummyNode();
Node curCornerNode = firstCornerNode;
Map<Dart, Edge> edgesFromNode = MapSequence.fromMap(new HashMap<Dart, Edge>());
List<Dart> nodeOuterDarts = ListSequence.fromList(new LinkedList<Dart>());
for (final Direction2D dir : ListSequence.fromList(allDirections)) {
MapSequence.fromMap(myCornerNodes).get(node)[dir.turnClockwise(1).ordinal()] = curCornerNode;
Node nextCornerNode;
if (dir == ListSequence.fromList(allDirections).last()) {
nextCornerNode = firstCornerNode;
} else {
nextCornerNode = myGraph.createDummyNode();
}
Dart dirDart = ListSequence.fromList(darts).findFirst(new IWhereFilter<Dart>() {
public boolean accept(Dart dart) {
return MapSequence.fromMap(myDartDirections).get(dart) == dir;
}
});
if (dirDart == null) {
addToNodeFace(nodeInnerFace, myGraph.connect(curCornerNode, nextCornerNode), dir, nodeOuterDarts);
} else {
Node newNode = myGraph.createDummyNode();
MapSequence.fromMap(edgesFromNode).put(dirDart, myGraph.connect(newNode, dirDart.getTarget()));
addToNodeFace(nodeInnerFace, myGraph.connect(curCornerNode, newNode), dir, nodeOuterDarts);
addToNodeFace(nodeInnerFace, myGraph.connect(newNode, nextCornerNode), dir, nodeOuterDarts);
}
curCornerNode = nextCornerNode;
}
Map<Dart, Edge> endEdges = MapSequence.fromMap(new HashMap<Dart, Edge>());
for (Dart dart : ListSequence.fromList(darts)) {
MapSequence.fromMap(modifiedEdges).put(dart.getEdge(), MapSequence.fromMap(edgesFromNode).get(dart));
List<Dart> faceDarts = myEmbeddedGraph.getFace(dart).getDarts();
int prevIndex = ListSequence.fromList(faceDarts).indexOf(dart) - 1;
if (prevIndex == -1) {
prevIndex = ListSequence.fromList(faceDarts).count() - 1;
}
MapSequence.fromMap(endEdges).put(dart, MapSequence.fromMap(edgesFromNode).get(myEmbeddedGraph.getOpposite(ListSequence.fromList(faceDarts).getElement(prevIndex))));
}
for (Dart dart : ListSequence.fromList(darts)) {
Face face = myEmbeddedGraph.getFace(dart);
List<Dart> faceDarts = face.getDarts();
int dartIndex = ListSequence.fromList(faceDarts).indexOf(dart);
int prevIndex = dartIndex - 1;
if (prevIndex == -1) {
prevIndex = ListSequence.fromList(faceDarts).count() - 1;
}
Dart prevDart = ListSequence.fromList(faceDarts).getElement(prevIndex);
Edge startEdge = MapSequence.fromMap(edgesFromNode).get(dart);
Edge endEdge = MapSequence.fromMap(endEdges).get(dart);
Node start = startEdge.getSource();
Node end = endEdge.getSource();
List<Dart> newDarts = ListSequence.fromList(new LinkedList<Dart>());
Iterator<Dart> dartItr = ListSequence.fromList(nodeOuterDarts).iterator();
Dart cur;
do {
cur = dartItr.next();
} while (cur.getTarget() != start);
do {
ListSequence.fromList(newDarts).insertElement(0, cur);
if (!(dartItr.hasNext())) {
dartItr = ListSequence.fromList(nodeOuterDarts).iterator();
}
cur = dartItr.next();
} while (cur.getTarget() != end);
Dart newStartDart = new Dart(startEdge, start);
ListSequence.fromList(newDarts).addElement(newStartDart);
MapSequence.fromMap(myDartDirections).put(newStartDart, MapSequence.fromMap(myDartDirections).get(dart));
Dart newEndDart = new Dart(endEdge, endEdge.getTarget());
ListSequence.fromList(newDarts).insertElement(0, newEndDart);
MapSequence.fromMap(myDartDirections).put(newEndDart, MapSequence.fromMap(myDartDirections).get(prevDart));
myEmbeddedGraph.removeDart(face, dart);
face.makeEndsWith(prevDart);
myEmbeddedGraph.removeDart(face, prevDart);
for (Dart newDart : ListSequence.fromList(newDarts)) {
myEmbeddedGraph.addLastDart(face, newDart);
}
MapSequence.fromMap(myDartDirections).removeKey(dart);
MapSequence.fromMap(myDartDirections).removeKey(prevDart);
}
MapSequence.fromMap(myNodeFaces).put(node, nodeInnerFace);
myEmbeddedGraph.addFace(nodeInnerFace);
myGraph.deleteNode(node);
}