コード例 #1
0
  /** Layouts the children of the given node (if it has any). */
  private <T> void layoutChildren(ITreeMapNode<T> node) {
    if (node.getChildren().isEmpty()) {
      return;
    }
    Rectangle2D rect = node.getLayoutRectangle();
    double scale = rect.getWidth() * rect.getHeight() / node.getArea();

    double layoutX = rect.getMinX();
    double lastX = 0;
    List<ITreeMapNode<T>> l = new ArrayList<ITreeMapNode<T>>();
    List<ITreeMapNode<T>> lastList = new ArrayList<ITreeMapNode<T>>();
    for (ITreeMapNode<T> child : node.getChildren()) {
      double oldAspect = calcAvgAspect(l, rect.getHeight(), scale);
      l.add(child);
      double newAspect = calcAvgAspect(l, rect.getHeight(), scale);

      if (oldAspect < newAspect) {
        l.remove(l.size() - 1);
        lastX = layoutX;
        lastList.clear();
        lastList.addAll(l);

        layoutX += layoutList(l, rect.getHeight(), layoutX, rect.getMinY(), scale);
        l.clear();
        l.add(child);
      }
    }

    // last list might be too small, so potentially merge with previous one
    lastList.addAll(l);
    if (calcAvgAspect(lastList, rect.getHeight(), scale)
        < calcAvgAspect(l, rect.getHeight(), scale)) {
      layoutList(lastList, rect.getHeight(), lastX, rect.getMinY(), scale);
    } else {
      layoutList(l, rect.getHeight(), layoutX, rect.getMinY(), scale);
    }
  }