package net.sourceforge.pmd.eclipse.ui.preferences.br; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RuleSet; import net.sourceforge.pmd.eclipse.util.Util; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; /** * @author Brian Remedios */ @SuppressWarnings("rawtypes") public class RuleSetTreeItemProvider implements ITreeContentProvider { private RuleFieldAccessor fieldAccessor; private final String groupDescription; private final Comparator comparator; private final Map<Object, RuleGroup> ruleGroups; /** * Constructor for RuleSetTreeItemProvider. * @param accessor RuleFieldAccessor * @param description String */ public RuleSetTreeItemProvider(RuleFieldAccessor accessor, String description, Comparator<?> theComparator) { fieldAccessor = accessor; groupDescription = description; comparator = theComparator; ruleGroups = new HashMap<Object, RuleGroup>(); } /** * * @param accessor RuleFieldAccessor */ public void accessor(RuleFieldAccessor accessor) { fieldAccessor = accessor; } private Object[] sort(Collection<Rule> ruleColl) { Object[] rules = ruleColl.toArray(); if (comparator == null) return rules; Arrays.sort(rules, comparator); return rules; } /** * * @param parentElement Object * @return Object[] * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object) */ public Object[] getChildren(Object parentElement) { if (parentElement instanceof RuleSet) { RuleSet ruleSet = (RuleSet) parentElement; return fieldAccessor == null ? sort(ruleSet.getRules()) : asRuleGroups(ruleSet.getRules()); } if (parentElement instanceof RuleGroup) { RuleGroup ruleGroup = (RuleGroup) parentElement; return ruleGroup.rules(); } return Util.EMPTY_ARRAY; } /** * Method asRuleGroups. * @param rules Collection<Rule> * @return RuleGroup[] */ private RuleGroup[] asRuleGroups(Collection<Rule> rules) { Iterator<Rule> iter = rules.iterator(); ruleGroups.clear(); while (iter.hasNext()) { Rule rule = iter.next(); Comparable<?> groupId = fieldAccessor.valueFor(rule); RuleGroup group = ruleGroups.get(groupId); if (group != null) { group.add(rule); } else { group = new RuleGroup( groupId, fieldAccessor.labelFor(rule), groupDescription ); group.add(rule); ruleGroups.put(groupId, group); } } RuleGroup[] groups = ruleGroups.values().toArray(new RuleGroup[ruleGroups.size()]); // TODO sort within groups for (RuleGroup group : groups) group.sortBy(comparator); Arrays.sort(groups); return groups; } private RuleGroup groupFor(Rule rule) { if (fieldAccessor == null) return null; Comparable<?> groupId = fieldAccessor.valueFor(rule); return ruleGroups.get(groupId); } /** * Return the effective parent of the element if we can figure it out. * * @param element Object * @return Object * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object) */ public Object getParent(Object element) { if (element instanceof RuleGroup) return null; if (element instanceof Rule) return groupFor((Rule)element); return null; } /** * Return whether the element has kids depending on what kind * of parent it might be. * * @param element Object * @return boolean * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object) */ public boolean hasChildren(Object element) { if (element instanceof RuleSet) { RuleSet ruleSet = (RuleSet) element; return ruleSet.getRules().size() > 0; } if (element instanceof RuleGroup) { return ((RuleGroup)element).hasRules(); } return false; } /** * Method getElements. * @param inputElement Object * @return Object[] * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object) */ public Object[] getElements(Object inputElement) { return getChildren(inputElement); } /** * Method inputChanged. * @param viewer Viewer * @param oldInput Object * @param newInput Object * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(Viewer, Object, Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void dispose() { // TODO Auto-generated method stub } }