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