in diagram/src/main/java/jetbrains/jetpad/projectional/diagram/view/ConnectionRoutingView.java [74:124]
private void preventOverlapping() {
View moved = getInvalid();
if (myMovingView != moved) {
myMovingView = moved;
myOldPositions.clear();
}
if (moved == null) {
return;
}
List<Rectangle> viewRects = new ArrayList<>();
viewRects.add(getRect(moved));
List<View> childrenByDist = new ArrayList<>(getNodes());
childrenByDist.remove(moved);
final Vector movedCenter = moved.bounds().get().center();
Collections.sort(childrenByDist, new Comparator<View>() {
@Override
public int compare(View f1, View f2) {
Double d1 = f1.bounds().get().center().sub(movedCenter).length();
Double d2 = f2.bounds().get().center().sub(movedCenter).length();
return d1.compareTo(d2);
}
});
for (View f: childrenByDist) {
List<Vector> oldPos = myOldPositions.get(f);
Rectangle bounds = f.bounds().get();
if (oldPos != null) {
List<Vector> newPos = new ArrayList<>();
Vector foundPos = null;
for(Vector pos: oldPos) {
if (posFree(new Rectangle(pos, bounds.dimension), viewRects)) {
foundPos = pos;
break;
} else {
newPos.add(pos);
}
}
if (foundPos != null) {
myOldPositions.put(f, newPos);
updateView(viewRects, f, foundPos);
continue;
}
}
Vector newOrigin = new AvoidObstacles().findNewPosition(bounds, viewRects).origin;
if (!myOldPositions.containsKey(f)) {
myOldPositions.put(f, new ArrayList<Vector>());
}
myOldPositions.get(f).add(newOrigin);
updateView(viewRects, f, newOrigin);
}
}