package net.sourceforge.pmd.eclipse.ui.views.ast; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Set; import net.sourceforge.pmd.lang.ast.AbstractNode; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; import net.sourceforge.pmd.lang.java.ast.Comment; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; /** * * @author Brian Remedios */ public class ASTContentProvider implements ITreeContentProvider { private boolean includeImports; private boolean includeComments; // private Set<Class<?>> hiddenNodeTypes; private static final Comparator<Node> ByLineNumber = new Comparator<Node>() { public int compare(Node a, Node b) { return a.getBeginLine() - b.getBeginLine(); } }; public ASTContentProvider(boolean includeImportsFlag, boolean includeCommentsFlag) { this(Collections.EMPTY_SET); includeImports = includeImportsFlag; includeComments = includeCommentsFlag; } public ASTContentProvider(Set<Class<?>> theHiddenNodeTypes) { // hiddenNodeTypes = theHiddenNodeTypes; } public void includeImports(boolean flag) { includeImports = flag; } public void includeComments(boolean flag) { includeComments = flag; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } private List<Node> withoutHiddenOnes(Object parent) { List<Node> kids = new ArrayList<Node>(); if (includeComments && parent instanceof ASTCompilationUnit) { // if (!hiddenNodeTypes.contains(Comment.class)) { List<Comment> comments = ((ASTCompilationUnit)parent).getComments(); kids.addAll(comments); // } } AbstractNode node = (AbstractNode)parent; int kidCount = node.jjtGetNumChildren(); for (int i=0; i<kidCount; i++) { Node kid = node.jjtGetChild(i); // if (hiddenNodeTypes.contains(kid.getClass())) continue; if (!includeImports && kid instanceof ASTImportDeclaration) { continue; } if (!includeComments && kid instanceof Comment) { continue; } kids.add(kid); } Collections.sort(kids, ByLineNumber); return kids; } public Object[] getElements(Object inputElement) { AbstractNode parent = (AbstractNode)inputElement; return withoutHiddenOnes(parent).toArray(); } public Object[] getChildren(Object parentElement) { AbstractNode parent = (AbstractNode)parentElement; return withoutHiddenOnes(parent).toArray(); } public Object getParent(Object element) { AbstractNode parent = (AbstractNode)element; return parent.jjtGetParent(); } public boolean hasChildren(Object element) { AbstractNode parent = (AbstractNode)element; return parent.jjtGetNumChildren() > 0; } public static void setupSorter(TableViewer viewer) { } }