package com.eas.grid.columns.header;
import java.util.List;
public class HeaderAnalyzer<T> {
protected int depth;
protected HeaderAnalyzer(){
super();
}
public static <T> void analyze(List<HeaderNode<T>> aForest){
HeaderAnalyzer<T> analyzer = new HeaderAnalyzer<T>();
analyzer.maxDepth(aForest, 0);
analyzer.mine(aForest, 0, null);
}
protected void maxDepth(List<HeaderNode<T>> aForest, int aDepth){
aDepth++;
if(depth < aDepth)
depth = aDepth;
for(int i = 0; i < aForest.size(); i++){
HeaderNode<T> n = aForest.get(i);
if(!n.getChildren().isEmpty()){
maxDepth(n.getChildren(), aDepth);
}
}
}
protected int mine(List<HeaderNode<T>> aForest, int aDepth, HeaderNode<T> aParent){
aDepth++;
int leavesCount = 0;
for(int i = 0; i < aForest.size(); i++){
HeaderNode<T> n = aForest.get(i);
if(!n.getChildren().isEmpty()){
leavesCount += mine(n.getChildren(), aDepth, n);
}else{
n.depthRemainder = depth - aDepth;
leavesCount += 1;
}
}
if(aParent != null)
aParent.leavesCount = leavesCount;
return leavesCount;
}
public static <T> void achieveLeaves(List<HeaderNode<T>> aRoots, List<HeaderNode<T>> aLeaves) {
for (HeaderNode<T> node : aRoots) {
if (node.isLeaf()) {
aLeaves.add(node);
} else {
achieveLeaves(node.getChildren(), aLeaves);
}
}
}
}