/******************************************************************************* * Copyright (c) 2012 VMware, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VMware, Inc. - initial API and implementation *******************************************************************************/ /** * @author Terry Denny * @author Kaitlin Duck Sherwood */ package org.springframework.ide.eclipse.wizard.template; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.springframework.ide.eclipse.wizard.template.infrastructure.ITemplateElement; import org.springframework.ide.eclipse.wizard.template.infrastructure.Template; import org.springframework.ide.eclipse.wizard.template.infrastructure.TemplateCategory; import org.springsource.ide.eclipse.commons.content.core.util.Descriptor; public class TemplateContentProvider implements ITreeContentProvider { public TemplateContentProvider() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void dispose() { } public boolean hasChildren(Object element) { return element instanceof TemplateCategory && (((TemplateCategory) element).getChildren().size() > 0); } public Object getParent(Object element) { // return category if available return null; } public Object[] getElements(Object inputElement) { List<ITemplateElement> elements = new ArrayList<ITemplateElement>(); List<Object> templates; Template template; if ((inputElement instanceof List)) { templates = (List<Object>) inputElement; // create categories as needed and sort into tree Map<String, TemplateCategory> pathToCategory = new HashMap<String, TemplateCategory>(); for (Object obj : templates) { if ((obj instanceof Template)) { template = (Template) obj; Descriptor descriptor = template.getItem().getLocalDescriptor(); if (descriptor == null) { descriptor = template.getItem().getRemoteDescriptor(); } String categoryPath = descriptor.getCategory(); if (categoryPath == null) { elements.add(template); } else { String[] categoryPaths = categoryPath.split("/"); TemplateCategory lastCategory = null; String path = ""; for (String categoryName : categoryPaths) { boolean topLevel; if (path.length() == 0) { path = categoryName; topLevel = true; } else { path += "/" + categoryName; topLevel = false; } TemplateCategory category = pathToCategory.get(path); if (category == null) { category = new TemplateCategory(categoryName); pathToCategory.put(path, category); if (topLevel) { elements.add(category); } else if (lastCategory != null) { lastCategory.addChild(category); } } lastCategory = category; } if (lastCategory != null) { lastCategory.addChild(template); } } } } } return elements.toArray(); } public Object[] getChildren(Object parentElement) { if (parentElement instanceof TemplateCategory) { return ((TemplateCategory) parentElement).getChildren().toArray(); } return null; } }