package org.bndtools.utils.eclipse; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; public class CategorisedPrioritisedConfigurationElementTreeContentProvider implements ITreeContentProvider { private final SortedMap<ConfigurationElementCategory,List<IConfigurationElement>> data = new TreeMap<ConfigurationElementCategory,List<IConfigurationElement>>(); private final boolean flattenSingleCategory; public CategorisedPrioritisedConfigurationElementTreeContentProvider(boolean flattenSingleCategory) { this.flattenSingleCategory = flattenSingleCategory; } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { data.clear(); // Dump input into categories if (newInput instanceof IConfigurationElement[]) { IConfigurationElement[] array = (IConfigurationElement[]) newInput; for (IConfigurationElement element : array) categorise(element); } else if (newInput instanceof Collection) { @SuppressWarnings("unchecked") Collection<IConfigurationElement> coll = (Collection<IConfigurationElement>) newInput; for (IConfigurationElement element : coll) categorise(element); } // Sort within each category CategorisedConfigurationElementComparator comparator = new CategorisedConfigurationElementComparator(true); for (Entry<ConfigurationElementCategory,List<IConfigurationElement>> entry : data.entrySet()) { List<IConfigurationElement> list = entry.getValue(); Collections.sort(list, comparator); } } private void categorise(IConfigurationElement element) { ConfigurationElementCategory category = ConfigurationElementCategory.parse(element.getAttribute("category")); List<IConfigurationElement> list = data.get(category); if (list == null) { list = new LinkedList<IConfigurationElement>(); data.put(category, list); } list.add(element); } @Override public Object[] getElements(Object inputElement) { Object[] result; Set<ConfigurationElementCategory> keys = data.keySet(); if (keys.size() == 1 && flattenSingleCategory) { List<IConfigurationElement> elements = data.get(keys.iterator().next()); result = elements.toArray(); } else { result = keys.toArray(); } return result; } @Override public void dispose() {} @Override public Object[] getChildren(Object parentElement) { List<IConfigurationElement> list = data.get(parentElement); return list.toArray(); } @Override public Object getParent(Object element) { return null; } @Override public boolean hasChildren(Object element) { boolean result = false; if (element instanceof ConfigurationElementCategory) { List<IConfigurationElement> list = data.get(element); result = !list.isEmpty(); } return result; } }