public void makeRectangleForSingleNode()

in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/flowOrthogonalLayout/EmbeddedGraphModifier.java [190:275]


  public void makeRectangleForSingleNode(Node node, Map<Edge, Edge> modifiedEdges) {
    List<Direction2D> allDirections = Arrays.asList(Direction2D.values());
    List<Dart> darts = myEmbeddedGraph.getDartWithSource(node);
    Face nodeInnerFace = new Face(myGraph);
    Node firstCornerNode = myGraph.createDummyNode();
    Node curCornerNode = firstCornerNode;
    Map<Dart, Edge> edgesFromNode = MapSequence.fromMap(new HashMap<Dart, Edge>());
    List<Dart> nodeOuterDarts = ListSequence.fromList(new LinkedList<Dart>());
    for (final Direction2D dir : ListSequence.fromList(allDirections)) {
      MapSequence.fromMap(myCornerNodes).get(node)[dir.turnClockwise(1).ordinal()] = curCornerNode;
      Node nextCornerNode;
      if (dir == ListSequence.fromList(allDirections).last()) {
        nextCornerNode = firstCornerNode;
      } else {
        nextCornerNode = myGraph.createDummyNode();
      }
      Dart dirDart = ListSequence.fromList(darts).findFirst(new IWhereFilter<Dart>() {
        public boolean accept(Dart dart) {
          return MapSequence.fromMap(myDartDirections).get(dart) == dir;
        }
      });
      if (dirDart == null) {
        addToNodeFace(nodeInnerFace, myGraph.connect(curCornerNode, nextCornerNode), dir, nodeOuterDarts);
      } else {
        Node newNode = myGraph.createDummyNode();
        MapSequence.fromMap(edgesFromNode).put(dirDart, myGraph.connect(newNode, dirDart.getTarget()));
        addToNodeFace(nodeInnerFace, myGraph.connect(curCornerNode, newNode), dir, nodeOuterDarts);
        addToNodeFace(nodeInnerFace, myGraph.connect(newNode, nextCornerNode), dir, nodeOuterDarts);
      }
      curCornerNode = nextCornerNode;
    }
    Map<Dart, Edge> endEdges = MapSequence.fromMap(new HashMap<Dart, Edge>());
    for (Dart dart : ListSequence.fromList(darts)) {
      MapSequence.fromMap(modifiedEdges).put(dart.getEdge(), MapSequence.fromMap(edgesFromNode).get(dart));
      List<Dart> faceDarts = myEmbeddedGraph.getFace(dart).getDarts();
      int prevIndex = ListSequence.fromList(faceDarts).indexOf(dart) - 1;
      if (prevIndex == -1) {
        prevIndex = ListSequence.fromList(faceDarts).count() - 1;
      }
      MapSequence.fromMap(endEdges).put(dart, MapSequence.fromMap(edgesFromNode).get(myEmbeddedGraph.getOpposite(ListSequence.fromList(faceDarts).getElement(prevIndex))));
    }
    for (Dart dart : ListSequence.fromList(darts)) {
      Face face = myEmbeddedGraph.getFace(dart);
      List<Dart> faceDarts = face.getDarts();
      int dartIndex = ListSequence.fromList(faceDarts).indexOf(dart);
      int prevIndex = dartIndex - 1;
      if (prevIndex == -1) {
        prevIndex = ListSequence.fromList(faceDarts).count() - 1;
      }
      Dart prevDart = ListSequence.fromList(faceDarts).getElement(prevIndex);
      Edge startEdge = MapSequence.fromMap(edgesFromNode).get(dart);
      Edge endEdge = MapSequence.fromMap(endEdges).get(dart);
      Node start = startEdge.getSource();
      Node end = endEdge.getSource();
      List<Dart> newDarts = ListSequence.fromList(new LinkedList<Dart>());
      Iterator<Dart> dartItr = ListSequence.fromList(nodeOuterDarts).iterator();
      Dart cur;
      do {
        cur = dartItr.next();
      } while (cur.getTarget() != start);
      do {
        ListSequence.fromList(newDarts).insertElement(0, cur);
        if (!(dartItr.hasNext())) {
          dartItr = ListSequence.fromList(nodeOuterDarts).iterator();
        }
        cur = dartItr.next();
      } while (cur.getTarget() != end);
      Dart newStartDart = new Dart(startEdge, start);
      ListSequence.fromList(newDarts).addElement(newStartDart);
      MapSequence.fromMap(myDartDirections).put(newStartDart, MapSequence.fromMap(myDartDirections).get(dart));
      Dart newEndDart = new Dart(endEdge, endEdge.getTarget());
      ListSequence.fromList(newDarts).insertElement(0, newEndDart);
      MapSequence.fromMap(myDartDirections).put(newEndDart, MapSequence.fromMap(myDartDirections).get(prevDart));
      myEmbeddedGraph.removeDart(face, dart);
      face.makeEndsWith(prevDart);
      myEmbeddedGraph.removeDart(face, prevDart);
      for (Dart newDart : ListSequence.fromList(newDarts)) {
        myEmbeddedGraph.addLastDart(face, newDart);
      }
      MapSequence.fromMap(myDartDirections).removeKey(dart);
      MapSequence.fromMap(myDartDirections).removeKey(prevDart);
    }
    MapSequence.fromMap(myNodeFaces).put(node, nodeInnerFace);
    myEmbeddedGraph.addFace(nodeInnerFace);
    myGraph.deleteNode(node);
  }