package de._82grfl1bif.kpiVisualizer.layouts.treeMap; import de._82grfl1bif.kpiVisualizer.structures.Foundation; import de._82grfl1bif.kpiVisualizer.structures.Structure; import java.util.ArrayList; public class SquarifiedTreemapLayout { private final ArrayList rows; public ArrayList getRows() { return rows; } public SquarifiedTreemapLayout() { this.rows = new ArrayList<>(); } public void generateLayout(Foundation foundation, Rectangle bounds) { rows.addAll(generateSubLayout(foundation, bounds)); ArrayList foundations = new ArrayList<>(); foundations.add(foundation); do { ArrayList tempRows = new ArrayList<>(); rows.stream().filter(r -> r.rectangles.containsValue(foundations.get(foundations.size()-1))).forEach(row -> tempRows.addAll(generateSubLayout(foundations.get(foundations.size()-1), new Rectangle(foundations.get(foundations.size()-1).getArea(), row.getWidth(), row.space.getOrigin())))); rows.addAll(tempRows);//letztes element bearbeitet und ein subLayout dafür angelegt. ArrayList tempFoundations = new ArrayList<>(); for (Structure s : foundations.get(foundations.size() - 1).getChildren()) { if (s.getClass() == Foundation.class) { tempFoundations.add((Foundation) s); } } foundations.remove(foundations.size()-1); foundations.addAll(tempFoundations);//alle Kinder(nur Foundations) des letzten Elements in die Liste geschrieben und das Element entfernt. } while (!foundations.isEmpty()); } private ArrayList generateSubLayout(Foundation foundation, Rectangle rectangle) { ArrayList result = new ArrayList<>(); result.add(new Row(rectangle)); for (Structure s : foundation.getChildren()) { if (!result.get(result.size() - 1).checkInsert(s.getArea())) {//wenn einfügen in die bestehende Reihe das Seitenverhältnis verschlechtern würde. Row tempRow = new Row(result.get(result.size() - 1).getLeftover());//erzeige neue Reihe mit dem Rest des alten spaces als space. result.add(tempRow);//füge die neue Reihe ans Ende der Sammlung ein. } result.get(result.size() - 1).addRectangle(s.getArea(), s);//füge das Kind in die letzte Reihe ein, die in der Liste ist. } return result; } }