/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.functions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.ISourceReference;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.core.ExternalSourceModule;
import org.eclipse.dltk.internal.ui.StandardModelElementContentProvider;
import org.eclipse.php.internal.ui.Logger;
public class PHPFunctionsContentProvider extends StandardModelElementContentProvider {
public PHPFunctionsContentProvider() {
super(true);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.internal.ui.StandardModelElementContentProvider#
* getChildren (java.lang.Object)
*/
@Override
public Object[] getChildren(Object element) {
// handle the project fragment used for containing the language model
if (element instanceof IProjectFragment[]) {
IProjectFragment[] fragments = (IProjectFragment[]) element;
List<Object> children = new ArrayList<>();
// Create the constant node that will aggregate all of the
// PHP
// constants
ConstantNode constantNode = new ConstantNode();
children.add(constantNode);
for (IProjectFragment fragment : fragments) {
try {
Object[] projectFragmentContent = getProjectFragmentContent(fragment);
for (Object modelElement : projectFragmentContent) {
if (modelElement instanceof ExternalSourceModule) {
IModelElement[] externalSourceModuleChildren = ((ExternalSourceModule) modelElement)
.getChildren();
constantNode.addSourceModuleChildren(externalSourceModuleChildren);
// filter the constants from the main view
IModelElement[] elements = filterConstants(externalSourceModuleChildren);
children.addAll(Arrays.asList(elements));
}
}
} catch (ModelException e) {
Logger.logException(e);
}
}
Object[] array = children.toArray(new Object[children.size()]);
return array;
// handle all method references
} else if (element instanceof ISourceReference) {
ISourceReference source = ((ISourceReference) element);
return super.getChildren(source);
} else if (element instanceof ConstantNode) {
return ((ConstantNode) element).getChildren();
}
return NO_CHILDREN;
}
/**
* Filter the constants from the main view (will appear under the constants
* node)
*
* @param externalSourceModuleChildren
* @return
*/
private IModelElement[] filterConstants(IModelElement[] externalSourceModuleChildren) {
List<IModelElement> filteredList = new ArrayList<>();
for (IModelElement modelElement : externalSourceModuleChildren) {
if (!ConstantNode.isConstant(modelElement)) {
filteredList.add(modelElement);
}
}
return filteredList.toArray(new IModelElement[filteredList.size()]);
}
@Override
public boolean hasChildren(Object element) {
// do not show children for methods
if (element instanceof IModelElement && ((IModelElement) element).getElementType() == IModelElement.METHOD) {
return false;
}
return super.hasChildren(element);
}
}