public GraphLayout doLayout()

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;
    }
  }