public GraphLayout getlayoutFromEmbeddedGraph()

in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/internal/flowOrthogonalLayout/OrthogonalFlowLabelProcessing.java [126:229]


  public GraphLayout getlayoutFromEmbeddedGraph(EmbeddedGraph embeddedGraph, Map<Node, Dimension> nodeSizes, Map<Edge, Dimension> labelSizes, EdgesHistoryManager historyManager) {
    if (OrthogonalFlowLabelProcessing.SHOW_INFO > 0) {
      System.out.println("initial graph: " + embeddedGraph);
    }
    Graph graph = embeddedGraph.getGraph();
    List<Edge> oldEdges = ListSequence.fromList(new ArrayList<Edge>());
    ListSequence.fromList(oldEdges).addSequence(ListSequence.fromList(graph.getEdges()));
    List<Node> oldNodes = ListSequence.fromList(new ArrayList<Node>());
    ListSequence.fromList(oldNodes).addSequence(SetSequence.fromSet(MapSequence.fromMap(nodeSizes).keySet()));
    Map<Dart, Integer> bends = MapSequence.fromMap(new HashMap<Dart, Integer>());
    Map<Dart, Integer> angles = MapSequence.fromMap(new HashMap<Dart, Integer>());
    QuasiOrthogonalRepresentation.getRepresentation(embeddedGraph, bends, angles);
    QuasiRepresentationModifier quasiModifier = new QuasiRepresentationModifier(embeddedGraph, bends, angles);
    quasiModifier.reduceToOrthogonalRepresentation();
    if (OrthogonalFlowLabelProcessing.SHOW_INFO > 0) {
      System.out.println("modifications: ");
      for (QuasiRepresentationModifier.Modification modification : ListSequence.fromList(quasiModifier.getModifications())) {
        System.out.println(modification);
      }
    }
    OrthogonalRepresentation.replaceBendsByNodes(embeddedGraph, bends, angles);
    if (OrthogonalFlowLabelProcessing.SHOW_INFO > 0) {
      System.out.println("modified graph: " + embeddedGraph);
    }
    Map<Dart, Direction2D> directions = OrthogonalRepresentation.getDirections(embeddedGraph, angles);

    Map<Edge, Node> labelNodes = MapSequence.fromMap(new HashMap<Edge, Node>());
    Map<Node, Dimension> labelNodeSizes = MapSequence.fromMap(new HashMap<Node, Dimension>());
    for (Edge edge : SetSequence.fromSet(MapSequence.fromMap(labelSizes).keySet())) {
      Edge labeledEdge = getLabeledEdge(historyManager.getHistory(edge));
      Node node = splitEdge(labeledEdge, embeddedGraph, directions);
      MapSequence.fromMap(labelNodes).put(edge, node);
      MapSequence.fromMap(labelNodeSizes).put(node, MapSequence.fromMap(labelSizes).get(edge));
    }
    Map<Node, Map<Direction2D, Integer>> nodeAndLabelDirectionSizes = getNodeDirectionSizes(nodeSizes);
    Map<Node, Map<Direction2D, Integer>> labelDirectionSizes = getNodeDirectionSizes(labelNodeSizes);
    for (Node node : SetSequence.fromSet(MapSequence.fromMap(labelDirectionSizes).keySet())) {
      MapSequence.fromMap(nodeAndLabelDirectionSizes).put(node, MapSequence.fromMap(labelDirectionSizes).get(node));
    }
    Map<Node, Dimension> nodeAndLabelSizes = MapSequence.fromMap(new HashMap<Node, Dimension>());
    for (Node node : SetSequence.fromSet(MapSequence.fromMap(nodeSizes).keySet())) {
      MapSequence.fromMap(nodeAndLabelSizes).put(node, MapSequence.fromMap(nodeSizes).get(node));
    }
    for (Node node : SetSequence.fromSet(MapSequence.fromMap(labelNodeSizes).keySet())) {
      MapSequence.fromMap(nodeAndLabelSizes).put(node, MapSequence.fromMap(labelNodeSizes).get(node));
    }
    Map<Edge, Integer> initialEdgesShifts = getEdgesShifts(quasiModifier.getModifications(), directions, nodeAndLabelDirectionSizes);
    Map<Edge, Integer> edgeShifts = MapSequence.fromMap(new HashMap<Edge, Integer>());
    for (Edge initialEdge : SetSequence.fromSet(MapSequence.fromMap(initialEdgesShifts).keySet())) {
      Edge edge = ListSequence.fromList(historyManager.getHistory(initialEdge)).first();
      MapSequence.fromMap(edgeShifts).put(edge, MapSequence.fromMap(initialEdgesShifts).get(initialEdge));
    }
    List<Node> nodesAndLabels = ListSequence.fromList(new LinkedList<Node>());
    ListSequence.fromList(nodesAndLabels).addSequence(SetSequence.fromSet(MapSequence.fromMap(nodeSizes).keySet()));
    ListSequence.fromList(nodesAndLabels).addSequence(SetSequence.fromSet(MapSequence.fromMap(labelNodeSizes).keySet()));
    ConstraintsGraphProcessor processor = new ConstraintsGraphProcessor(embeddedGraph, directions);
    processor.setUnitLength(myUnitLength);
    processor.modifyEmbeddedGraph(nodesAndLabels, nodeAndLabelSizes);
    processor.constructGraph();
    Map<Node, Point> coordinates = processor.getCoordinatesInModifiedGraph(initialEdgesShifts, nodeAndLabelDirectionSizes, historyManager);
    GraphLayout graphLayout = GraphLayoutFactory.createGraphLayout(graph);
    for (Node node : ListSequence.fromList(oldNodes)) {
      Rectangle rect = getRectangle(coordinates, node, nodeAndLabelDirectionSizes, nodeAndLabelSizes);
      graphLayout.setLayoutFor(node, rect);
    }
    for (Edge edge : SetSequence.fromSet(MapSequence.fromMap(labelNodes).keySet())) {
      Rectangle rect = getRectangle(coordinates, MapSequence.fromMap(labelNodes).get(edge), nodeAndLabelDirectionSizes, nodeAndLabelSizes);
      graphLayout.setLabelLayout(edge, rect);
    }
    for (Edge edge : ListSequence.fromList(oldEdges)) {
      Node source = edge.getSource();
      Node target = edge.getTarget();
      List<Edge> history = historyManager.getHistory(edge);
      List<Point> edgeLayout = ListSequence.fromList(new LinkedList<Point>());
      Node cur = source;
      ListSequence.fromList(edgeLayout).addElement(new Point(MapSequence.fromMap(coordinates).get(cur)));
      for (Edge historyEdge : ListSequence.fromList(history)) {
        Node next = historyEdge.getOpposite(cur);
        ListSequence.fromList(edgeLayout).addElement(new Point(MapSequence.fromMap(coordinates).get(next)));
        cur = next;
      }
      if (ListSequence.fromList(oldNodes).contains(source)) {
        Direction2D dir = MapSequence.fromMap(directions).get(embeddedGraph.getSourceDart(ListSequence.fromList(history).first(), source));
        int size = MapSequence.fromMap(MapSequence.fromMap(nodeAndLabelDirectionSizes).get(source)).get(dir);
        Point first = ListSequence.fromList(edgeLayout).removeElementAt(0);
        first.translate(size * dir.dx(), size * dir.dy());
        ListSequence.fromList(edgeLayout).removeElementAt(0);
        ListSequence.fromList(edgeLayout).insertElement(0, first);
      }
      if (ListSequence.fromList(oldNodes).contains(edge.getTarget())) {
        Direction2D dir = MapSequence.fromMap(directions).get(embeddedGraph.getSourceDart(ListSequence.fromList(history).last(), target));
        int size = MapSequence.fromMap(MapSequence.fromMap(nodeAndLabelDirectionSizes).get(target)).get(dir);
        Point last = ListSequence.fromList(edgeLayout).removeLastElement();
        last.translate(size * dir.dx(), size * dir.dy());
        ListSequence.fromList(edgeLayout).removeLastElement();
        ListSequence.fromList(edgeLayout).addElement(last);
      }
      graphLayout.setLayoutFor(edge, edgeLayout);
    }
    for (QuasiRepresentationModifier.Modification modification : ListSequence.fromList(quasiModifier.getModifications())) {
      splitEdges(graphLayout, modification, initialEdgesShifts);
    }
    return graphLayout;
  }