in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/stOrthogonalLayout/RectOrthogonalLayouter.java [111:175]
public GraphLayout findSTLayout(Graph graph, Map<Node, Dimension> nodeSizes, Map<Edge, Dimension> edgeSizes) {
if (graph.getNumNodes() == 1) {
GraphLayout layout = GraphLayoutFactory.createGraphLayout(graph);
Node node = graph.getNode(0);
layout.setLayoutFor(node, new Rectangle(20, 20, MapSequence.fromMap(nodeSizes).get(node).width - myEdgeDistance, MapSequence.fromMap(nodeSizes).get(node).height));
return layout;
}
List<Edge> oldEdges = ListSequence.fromList(new ArrayList<Edge>());
ListSequence.fromList(oldEdges).addSequence(ListSequence.fromList(graph.getEdges()));
BiconnectAugmentation.makeBiconnected(graph);
Node addedNode = ListSequence.fromList(graph.getNodes()).last();
/*
EmbeddedGraph embeddedGraph = new ShortestPathEmbeddingFinder(new BiconnectedInitialEmbeddingFinder()).find(graph);
*/
EdgesHistoryManager historyManager = new EdgesHistoryManager(graph);
EmbeddedGraph embeddedGraph = new ShortestPathEmbeddingFinder(new PQPlanarizationFinder()).find(graph);
for (Node node : ListSequence.fromList(graph.getNodes())) {
if (!(MapSequence.fromMap(nodeSizes).containsKey(node))) {
MapSequence.fromMap(nodeSizes).put(node, new Dimension(myNodeSize, myNodeSize));
}
}
Map<Edge, Dimension> newEdgeSizes = MapSequence.fromMap(new HashMap<Edge, Dimension>());
Set<Edge> hasLabel = SetSequence.fromSet(new HashSet<Edge>());
for (Edge oldEdge : ListSequence.fromList(oldEdges)) {
List<Edge> history = historyManager.getHistory(oldEdge);
Node cur = oldEdge.getSource();
if (!(ListSequence.fromList(ListSequence.fromList(history).first().getAdjacentNodes()).contains(cur))) {
history = ListSequence.fromList(history).reversedList();
}
Edge midEdge = ListSequence.fromList(history).getElement(ListSequence.fromList(history).count() / 2);
for (Edge edge : ListSequence.fromList(history)) {
if (edge == midEdge && MapSequence.fromMap(edgeSizes).get(oldEdge) != null) {
MapSequence.fromMap(newEdgeSizes).put(edge, MapSequence.fromMap(edgeSizes).get(oldEdge));
MapSequence.fromMap(myMovedLabels).put(oldEdge, edge);
SetSequence.fromSet(hasLabel).addElement(edge);
} else {
MapSequence.fromMap(newEdgeSizes).put(edge, new Dimension(myEdgeDistance, myEdgeDistance));
}
}
}
for (Edge edge : ListSequence.fromList(graph.getEdges())) {
if (MapSequence.fromMap(newEdgeSizes).get(edge) == null) {
MapSequence.fromMap(newEdgeSizes).put(edge, new Dimension(myEdgeDistance, myEdgeDistance));
}
}
List<Node> outerNodes = ListSequence.fromList(new ArrayList<Node>());
for (Dart dart : ListSequence.fromList(embeddedGraph.getOuterFace().getDarts())) {
ListSequence.fromList(outerNodes).addElement(dart.getTarget());
}
Node s = ListSequence.fromList(outerNodes).getElement(0);
Node t = ListSequence.fromList(outerNodes).getElement((ListSequence.fromList(outerNodes).count()) / 2);
GraphOrientation.orientST(graph, s, t);
STPlanarGraph stPlanarGraph = new STPlanarGraph(embeddedGraph, s, t);
ConstraintsSupporter supporter = new ConstraintsSupporter();
supporter.setMinEdgeDistance(myEdgeDistance, 15);
Map<Object, Rectangle> representation = supporter.getRepresentation(stPlanarGraph, nodeSizes, newEdgeSizes);
GraphLayout graphLayout = this.createLayout(graph, representation, nodeSizes, newEdgeSizes, hasLabel);
if (myLayoutLevel > 0) {
this.removeTempObjects(oldEdges, graphLayout, graph, addedNode, historyManager);
}
if (myLayoutLevel > 1) {
LayoutOptimizer.optimizeEdges(graphLayout);
}
return graphLayout;
}