/***************************************************************************** * Copyright (c) 2011 CEA LIST. * * 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: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.customization.properties.providers; import java.text.Collator; import java.text.RuleBasedCollator; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.eclipse.papyrus.infra.widgets.providers.AbstractFilteredContentProvider; import org.eclipse.papyrus.infra.widgets.providers.IStaticContentProvider; import org.eclipse.papyrus.views.properties.contexts.Context; import org.eclipse.papyrus.views.properties.contexts.DataContextElement; import org.eclipse.papyrus.views.properties.contexts.DataContextPackage; import org.eclipse.papyrus.views.properties.contexts.DataContextRoot; /** * A ContentProvider for retrieving the available DataContextElements * * @author Camille Letavernier */ public class DataContextElementContentProvider extends AbstractFilteredContentProvider implements IStaticContentProvider { private List<DataContextElement> elements; /** * * Constructor. * * @param element */ public DataContextElementContentProvider(DataContextElement element) { Context context = findContext(element); Set<Context> allContexts = new HashSet<Context>(); if(context != null) { getAllContexts(context, allContexts); } Set<DataContextElement> allElements = new HashSet<DataContextElement>(); for(Context ctx : allContexts) { for(DataContextRoot root : ctx.getDataContexts()) { getAllElements(root, allElements); } } elements = new LinkedList<DataContextElement>(allElements); Collections.sort(elements, new Comparator<DataContextElement>() { private Collator collator = RuleBasedCollator.getInstance(); public int compare(DataContextElement element1, DataContextElement element2) { String name1 = element1.getName(); String name2 = element2.getName(); if(name1 == null && name2 == null) { return 0; } if(name1 == null) { return -1; } if(name2 == null) { return 1; } return collator.compare(name1, name2); } }); showIfHasVisibleParent = true; } private void getAllElements(DataContextElement fromElement, Collection<DataContextElement> result) { if(result.contains(fromElement)) { return; } result.add(fromElement); if(fromElement instanceof DataContextPackage) { DataContextPackage fromPackage = (DataContextPackage)fromElement; for(DataContextElement element : fromPackage.getElements()) { getAllElements(element, result); } } } private void getAllContexts(Context fromContext, Collection<Context> result) { if(result.contains(fromContext)) { return; } result.add(fromContext); for(Context context : fromContext.getDependencies()) { getAllContexts(context, result); } } private Context findContext(DataContextElement element) { if(element.getPackage() == null) { return (Context)element.eContainer(); } return findContext(element.getPackage()); } public Object[] getElements() { return elements.toArray(new DataContextElement[elements.size()]); } public Object[] getElements(Object inputElement) { return getElements(); } }