public GraphLayout doLayout()

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