package org.erlide.ui.navigator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.xtext.ui.editor.outline.IOutlineNode; import org.eclipse.xtext.ui.editor.outline.IOutlineTreeProvider; import org.eclipse.xtext.ui.resource.IResourceSetProvider; import org.erlide.erlang.Function; import org.erlide.erlang.Module; import com.google.inject.Inject; public class ErlangContentProvider implements ITreeContentProvider { @Inject IOutlineTreeProvider outlineProvider; @Inject private IResourceSetProvider resourceSetProvider; @Inject private IWorkspace workspace; private IOutlineNode node; @Override public void dispose() { } @Override public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { } @Override public Object[] getElements(final Object inputElement) { System.out.println("i=" + inputElement); return node.getChildren().toArray(); } public EObject getModelForResource(final IFile file) { final URI uri = URI.createURI("platform:/resource/" + file.getProject().getName() + "/" + file.getProjectRelativePath()); final ResourceSet set = resourceSetProvider.get(file.getProject()); try { final Resource res = set.getResource(uri, true); if (res != null) { return res.getContents().get(0); } } catch (final Exception e) { } return null; } public IResource getResourceForModel(final EObject obj) { final URI uri = obj.eResource().getURI(); final String project = uri.segment(1); final IPath path = new Path(uri.path()).removeFirstSegments(2); return workspace.getRoot().getProject(project).findMember(path); } @Override public Object[] getChildren(final Object element) { System.out.println("c=" + element); if (element instanceof IFile) { final IFile file = (IFile) element; final Module module = (Module) getModelForResource(file); if (module != null) { return module.getForms().toArray(); } } if (element instanceof Function) { final Function function = (Function) element; return function.getClauses().toArray(); } return null; } @Override public Object getParent(final Object element) { if (element instanceof IResource) { return ((IResource) element).getParent(); } return null; } @Override public boolean hasChildren(final Object element) { System.out.println("C?=" + element); if (element instanceof IFile) { final IFile file = (IFile) element; final EObject model = getModelForResource(file); if (model instanceof Module) { final Module module = (Module) model; return !module.getForms().isEmpty(); } } if (element instanceof Function) { final Function function = (Function) element; return !function.getClauses().isEmpty(); } return false; } }