package com.bearsoft.gui.grid.header;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class HeaderSplitter {
// settings
protected int minLeave;
protected int maxLeave;
// processing
protected List<GridColumnsNode> splittedLeaves = new ArrayList<>();
protected int leaveIndex = -1;
protected HeaderSplitter(int aMinLeave, int aMaxLeave) {
super();
minLeave = aMinLeave;
maxLeave = aMaxLeave;
}
public static List<GridColumnsNode> split(List<GridColumnsNode> toBeSplitted, int aMinLeave, int aMaxLeave) {
HeaderSplitter splitter = new HeaderSplitter(aMinLeave, aMaxLeave);
splitter.process(toBeSplitted, null);
return splitter.toRoots();
}
protected List<GridColumnsNode> toRoots() {
List<GridColumnsNode> res = new ArrayList<>();
Set<GridColumnsNode> met = new HashSet<>();
for (int i = 0; i < splittedLeaves.size(); i++) {
GridColumnsNode leaf = splittedLeaves.get(i);
GridColumnsNode parent = leaf;
while (parent.getParent() != null) {
parent = parent.getParent();
}
if (!met.contains(parent)) {
met.add(parent);
res.add(parent);
}
}
return res;
}
protected boolean process(List<GridColumnsNode> toBeSplitted, GridColumnsNode aClonedParent) {
boolean res = false;
for (int i = 0; i < toBeSplitted.size(); i++) {
GridColumnsNode n = toBeSplitted.get(i);
GridColumnsNode nc = n.lightCopy();
nc.setTableColumn(n.getTableColumn());
nc.setStyleSource(n);
if (n.getChildren().isEmpty()) {
leaveIndex++;
if (leaveIndex >= minLeave && leaveIndex <= maxLeave) {
res = true;
splittedLeaves.add(nc);
if (aClonedParent != null) {
aClonedParent.addColumnNode(nc);
}
}
} else {
boolean isGoodLeaveIndex = process(n.getChildren(), nc);
if (isGoodLeaveIndex) {
res = true;
if (aClonedParent != null) {
aClonedParent.addColumnNode(nc);
}
}
}
}
return res;
}
}