public GraphLayout getFlowLayout()

in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/internal/flowOrthogonalLayout/OrthogonalRectFlowLayouter.java [118:181]


  public GraphLayout getFlowLayout(EmbeddedGraph embeddedGraph, Set<Edge> edgesToBeStraight, Map<Node, List<Node>> nodeMap, Map<Node, Dimension> nodeSizes, EdgesHistoryManager historyManager) {
    EmbeddedGraphModifier modifier = new EmbeddedGraphModifier(embeddedGraph);
    Graph graph = embeddedGraph.getGraph();
    List<Edge> oldEdges = ListSequence.fromList(new ArrayList<Edge>());
    ListSequence.fromList(oldEdges).addSequence(ListSequence.fromList(graph.getEdges()));
    Map<Dart, Integer> bends = MapSequence.fromMap(new HashMap<Dart, Integer>());
    Map<Dart, Integer> angles = MapSequence.fromMap(new HashMap<Dart, Integer>());
    OrthogonalRepresentation.getRepresentation(embeddedGraph, edgesToBeStraight, bends, angles);
    if (OrthogonalRectFlowLayouter.SHOW_lOG > 0) {
      System.out.println("bends:");
      System.out.println(bends);
    }
    OrthogonalRepresentation.replaceBendsByNodes(embeddedGraph, bends, angles);
    Map<Dart, Direction2D> directions = OrthogonalRepresentation.getDirections(embeddedGraph, angles);
    modifier.setDartDirections(directions);
    Map<Edge, Edge> modifiedEdges = modifier.makeRectanglesForNodes(nodeMap);
    for (Edge edge : SetSequence.fromSet(MapSequence.fromMap(modifiedEdges).keySet())) {
      Edge newEdge = MapSequence.fromMap(modifiedEdges).get(edge);
      if (MapSequence.fromMap(modifiedEdges).containsKey(newEdge)) {
        MapSequence.fromMap(modifiedEdges).put(edge, MapSequence.fromMap(modifiedEdges).get(newEdge));
      }
    }
    modifier.makeRectangularFaces();
    modifier.makerInnerFaces();
    Map<Edge, Integer> nodeBorderLengths = MapSequence.fromMap(new HashMap<Edge, Integer>());
    for (Node node : SetSequence.fromSet(MapSequence.fromMap(nodeMap).keySet())) {
      for (Dart dart : ListSequence.fromList(modifier.getNodeFace(node).getDarts())) {
        Edge edge = dart.getEdge();
        if (MapSequence.fromMap(directions).get(dart).isHorizontal()) {
          MapSequence.fromMap(nodeBorderLengths).put(edge, MapSequence.fromMap(nodeSizes).get(node).width);
        } else {
          MapSequence.fromMap(nodeBorderLengths).put(edge, MapSequence.fromMap(nodeSizes).get(node).height);
        }
      }
    }
    Map<Edge, Integer> lengths = new EdgeLengthComputer().compute(embeddedGraph, directions, nodeBorderLengths);
    Map<Node, Point> coordinates = new CoordinatePlacer(embeddedGraph, lengths, directions).getCoordinates();
    GraphLayout nodesLayout = GraphLayoutFactory.createGraphLayout(graph);
    for (Node node : SetSequence.fromSet(MapSequence.fromMap(nodeMap).keySet())) {
      Node[] corners = modifier.getCornerNodes(node);
      Rectangle rect = GeomUtil.getRectangle(MapSequence.fromMap(coordinates).get(corners[0]), MapSequence.fromMap(coordinates).get(corners[2]));
      nodesLayout.setLayoutFor(node, rect);
    }
    for (Edge edge : ListSequence.fromList(oldEdges)) {
      List<Edge> history = ListSequence.fromList(new LinkedList<Edge>());
      for (Edge historyEdge : ListSequence.fromList(historyManager.getHistory(edge))) {
        if (MapSequence.fromMap(modifiedEdges).containsKey(historyEdge)) {
          ListSequence.fromList(history).addElement(MapSequence.fromMap(modifiedEdges).get(historyEdge));
        } else {
          ListSequence.fromList(history).addElement(historyEdge);
        }
      }
      List<Point> edgeLayout = ListSequence.fromList(new ArrayList<Point>());
      Node cur = ListSequence.fromList(history).first().getSource();
      ListSequence.fromList(edgeLayout).addElement(MapSequence.fromMap(coordinates).get(cur));
      for (Edge historyEdge : ListSequence.fromList(history)) {
        Node next = historyEdge.getOpposite(cur);
        ListSequence.fromList(edgeLayout).addElement(MapSequence.fromMap(coordinates).get(next));
        cur = next;
      }
      nodesLayout.setLayoutFor(edge, edgeLayout);
    }
    return nodesLayout;
  }