public void makeRectangleForSplittedNode()

in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/flowOrthogonalLayout/EmbeddedGraphModifier.java [103:189]


  public void makeRectangleForSplittedNode(Node node, final List<Node> nodes) {
    final Wrappers._T<Node> prev = new Wrappers._T<Node>(ListSequence.fromList(nodes).getElement(ListSequence.fromList(nodes).count() - 2));
    final Wrappers._T<Node> cur = new Wrappers._T<Node>(ListSequence.fromList(nodes).getElement(ListSequence.fromList(nodes).count() - 1));
    Edge prevToCurEdge = ListSequence.fromList(prev.value.getEdges()).findFirst(new IWhereFilter<Edge>() {
      public boolean accept(Edge edge) {
        return edge.getOpposite(prev.value) == cur.value;
      }
    });
    Map<Edge, Integer> toSplit = MapSequence.fromMap(new HashMap<Edge, Integer>());
    for (final Node next : ListSequence.fromList(nodes)) {
      Edge curToNextEdge = ListSequence.fromList(cur.value.getEdges()).findFirst(new IWhereFilter<Edge>() {
        public boolean accept(Edge edge) {
          return edge.getOpposite(cur.value) == next;
        }
      });
      Dart prevToCurDart = myEmbeddedGraph.getSourceDart(prevToCurEdge, prev.value);
      Dart curToNextDart = myEmbeddedGraph.getSourceDart(curToNextEdge, cur.value);
      if (!(MapSequence.fromMap(myNodeFaces).containsKey(node))) {
        MapSequence.fromMap(myNodeFaces).put(node, myEmbeddedGraph.getFace(prevToCurDart));
      }
      Direction2D prevToCurDir = MapSequence.fromMap(myDartDirections).get(prevToCurDart);
      Direction2D curToNextDir = MapSequence.fromMap(myDartDirections).get(curToNextDart);
      if (prevToCurDir != curToNextDir) {
        Edge curRealEdge = ListSequence.fromList(cur.value.getEdges()).findFirst(new IWhereFilter<Edge>() {
          public boolean accept(Edge edge) {
            return !(ListSequence.fromList(nodes).contains(edge.getOpposite(cur.value)));
          }
        });
        Dart curRealDart = myEmbeddedGraph.getSourceDart(curRealEdge, cur.value);
        Edge edgeToSplit;
        if (MapSequence.fromMap(myDartDirections).get(curRealDart) == prevToCurDir) {
          edgeToSplit = prevToCurEdge;
        } else {
          edgeToSplit = curToNextEdge;
        }
        if (MapSequence.fromMap(toSplit).containsKey(edgeToSplit)) {
          MapSequence.fromMap(toSplit).put(edgeToSplit, MapSequence.fromMap(toSplit).get(edgeToSplit) + 1);
        } else {
          MapSequence.fromMap(toSplit).put(edgeToSplit, 1);
        }
      }
      prev.value = cur.value;
      cur.value = next;
      prevToCurEdge = curToNextEdge;
    }
    for (Edge edge : SetSequence.fromSet(MapSequence.fromMap(toSplit).keySet())) {
      int splitNum = MapSequence.fromMap(toSplit).get(edge);
      final Wrappers._T<Edge> curEdge = new Wrappers._T<Edge>(edge);
      Direction2D curDirection = null;
      for (int i = 0; i < splitNum; i++) {
        List<Dart> toRemove = ListSequence.fromList(new ArrayList<Dart>());
        ListSequence.fromList(toRemove).addSequence(ListSequence.fromList(myEmbeddedGraph.getDarts(curEdge.value)));
        if (curDirection == null) {
          final Node curSource = curEdge.value.getSource();
          Edge realEdge = ListSequence.fromList(curSource.getEdges()).findFirst(new IWhereFilter<Edge>() {
            public boolean accept(Edge edge) {
              return !(ListSequence.fromList(nodes).contains(edge.getOpposite(curSource)));
            }
          });
          curDirection = MapSequence.fromMap(myDartDirections).get(myEmbeddedGraph.getSourceDart(realEdge, curSource)).turnClockwise(1);
        }
        List<Edge> newEdges = ListSequence.fromList(new ArrayList<Edge>());
        Node newNode = myEmbeddedGraph.splitEdge(curEdge.value, newEdges);
        Dart firstDart = ListSequence.fromList(myEmbeddedGraph.getDarts(ListSequence.fromList(newEdges).getElement(0))).findFirst(new IWhereFilter<Dart>() {
          public boolean accept(Dart dart) {
            return dart.getSource() == curEdge.value.getSource();
          }
        });
        MapSequence.fromMap(myDartDirections).put(firstDart, curDirection);
        MapSequence.fromMap(myDartDirections).put(myEmbeddedGraph.getOpposite(firstDart), curDirection.opposite());
        Dart secondDart = ListSequence.fromList(myEmbeddedGraph.getDarts(ListSequence.fromList(newEdges).getElement(1))).findFirst(new IWhereFilter<Dart>() {
          public boolean accept(Dart dart) {
            return dart.getTarget() == curEdge.value.getTarget();
          }
        });
        Direction2D nextDirection = curDirection.turnClockwise(1);
        MapSequence.fromMap(myCornerNodes).get(node)[nextDirection.ordinal()] = newNode;
        MapSequence.fromMap(myDartDirections).put(secondDart, nextDirection);
        MapSequence.fromMap(myDartDirections).put(myEmbeddedGraph.getOpposite(secondDart), nextDirection.opposite());
        for (Dart dartToRemove : ListSequence.fromList(toRemove)) {
          MapSequence.fromMap(myDartDirections).removeKey(dartToRemove);
        }
        curEdge.value = ListSequence.fromList(newEdges).getElement(1);
        curDirection = nextDirection;
      }
    }
  }