SimpleSquareLayout.java 3.89 KB
Newer Older
Florian Grabowski's avatar
Florian Grabowski committed
1
package de._82grfl1bif.kpiVisualizer.layouts.simpleSquare;
Florian Grabowski's avatar
Florian Grabowski committed
2

Florian Grabowski's avatar
Florian Grabowski committed
3
import de._82grfl1bif.kpiVisualizer.structures.Structure;
Florian Grabowski's avatar
Florian Grabowski committed
4
5

import javax.management.AttributeNotFoundException;
Florian Grabowski's avatar
Florian Grabowski committed
6
import java.awt.Point;
Florian Grabowski's avatar
Florian Grabowski committed
7
8
9
import java.util.ArrayList;
import java.util.Comparator;

Florian Grabowski's avatar
Florian Grabowski committed
10
public class SimpleSquareLayout {
Florian Grabowski's avatar
Florian Grabowski committed
11
12
13
14
15
16
17
18
19
20

    private final ArrayList<Structure> structures;
    private final ArrayList<Quadrat> layout = new ArrayList<>();

    public int getSize() {
        return size;
    }

    private int size = 0;

Florian Grabowski's avatar
Florian Grabowski committed
21
    public SimpleSquareLayout(ArrayList<Structure> structures){
Florian Grabowski's avatar
Florian Grabowski committed
22
23
24
25
26
27
28
        this.structures = structures;//ordered biggest first.
    }

    private static class WidthComparator implements Comparator<Quadrat> {

        @Override
        public int compare(Quadrat o1, Quadrat o2) {
29
            return Integer.compare(o1.getWidth().x, o2.getWidth().x);
Florian Grabowski's avatar
Florian Grabowski committed
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
        }
    }
    private static class CoordinateXComparator implements Comparator<Quadrat>{
        @Override
        public int compare(Quadrat o1, Quadrat o2) {
            return Integer.compare(o1.bottomLeftCorner.x, o2.bottomLeftCorner.x);
        }
    }
    private static class CoordinateYComparator implements Comparator<Quadrat>{
        @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;
50
51
                this.size = s.getWidth().x;
                layout.add(new Quadrat(new Point(0,0),s.getWidth().x));
Florian Grabowski's avatar
Florian Grabowski committed
52
                layout.addAll(layout.get(0).setFilled(s));
Florian Grabowski's avatar
Florian Grabowski committed
53
54
55
56
57
58
            }else{
                layout.sort(new CoordinateYComparator());
                layout.sort(new CoordinateXComparator());
                layout.sort(new WidthComparator());
                boolean noneFoundFlag = true;
                for (int i = 0;i < layout.size();i++) {
Florian Grabowski's avatar
Florian Grabowski committed
59
                    if((s.getWidth().x <= layout.get(i).getWidth().x)&&(!layout.get(i).getFilled())&&(noneFoundFlag)){
Florian Grabowski's avatar
Florian Grabowski committed
60
                        noneFoundFlag = false;
Florian Grabowski's avatar
Florian Grabowski committed
61
                        layout.addAll(layout.get(i).setFilled(s));
Florian Grabowski's avatar
Florian Grabowski committed
62
63
64
65
66
67
68
69
70
71
                    }
                }
                if (noneFoundFlag){
                    appendQuad(s);
                }
            }
        }
    }

    private void appendQuad(Structure structure){
72
        Quadrat q = new Quadrat(new Point(this.size,0),structure.getWidth().x);
Florian Grabowski's avatar
Florian Grabowski committed
73
        q.setFilled(structure);
74
        this.size += structure.getWidth().x;
Florian Grabowski's avatar
Florian Grabowski committed
75
76
        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
77
        layout.add(new Quadrat(new Point(q.bottomLeftCorner.x,q.bottomLeftCorner.x),structure.getWidth().x)); // Oberes rechtes Quadrat
Florian Grabowski's avatar
Florian Grabowski committed
78
        if((this.size-(2*structure.getWidth().x)) > 0){ //in case there is space between those quads.
Florian Grabowski's avatar
Florian Grabowski committed
79
            de._82grfl1bif.kpiVisualizer.layouts.simpleSquare.Rectangle rTop = new de._82grfl1bif.kpiVisualizer.layouts.simpleSquare.Rectangle(structure.getWidth().x,(this.size-2*structure.getWidth().x),new Point(q .topRightCorner.y,q.bottomLeftCorner.x));
80
            layout.addAll(rTop.splitToQuads(rTop));
Florian Grabowski's avatar
Florian Grabowski committed
81
            de._82grfl1bif.kpiVisualizer.layouts.simpleSquare.Rectangle rRight = new Rectangle((this.size-2*structure.getWidth().x),structure.getWidth().x,new Point(q.bottomLeftCorner.x,q.topRightCorner.y));
82
            layout.addAll(rRight.splitToQuads(rRight));
Florian Grabowski's avatar
Florian Grabowski committed
83
84
85
86
87
        }
    }

    public Point getCoordinateOf(Structure structure) throws AttributeNotFoundException {
        for (Quadrat q:this.layout) {
Florian Grabowski's avatar
Florian Grabowski committed
88
            if(q.getFilled()){
Florian Grabowski's avatar
Florian Grabowski committed
89
90
91
92
93
                if(q.getStructure().equals(structure)){
                    return q.bottomLeftCorner;
                }
            }
        }
Florian Grabowski's avatar
Florian Grabowski committed
94
        throw new AttributeNotFoundException("This structure couldn't found in the hierarchy.");
Florian Grabowski's avatar
Florian Grabowski committed
95
96
    }
}