/*****************************************************************************
* Copyright (c) 2010 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.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.papyrus.infra.widgets.providers.IHierarchicContentProvider;
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.Property;
/**
* A Content provider to retrieve all available properties in the current
* contexts
*
* @author Camille Letavernier
*/
public class PropertyContentProvider extends AbstractContextualContentProvider implements IHierarchicContentProvider {
/**
* Constructor.
*
* @param source
* The source from which the contexts will be retrieved
*/
public PropertyContentProvider(EObject source) {
super(source);
}
public Object[] getElements() {
return contexts.toArray();
}
public Object[] getElements(Object inputElement) {
return getElements();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public Object[] getChildren(Object parentElement) {
if(parentElement instanceof Context) {
Context parent = (Context)parentElement;
return parent.getDataContexts().toArray();
} else if(parentElement instanceof DataContextElement) {
List result = new LinkedList();
if(parentElement instanceof DataContextPackage) {
DataContextPackage contextPackage = (DataContextPackage)parentElement;
result.addAll(contextPackage.getElements());
}
DataContextElement element = (DataContextElement)parentElement;
result.addAll(element.getProperties());
Iterator<?> it = result.iterator();
while(it.hasNext()) {
Object value = it.next();
if(isEmpty(value)) {
it.remove();
}
}
return result.toArray();
} else {
return new Object[0];
}
}
protected boolean isEmpty(Object element) {
if(element instanceof DataContextPackage) {
DataContextPackage dcPackage = (DataContextPackage)element;
return dcPackage.getElements().isEmpty() && dcPackage.getProperties().isEmpty();
} else if(element instanceof DataContextElement) {
return ((DataContextElement)element).getProperties().isEmpty();
} else if(element instanceof Context) {
return ((Context)element).getDataContexts().isEmpty();
}
return false;
}
public Object getParent(Object element) {
if(element instanceof Property) {
return ((Property)element).getContextElement();
} else if(element instanceof DataContextElement) {
return ((DataContextElement)element).getPackage();
} else {
return null;
}
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public boolean isValidValue(Object element) {
return element instanceof Property;
}
}