/**
* Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below.
* 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:
* Cloudsmith
*
*/
/*
* generated by Xtext
*/
package org.cloudsmith.geppetto.pp.dsl.ui.outline;
import java.util.List;
import org.cloudsmith.geppetto.pp.AppendExpression;
import org.cloudsmith.geppetto.pp.Definition;
import org.cloudsmith.geppetto.pp.Expression;
import org.cloudsmith.geppetto.pp.HostClassDefinition;
import org.cloudsmith.geppetto.pp.ImportExpression;
import org.cloudsmith.geppetto.pp.NodeDefinition;
import org.cloudsmith.geppetto.pp.PuppetManifest;
import org.cloudsmith.geppetto.pp.ResourceBody;
import org.cloudsmith.geppetto.pp.ResourceExpression;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.ui.editor.outline.IOutlineNode;
import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider;
import com.google.common.collect.Lists;
/**
* customization of the default outline structure
*
*/
public class PPOutlineTreeProvider extends DefaultOutlineTreeProvider {
// @Inject
// // @OutlineLabelProvider
// private ILabelProvider labelProvider;
// private static List<EObject> NO_CHILDREN = null; // TODO: HACK WHILE MIGRATING TO XTEXT 2.0
// // This helper is injected as a private helper in AbstractLabelProvider, but is difficult
// // to use when mapping structural features.
// @Inject
// private IImageHelper imageHelper;
private static final Class<?>[] structuralClasses = {
HostClassDefinition.class, Definition.class, NodeDefinition.class, ResourceExpression.class,
AppendExpression.class, ImportExpression.class };
protected void _createChildren(IOutlineNode parentNode, Definition modelElement) {
for(EObject childElement : getRelevantChildren(modelElement.getStatements()))
createNode(parentNode, childElement);
}
protected void _createChildren(IOutlineNode parentNode, HostClassDefinition modelElement) {
for(EObject childElement : getRelevantChildren(modelElement.getStatements()))
createNode(parentNode, childElement);
}
protected void _createChildren(IOutlineNode parentNode, ImportExpression modelElement) {
for(EObject childElement : modelElement.getValues())
createNode(parentNode, childElement);
}
protected void _createChildren(IOutlineNode parentNode, NodeDefinition modelElement) {
for(EObject childElement : getRelevantChildren(modelElement.getStatements()))
createNode(parentNode, childElement);
}
protected void _createChildren(IOutlineNode parentNode, PuppetManifest modelElement) {
for(EObject childElement : getRelevantChildren(modelElement.getStatements()))
createNode(parentNode, childElement);
}
protected void _createChildren(IOutlineNode parentNode, ResourceExpression modelElement) {
for(EObject childElement : modelElement.getResourceData())
createNode(parentNode, childElement);
}
protected boolean _isLeaf(Definition modelElement) {
return false;
}
/**
* protected List<EObject> getChildren(EObject ele) {
* return NO_CHILDREN;
* }
*/
@Override
protected boolean _isLeaf(EObject ele) {
return true;
}
protected boolean _isLeaf(HostClassDefinition modelElement) {
return false;
}
protected boolean _isLeaf(ImportExpression ele) {
// a single import is represented by the import expression expression
return (ele.getValues().size() <= 1);
}
protected boolean _isLeaf(NodeDefinition modelElement) {
return false;
}
protected boolean _isLeaf(PuppetManifest ele) {
return false;
}
/**
* protected List<EObject> getChildren(ResourceBody ele) {
* return NO_CHILDREN;
* }
*/
protected boolean _isLeaf(ResourceBody ele) {
return true;
}
protected boolean _isLeaf(ResourceExpression ele) {
return ele.getResourceData().size() <= 1;
}
protected List<EObject> getRelevantChildren(List<Expression> ele) {
List<EObject> result = Lists.newArrayList();
TreeIterator<Object> sitor = EcoreUtil.getAllContents(ele, true);
while(sitor.hasNext()) {
Object o = sitor.next();
if(hasRelevantClass(o)) {
result.add((EObject) o);
sitor.prune();
}
}
return result;
}
private boolean hasRelevantClass(Object o) {
int limit = structuralClasses.length;
for(int i = 0; i < limit; i++)
if(structuralClasses[i].isAssignableFrom(o.getClass()))
return true;
return false;
}
}