package husacct.graphics.task.modulelayout;
import husacct.common.dto.SoftwareUnitDTO;
import husacct.graphics.domain.figures.BaseFigure;
import husacct.graphics.task.modulelayout.layered.CreateLayersInGraphic;
import husacct.graphics.task.modulelayout.layered.LayoutStrategy;
import org.jhotdraw.draw.AbstractCompositeFigure;
import org.jhotdraw.draw.Figure;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
public class LayeredLayoutStrategy implements LayoutStrategy {
TreeMap<Integer, List<BaseFigure>> treeMap;
AbstractCompositeFigure drawing;
public LayeredLayoutStrategy(AbstractCompositeFigure theDrawing) {
drawing = theDrawing;
}
@Override
public void doLayout() {
treeMap = createTreeMapFromFigures();
List<SoftwareUnitDTO> list = createSoftwareDTO_FromTreeMap();
TreeMap<Integer, ArrayList<SoftwareUnitDTO>> anotherTreeMap = new CreateLayersInGraphic().executeAlgorithm(list);
drawing.getChildren();
for (int i = 0; i < anotherTreeMap.keySet().size(); i++){
List<SoftwareUnitDTO> softwareUnitDTOs = anotherTreeMap.get(i);
for (SoftwareUnitDTO dto : softwareUnitDTOs) {
Figure figure = null;
for (Figure f : drawing.getChildren()){
if (((BaseFigure)f).getUniqueName().equals(dto.uniqueName)){
setLayout(f);
break;
}
}
}
}
}
private TreeMap<Integer, List<BaseFigure>> createTreeMapFromFigures() {
List<Figure> figures = drawing.getChildren();
TreeMap<Integer, List<BaseFigure>> treeMap = new TreeMap<>();
int level = 0;
List<BaseFigure> subList = new ArrayList<>();
treeMap.put(level, subList);
for (Figure figure: figures) {
BaseFigure f = (BaseFigure) figure;
if (f.isParent()) {
subList = new ArrayList<>();
level++;
treeMap.put(level, subList);
}
subList.add(f);
}
return treeMap;
}
private List<SoftwareUnitDTO> createSoftwareDTO_FromTreeMap() {
List<BaseFigure> list = new ArrayList<>();
list.addAll(treeMap.get(0));
for (int i = 1; i < treeMap.size(); i ++) {
list.add(treeMap.get(i).get(0));
}
return createSoftwareDTO_FromArrayList(list);
}
private List<SoftwareUnitDTO> createSoftwareDTO_FromArrayList(List<BaseFigure> figures){
ArrayList<SoftwareUnitDTO> softwareUnitDTOs = new ArrayList<>();
for (BaseFigure f : figures) {
SoftwareUnitDTO dto = new SoftwareUnitDTO(f.getUniqueName(), f.getName(), f.getType(), ""+f.isVisible());
softwareUnitDTOs.add(dto);
}
return softwareUnitDTOs;
}
private void setLayout(Figure f) {
}
}