private void preventOverlapping()

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