in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/stOrthogonalLayout/RectOrthogonalLayouter.java [51:110]
public GraphLayout doLayout(Graph graph, Map<Node, Dimension> nodeSizes, Map<Edge, Dimension> edgeSizes) {
Map<Node, Integer> components = ConnectivityComponents.getComponents(graph);
int maxComponent = 0;
for (Node node : ListSequence.fromList(graph.getNodes())) {
maxComponent = Math.max(maxComponent, MapSequence.fromMap(components).get(node));
}
Map<Node, Node> newNodes = new NodeMap<Node>(graph);
Map<Node, Graph> nodeSubgraphs = new NodeMap<Graph>(graph);
Map<Edge, Edge> newEdges = MapSequence.fromMap(new HashMap<Edge, Edge>());
List<Graph> subgraphs = ListSequence.fromList(new ArrayList<Graph>());
Map<Graph, Map<Node, Dimension>> subNodeSizes = MapSequence.fromMap(new HashMap<Graph, Map<Node, Dimension>>());
Map<Graph, Map<Edge, Dimension>> subEdgeSizes = MapSequence.fromMap(new HashMap<Graph, Map<Edge, Dimension>>());
for (int i = 0; i <= maxComponent; i++) {
Graph subgraph = ListSequence.fromList(subgraphs).addElement(new Graph());
MapSequence.fromMap(subNodeSizes).put(subgraph, MapSequence.fromMap(new HashMap<Node, Dimension>()));
MapSequence.fromMap(subEdgeSizes).put(subgraph, MapSequence.fromMap(new HashMap<Edge, Dimension>()));
}
for (Node node : ListSequence.fromList(graph.getNodes())) {
Graph subgraph = ListSequence.fromList(subgraphs).getElement(MapSequence.fromMap(components).get(node));
Node newNode = subgraph.createNode();
MapSequence.fromMap(newNodes).put(node, newNode);
MapSequence.fromMap(nodeSubgraphs).put(node, subgraph);
MapSequence.fromMap(MapSequence.fromMap(subNodeSizes).get(subgraph)).put(newNode, new Dimension(MapSequence.fromMap(nodeSizes).get(node).width + myEdgeDistance, MapSequence.fromMap(nodeSizes).get(node).height));
}
for (Edge edge : ListSequence.fromList(graph.getEdges())) {
Graph subgraph = MapSequence.fromMap(nodeSubgraphs).get(edge.getSource());
Edge newEdge = subgraph.connect(MapSequence.fromMap(newNodes).get(edge.getSource()), MapSequence.fromMap(newNodes).get(edge.getTarget()));
MapSequence.fromMap(newEdges).put(edge, newEdge);
if (MapSequence.fromMap(edgeSizes).get(edge) == null) {
MapSequence.fromMap(MapSequence.fromMap(subEdgeSizes).get(subgraph)).put(newEdge, new Dimension(myEdgeDistance, myEdgeDistance));
} else {
MapSequence.fromMap(MapSequence.fromMap(subEdgeSizes).get(subgraph)).put(newEdge, new Dimension(MapSequence.fromMap(edgeSizes).get(edge).width + myEdgeDistance, MapSequence.fromMap(edgeSizes).get(edge).height + myEdgeDistance));
}
}
Map<Graph, GraphLayout> subgraphLayouts = MapSequence.fromMap(new HashMap<Graph, GraphLayout>());
int shiftX = 0;
for (Graph subgraph : ListSequence.fromList(subgraphs)) {
GraphLayout curLayout = findSTLayout(subgraph, MapSequence.fromMap(subNodeSizes).get(subgraph), MapSequence.fromMap(subEdgeSizes).get(subgraph));
curLayout = curLayout.shift(shiftX, 0);
MapSequence.fromMap(subgraphLayouts).put(subgraph, curLayout);
shiftX = curLayout.getContainingRectangle().x + curLayout.getContainingRectangle().width + 30;
}
GraphLayout layout = GraphLayoutFactory.createGraphLayout(graph);
for (Node node : ListSequence.fromList(graph.getNodes())) {
Graph subgraph = MapSequence.fromMap(nodeSubgraphs).get(node);
layout.setLayoutFor(node, MapSequence.fromMap(subgraphLayouts).get(subgraph).getNodeLayout(MapSequence.fromMap(newNodes).get(node)));
}
for (Edge edge : ListSequence.fromList(graph.getEdges())) {
GraphLayout subgraphLayout = MapSequence.fromMap(subgraphLayouts).get(MapSequence.fromMap(nodeSubgraphs).get(edge.getSource()));
layout.setLayoutFor(edge, subgraphLayout.getEdgeLayout(MapSequence.fromMap(newEdges).get(edge)));
if (MapSequence.fromMap(edgeSizes).containsKey(edge)) {
layout.setLabelLayout(edge, subgraphLayout.getLabelLayout(MapSequence.fromMap(myMovedLabels).get(MapSequence.fromMap(newEdges).get(edge))));
}
}
if (myLayoutLevel == 0) {
return MapSequence.fromMap(subgraphLayouts).get(ListSequence.fromList(subgraphs).getElement(0));
} else {
return layout;
}
}