package de._82grfl1bif.KPI_Visualizer.helpers; import de._82grfl1bif.KPI_Visualizer.structures.Structure; import javax.management.AttributeNotFoundException; import java.awt.*; import java.util.ArrayList; import java.util.Comparator; @SuppressWarnings("ALL") public class Layout { private final ArrayList structures; private final ArrayList layout = new ArrayList<>(); public int getSize() { return size; } private int size = 0; public Layout(ArrayList structures){ this.structures = structures;//ordered biggest first. } private static class WidthComparator implements Comparator { @Override public int compare(Quadrat o1, Quadrat o2) { return Integer.compare(o1.getWidth().x, o2.getWidth().x); } } private static class CoordinateXComparator implements Comparator{ @Override public int compare(Quadrat o1, Quadrat o2) { return Integer.compare(o1.bottomLeftCorner.x, o2.bottomLeftCorner.x); } } private static class CoordinateYComparator implements Comparator{ @Override public int compare(Quadrat o1, Quadrat o2) { return Integer.compare(o1.bottomLeftCorner.y, o2.bottomLeftCorner.y); } } public void createLayout(){ boolean first = true; for (Structure s:structures) { if(first){ first = false; this.size = s.getWidth().x; layout.add(new Quadrat(new Point(0,0),s.getWidth().x)); layout.addAll(layout.get(0).setBelegt(s)); }else{ layout.sort(new CoordinateYComparator()); layout.sort(new CoordinateXComparator()); layout.sort(new WidthComparator()); boolean noneFoundFlag = true; for (int i = 0;i < layout.size();i++) { if((s.getWidth().x <= layout.get(i).getWidth().x)&&(!layout.get(i).getBelegt())&&(noneFoundFlag)){ noneFoundFlag = false; layout.addAll(layout.get(i).setBelegt(s)); } } if (noneFoundFlag){ appendQuad(s); } } } } private void appendQuad(Structure structure){ Quadrat q = new Quadrat(new Point(this.size,0),structure.getWidth().x); q.setBelegt(structure); this.size += structure.getWidth().x; layout.add(q); layout.add(new Quadrat(new Point(q.bottomLeftCorner.y,q.bottomLeftCorner.x),new Point(q.topRightCorner.y,q.topRightCorner.x))); // gespiegeltes Quadrat layout.add(new Quadrat(new Point(q.bottomLeftCorner.x,q.bottomLeftCorner.x),structure.getWidth().x)); // Oberes rechtes Quadrat if((this.size-(2*structure.getWidth().x)) > 0){ //falls Abstand zwischen den Quadraten ist. Rectangle rTop = new Rectangle(structure.getWidth().x,(this.size-2*structure.getWidth().x),new Point(q .topRightCorner.y,q.bottomLeftCorner.x)); layout.addAll(rTop.splittToQuads(rTop)); Rectangle rRight = new Rectangle((this.size-2*structure.getWidth().x),structure.getWidth().x,new Point(q.bottomLeftCorner.x,q.topRightCorner.y)); layout.addAll(rRight.splittToQuads(rRight)); } } public Point getCoordinateOf(Structure structure) throws AttributeNotFoundException { for (Quadrat q:this.layout) { if(q.getBelegt()){ if(q.getStructure().equals(structure)){ return q.bottomLeftCorner; } } } throw new AttributeNotFoundException("Diese Structure ist nicht in der Ebene."); } }