package com.baselet.generator.sorting; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import com.baselet.control.basics.geom.Dimension; import com.baselet.control.basics.geom.Rectangle; import com.baselet.control.enums.ElementId; import com.baselet.diagram.CurrentDiagram; import com.baselet.element.ElementFactorySwing; import com.baselet.element.NewGridElement; public class PackageLayout extends Layout { private final int ADJUST_TO_PACKAGE_HEAD; public PackageLayout() { ADJUST_TO_PACKAGE_HEAD = GRIDSIZE * 2; } @Override public void layout(List<SortableElement> elements) { Map<String, List<SortableElement>> packages = extractPackages(elements); Map<SortableElement, List<SortableElement>> packList = new TreeMap<SortableElement, List<SortableElement>>(); for (Map.Entry<String, List<SortableElement>> entry : packages.entrySet()) { SortableElement pack = createPackageElement(entry.getKey()); List<SortableElement> packElements = entry.getValue(); Layout l = new HeightLayout(); l.layout(packElements); Dimension size = l.bounds; pack.getElement().setSize(size.width, size.height); packList.put(pack, packElements); } Rectangle x = new Rectangle(); for (SortableElement pack : packList.keySet()) { pack.getElement().setLocation(10, 10 + x.y + x.height); x = pack.getElement().getRectangle(); } for (Entry<SortableElement, List<SortableElement>> entry : packList.entrySet()) { adjustLocations(entry.getKey(), entry.getValue()); elements.add(entry.getKey()); } } private void adjustLocations(SortableElement pack, List<SortableElement> packElements) { for (SortableElement s : packElements) { Rectangle loc = s.getElement().getRectangle(); Rectangle packLoc = pack.getElement().getRectangle(); s.getElement().setLocation(loc.x + packLoc.x, loc.y + packLoc.y + ADJUST_TO_PACKAGE_HEAD); } } private Map<String, List<SortableElement>> extractPackages(List<SortableElement> elements) { Map<String, List<SortableElement>> packages = new HashMap<String, List<SortableElement>>(); for (SortableElement element : elements) { String packageName = element.getParsedClass().getPackage(); if (!packages.containsKey(packageName)) { packages.put(packageName, new ArrayList<SortableElement>()); } packages.get(packageName).add(element); } return packages; } private SortableElement createPackageElement(String packageName) { NewGridElement pack = ElementFactorySwing.create(ElementId.UMLPackage, new Rectangle(10, 10, 10, 10), packageName + "\nbg=orange", "", CurrentDiagram.getInstance().getDiagramHandler()); return new SortableElement(pack, packageName); } }