NodeFilter hiddenFilter=transformer.getHiddenFilter();
if (hiddenFilter instanceof BaseFilter && !((BaseFilter)hiddenFilter).isActive()) hiddenFilter=null; //to avoid useless filtering in case of BaseFilter
NodeFilter userFilter=(transformer.isNoneFilter())?null:transformer.getUserFilter();
boolean filtering=hiddenFilter!=null||userFilter!=null;
NodeSorter sorter1=transformer.getHiddenSorter();
NodeSorter sorter2=transformer.getUserSorter();
boolean sorting=!(sorter1==null&&transformer.isNoneSorter());
NodeGrouper grouper=transformer.getUserGrouper();
boolean grouping=!transformer.isNoneGrouper();
if (!filtering&&!sorting&&!grouping) return;
if (transformer.isShowAssignments()&&preserveHierarchy&&!transformer.isTreatAssignmentsAsTasks()) assignmentsMap=extractAssignments(list);
List localList=null;
Stack parents=null;
boolean alreadyExcluded;
if (preserveHierarchy){
localList=new ArrayList();
parents=new Stack();
}else localList=list;
GraphicNode gnode,previous=null;
Object current;
for (Iterator i=list.iterator();i.hasNext();){
gnode=(GraphicNode)i.next();
gnode.setFiltered(false);
if (!gnode.isVoid()){
current=(composition==null)?gnode.getNode():composition.evaluate(gnode.getNode());
alreadyExcluded=false;
if (hiddenFilter!=null){
if(!hiddenFilter.evaluate(current)){
if (!gnode.isSummary() || !preserveHierarchy){
i.remove();
continue;
}
if (gnode.isSummary()&&preserveHierarchy) gnode.setFiltered(true);
alreadyExcluded=true;
}
}
if (userFilter!=null&&!alreadyExcluded){
if(!userFilter.evaluate(current)){
if (!gnode.isSummary() || !preserveHierarchy){
i.remove();
continue;
}
if (gnode.isSummary()&&preserveHierarchy) gnode.setFiltered(true);
}
}
}
if (preserveHierarchy){
//contruct a temporary tree for sorting and grouping
// if (parents==null||previous==null){
// System.out.println("null");
// }
if (gnode.getLevel()==1){
localList.add(gnode);
parents.clear();
}else{
if (previous.getLevel()<gnode.getLevel()){
parents.push(previous);
}else if (previous.getLevel()>=gnode.getLevel()){
while (parents.size()>=gnode.getLevel()) parents.pop();
}
((GraphicNode)parents.peek()).getChildren().add(gnode);
}
previous=gnode;
}
}
//remove parents without children
if (preserveHierarchy){
list.clear();
if (transformer.isShowEmptySummaries()){
if ("TaskUsage".equals(viewName)) filterBadBranches(localList);
}else filterEmptySummaries(localList,false);
}
if (sorting){
if (sorter1!=null)
sorter1.sortList(localList,new GraphicNodeComparator(sorter1,composition),preserveHierarchy);
if (!transformer.isNoneSorter())
sorter2.sortList(localList,new GraphicNodeComparator(sorter2,composition),preserveHierarchy);
}
if (grouping){