private void removeTempObjects()

in graphLayout/jetbrains.mps.graphLayout.orthogonalLayout/source_gen/jetbrains/mps/graphLayout/stOrthogonalLayout/RectOrthogonalLayouter.java [176:278]


  private void removeTempObjects(List<Edge> oldEdges, GraphLayout graphLayout, Graph graph, Node addedNode, EdgesHistoryManager manager) {
    Set<Node> visited = SetSequence.fromSet(new HashSet<Node>());
    for (Edge oldEdge : ListSequence.fromList(oldEdges)) {
      List<Edge> history = manager.getHistory(oldEdge);
      Node cur = oldEdge.getSource();
      if (ListSequence.fromList(history).count() > 1) {
        List<Point> oldEdgeLayout = ListSequence.fromList(new ArrayList<Point>());
        List<Point> sourceHistoryPath = graphLayout.getEdgeLayout(ListSequence.fromList(history).first());
        Point sourcePoint;
        if (ListSequence.fromList(history).first().getSource() == oldEdge.getSource()) {
          sourcePoint = new Point(ListSequence.fromList(sourceHistoryPath).first());
        } else {
          sourcePoint = new Point(ListSequence.fromList(sourceHistoryPath).last());
        }
        List<Point> targetHistoryPath = graphLayout.getEdgeLayout(ListSequence.fromList(history).last());
        Point targetPoint;
        if (ListSequence.fromList(history).last().getTarget() == oldEdge.getTarget()) {
          targetPoint = new Point(ListSequence.fromList(targetHistoryPath).last());
        } else {
          targetPoint = new Point(ListSequence.fromList(targetHistoryPath).first());
        }
        Edge prev = null;
        for (Edge edge : ListSequence.fromList(history)) {
          List<Point> edgeLayout = graphLayout.getEdgeLayout(edge);
          if (edge.getSource() != cur) {
            edgeLayout = ListSequence.fromList(edgeLayout).reversedList();
          }
          if (cur.isDummy()) {
            Rectangle rect = graphLayout.getNodeLayout(cur);
            int y;
            if (SetSequence.fromSet(visited).contains(cur)) {
              y = rect.y + rect.height;
              int shift = myEdgeDistance / 3;
              int last = ListSequence.fromList(oldEdgeLayout).count() - 1;
              ListSequence.fromList(oldEdgeLayout).getElement(last).translate(shift, 0);
              ListSequence.fromList(oldEdgeLayout).getElement(last - 1).translate(shift, 0);
              ListSequence.fromList(edgeLayout).getElement(0).translate(shift, 0);
              ListSequence.fromList(edgeLayout).getElement(1).translate(shift, 0);
              // if edge has a label, it should be shifted too  
              Rectangle labelRect = graphLayout.getLabelLayout(edge);
              if (labelRect != null) {
                labelRect.setLocation(labelRect.x + shift, labelRect.y);
              }
              if (prev != null) {
                labelRect = graphLayout.getLabelLayout(prev);
                if (labelRect != null) {
                  labelRect.setLocation(labelRect.x + shift, labelRect.y);
                }
              }
            } else {
              y = rect.y;
              SetSequence.fromSet(visited).addElement(cur);
            }
            Point left = ListSequence.fromList(edgeLayout).removeLastElement();
            Point right = ListSequence.fromList(edgeLayout).removeElementAt(0);
            ListSequence.fromList(oldEdgeLayout).addElement(new Point(left.x, y));
            ListSequence.fromList(edgeLayout).insertElement(0, new Point(right.x, y));
            prev = edge;
          }
          ListSequence.fromList(oldEdgeLayout).addSequence(ListSequence.fromList(edgeLayout));
          cur = edge.getOpposite(cur);
        }
        // during shift edges we can disconnect edge from node 
        Rectangle sourceRect = graphLayout.getNodeLayout(oldEdge.getSource());
        if (sourceRect.contains(ListSequence.fromList(oldEdgeLayout).first())) {
          ListSequence.fromList(oldEdgeLayout).insertElement(0, sourcePoint);
        }
        Rectangle targetRect = graphLayout.getNodeLayout(oldEdge.getTarget());
        if (targetRect.contains(ListSequence.fromList(oldEdgeLayout).last())) {
          ListSequence.fromList(oldEdgeLayout).addElement(targetPoint);
        }
        // or add point inside a node 
        Point second = ListSequence.fromList(oldEdgeLayout).getElement(1);
        if (sourceRect.contains(second)) {
          ListSequence.fromList(oldEdgeLayout).removeElementAt(0);
          ListSequence.fromList(oldEdgeLayout).removeElementAt(0);
          ListSequence.fromList(oldEdgeLayout).insertElement(0, OrthogonalUtil.findOnBorder(sourceRect, second, ListSequence.fromList(oldEdgeLayout).first()));
        }
        Point beforeLast = ListSequence.fromList(oldEdgeLayout).getElement(ListSequence.fromList(oldEdgeLayout).count() - 2);
        if (targetRect.contains(beforeLast)) {
          ListSequence.fromList(oldEdgeLayout).removeLastElement();
          ListSequence.fromList(oldEdgeLayout).removeLastElement();
          ListSequence.fromList(oldEdgeLayout).addElement(OrthogonalUtil.findOnBorder(targetRect, beforeLast, ListSequence.fromList(oldEdgeLayout).last()));
        }
        graphLayout.setLayoutFor(oldEdge, oldEdgeLayout);
      } else {
        Edge newEdge = ListSequence.fromList(history).getElement(0);
        graphLayout.setLayoutFor(oldEdge, graphLayout.getEdgeLayout(newEdge));
      }
    }
    List<Node> nodesToRemove = ListSequence.fromList(graph.getNodes()).where(new IWhereFilter<Node>() {
      public boolean accept(Node it) {
        return it.isDummy();
      }
    }).toListSequence();
    ListSequence.fromList(nodesToRemove).addElement(addedNode);
    for (Node node : ListSequence.fromList(nodesToRemove)) {
      MapSequence.fromMap(graphLayout.getNodeLayout()).removeKey(node);
      for (Edge edge : ListSequence.fromList(node.getEdges())) {
        MapSequence.fromMap(graphLayout.getEdgeLayout()).removeKey(edge);
      }
    }
  }