public void makeFaceRectangle()

in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/flowOrthogonalLayout/EmbeddedGraphModifier.java [377:429]


  public void makeFaceRectangle(Face face) {
    Dart badDart = null;
    List<Dart> darts = face.getDarts();
    Iterator<Dart> dartItr = ListSequence.fromList(darts).iterator();
    Dart prev = ListSequence.fromList(darts).last();
    int sum = 0;
    while (dartItr.hasNext() && badDart == null) {
      Dart cur = dartItr.next();
      int turn = MapSequence.fromMap(myDartDirections).get(prev).getTurn(MapSequence.fromMap(myDartDirections).get(cur));
      if (turn < 0) {
        badDart = prev;
        sum = turn;
      }
      prev = cur;
    }
    while (sum != 1) {
      if (!(dartItr.hasNext())) {
        dartItr = ListSequence.fromList(darts).iterator();
      }
      Dart cur = dartItr.next();
      sum += MapSequence.fromMap(myDartDirections).get(prev).getTurn(MapSequence.fromMap(myDartDirections).get(cur));
      prev = cur;
    }
    if (badDart != null) {
      List<Edge> newEdges = ListSequence.fromList(new ArrayList<Edge>());
      Dart prevOpposite = myEmbeddedGraph.getOpposite(prev);
      Node newNode = myEmbeddedGraph.splitEdge(prev.getEdge(), newEdges);
      for (Edge newEdge : ListSequence.fromList(newEdges)) {
        for (Dart newDart : ListSequence.fromList(myEmbeddedGraph.getDarts(newEdge))) {
          if (myEmbeddedGraph.getFace(newDart) == face) {
            MapSequence.fromMap(myDartDirections).put(newDart, MapSequence.fromMap(myDartDirections).get(prev));
          } else {
            MapSequence.fromMap(myDartDirections).put(newDart, MapSequence.fromMap(myDartDirections).get(prev).opposite());
          }
        }
      }
      MapSequence.fromMap(myDartDirections).removeKey(prev);
      MapSequence.fromMap(myDartDirections).removeKey(prevOpposite);
      Node badCorner = badDart.getTarget();
      Edge splitEdge = myGraph.connect(badCorner, newNode);
      List<Face> newFaces = myEmbeddedGraph.splitFace(face, ListSequence.fromListAndArray(new ArrayList<Edge>(), splitEdge), badCorner, newNode);
      for (Dart dart : ListSequence.fromList(myEmbeddedGraph.getDarts(splitEdge))) {
        if (dart.getSource() == badCorner) {
          MapSequence.fromMap(myDartDirections).put(dart, MapSequence.fromMap(myDartDirections).get(badDart));
        } else {
          MapSequence.fromMap(myDartDirections).put(dart, MapSequence.fromMap(myDartDirections).get(badDart).opposite());
        }
      }
      for (Face newFace : ListSequence.fromList(newFaces)) {
        makeFaceRectangle(newFace);
      }
    }
  }