package com.eas.grid.columns.header; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class HeaderSplitter<T> { // settings protected int minLeave; protected int maxLeave; // processing protected List<HeaderNode<T>> splittedLeaves = new ArrayList<>(); protected int leaveIndex = -1; protected HeaderSplitter(int aMinLeave, int aMaxLeave) { super(); minLeave = aMinLeave; maxLeave = aMaxLeave; } public static <T> List<HeaderNode<T>> split(List<HeaderNode<T>> toBeSplitted, int aMinLeave, int aMaxLeave) { HeaderSplitter<T> splitter = new HeaderSplitter<T>(aMinLeave, aMaxLeave); splitter.process(toBeSplitted, null); return splitter.toRoots(); } protected List<HeaderNode<T>> toRoots() { List<HeaderNode<T>> res = new ArrayList<>(); Set<HeaderNode<T>> met = new HashSet<>(); for (int i = 0; i < splittedLeaves.size(); i++) { HeaderNode<T> leaf = splittedLeaves.get(i); HeaderNode<T> 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<HeaderNode<T>> toBeSplitted, HeaderNode<T> aClonedParent) { boolean res = false; for (int i = 0; i < toBeSplitted.size(); i++) { HeaderNode<T> n = toBeSplitted.get(i); HeaderNode<T> nc = n.lightCopy(); 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; } }