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);
}
}
}