in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/internal/flowOrthogonalLayout/OrthogonalRectFlowLayouter.java [39:117]
public GraphLayout doLayout(Graph graph, Map<Node, Dimension> nodeSizes) {
Graph copy = new Graph();
Map<Node, Node> nodeMap = MapSequence.fromMap(new HashMap<Node, Node>());
Map<Edge, Edge> edgeMap = MapSequence.fromMap(new HashMap<Edge, Edge>());
for (Node node : ListSequence.fromList(graph.getNodes())) {
MapSequence.fromMap(nodeMap).put(node, copy.createNode());
}
for (Edge edge : ListSequence.fromList(graph.getEdges())) {
MapSequence.fromMap(edgeMap).put(edge, copy.connect(MapSequence.fromMap(nodeMap).get(edge.getSource()), MapSequence.fromMap(nodeMap).get(edge.getTarget())));
}
EdgesHistoryManager historyManager = new EdgesHistoryManager(copy);
BiconnectAugmentation.smartMakeBiconnected(copy);
EmbeddedGraph embeddedGraph = new ShortestPathEmbeddingFinder(new PQPlanarizationFinder()).find(copy);
Map<Edge, List<Edge>> history = MapSequence.fromMap(new HashMap<Edge, List<Edge>>());
for (Edge edge : ListSequence.fromList(graph.getEdges())) {
Edge copyEdge = MapSequence.fromMap(edgeMap).get(edge);
MapSequence.fromMap(history).put(edge, historyManager.getHistory(copyEdge));
// if copyEdge has been reverted during st-numbering in planarization step
if (copyEdge.getSource() != MapSequence.fromMap(nodeMap).get(edge.getSource())) {
MapSequence.fromMap(history).put(edge, ListSequence.fromList(MapSequence.fromMap(history).get(edge)).reversedList());
}
}
Map<Node, List<Node>> newNodes = MapSequence.fromMap(new HashMap<Node, List<Node>>());
Map<Edge, Edge> replacedEdges = MapSequence.fromMap(new HashMap<Edge, Edge>());
Set<Edge> newEdges = new EmbeddedGraphModifier(embeddedGraph).reduceNodesDegree(newNodes, replacedEdges);
for (List<Edge> list : Sequence.fromIterable(MapSequence.fromMap(history).values())) {
Edge first = ListSequence.fromList(list).first();
if (MapSequence.fromMap(replacedEdges).containsKey(first)) {
ListSequence.fromList(list).setElement(0, MapSequence.fromMap(replacedEdges).get(first));
}
if (ListSequence.fromList(list).count() > 1) {
Edge last = ListSequence.fromList(list).last();
if (MapSequence.fromMap(replacedEdges).containsKey(last)) {
ListSequence.fromList(list).setElement(ListSequence.fromList(list).count() - 1, MapSequence.fromMap(replacedEdges).get(last));
}
}
}
Map<Node, List<Node>> nodesToSplit = MapSequence.fromMap(new LinkedHashMap<Node, List<Node>>(16, (float) 0.75, false));
Map<Node, Dimension> copyNodeSizes = MapSequence.fromMap(new HashMap<Node, Dimension>());
for (Node node : ListSequence.fromList(graph.getNodes())) {
Node copyNode = MapSequence.fromMap(nodeMap).get(node);
if (!(MapSequence.fromMap(newNodes).containsKey(copyNode))) {
MapSequence.fromMap(nodesToSplit).put(copyNode, ListSequence.fromList(new ArrayList<Node>()));
} else {
MapSequence.fromMap(nodesToSplit).put(copyNode, MapSequence.fromMap(newNodes).get(copyNode));
}
MapSequence.fromMap(copyNodeSizes).put(copyNode, MapSequence.fromMap(nodeSizes).get(node));
}
GraphLayout copyLayout = getFlowLayout(embeddedGraph, newEdges, nodesToSplit, copyNodeSizes, historyManager);
GraphLayout graphLayout = GraphLayoutFactory.createGraphLayout(graph);
for (Node node : ListSequence.fromList(graph.getNodes())) {
Node copyNode = MapSequence.fromMap(nodeMap).get(node);
graphLayout.setLayoutFor(node, new Rectangle(copyLayout.getNodeLayout(copyNode)));
}
for (Edge graphEdge : ListSequence.fromList(graph.getEdges())) {
List<Point> edgeLayout = ListSequence.fromList(new ArrayList<Point>());
List<Edge> edgeHistory = MapSequence.fromMap(history).get(graphEdge);
Node copySource = MapSequence.fromMap(nodeMap).get(graphEdge.getSource());
Node cur;
Node firstSource = ListSequence.fromList(edgeHistory).first().getSource();
if (copySource == firstSource || ListSequence.fromList(MapSequence.fromMap(newNodes).get(copySource)).contains(firstSource)) {
cur = firstSource;
} else {
cur = ListSequence.fromList(edgeHistory).first().getTarget();
}
for (Edge edge : ListSequence.fromList(edgeHistory)) {
if (cur == edge.getSource()) {
ListSequence.fromList(edgeLayout).addSequence(ListSequence.fromList(copyLayout.getEdgeLayout(edge)));
} else {
ListSequence.fromList(edgeLayout).addSequence(ListSequence.fromList(copyLayout.getEdgeLayout(edge)).reversedList());
}
cur = edge.getOpposite(cur);
}
graphLayout.setLayoutFor(graphEdge, edgeLayout);
}
Rectangle containingRect = graphLayout.getContainingRectangle();
graphLayout = graphLayout.shift(20 - containingRect.x, 20 - containingRect.y);
return graphLayout;
}