package org.bndtools.core.ui.wizards.shared; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.bndtools.templating.Category; import org.bndtools.templating.Template; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; public class RepoTemplateContentProvider implements ITreeContentProvider { private static final Object[] EMPTY_ARRAY = new Object[0]; private final boolean flat; private Object input; private Object[] roots; public RepoTemplateContentProvider(boolean flat) { this.flat = flat; } @Override public void dispose() {} @SuppressWarnings("unchecked") private void recalculateRoots() { Collection<Template> templates; if (input instanceof Object[]) { templates = Arrays.asList((Template[]) input); } else if (input instanceof Collection) { templates = (Collection<Template>) input; } else { templates = Collections.emptyList(); } if (flat) { roots = templates.toArray(); } else { List<Category> categories = Category.categorise(templates); roots = categories.toArray(); } } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.input = newInput; recalculateRoots(); } public boolean isFlat() { return flat; } @Override public Object[] getElements(Object input) { return roots; } @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof Category) { Collection<Template> templates = ((Category) parentElement).getTemplates(); return templates.toArray(); } return EMPTY_ARRAY; } @Override public Object getParent(Object element) { return null; } @Override public boolean hasChildren(Object element) { if (element instanceof Category) { return !((Category) element).getTemplates().isEmpty(); } return false; } public Template getFirstTemplate() { Template result = null; if (roots != null && roots.length > 0) { if (roots[0] instanceof Category) { Category cat = (Category) roots[0]; Iterator<Template> templateIter = cat.getTemplates().iterator(); if (templateIter.hasNext()) result = templateIter.next(); } } return result; } }