package org.objectstyle.wolips.ui.view;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceProxy;
import org.eclipse.core.resources.IResourceProxyVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IFileEditorInput;
import org.objectstyle.wolips.core.resources.IWOLipsResource;
import org.objectstyle.wolips.ui.UIPlugin;
public class RelatedContentProvider implements ITreeContentProvider {
private RelatedLabelProvider _labelProvider;
private Object _lastResource;
private Object[] _lastResultList;
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
// DO NOTHING
}
public void dispose() {
return;
}
public void setLabelProvider(RelatedLabelProvider labelProvider) {
_labelProvider = labelProvider;
}
public Object[] getElements(Object parent) {
Object actualParent = parent;
IWOLipsResource wolipsResource = null;
// MS: If we add the dependency it is a circular dependency, so that
// sucks ... We'll just do it Reflection-Style.
if (actualParent != null && actualParent.getClass().getName().equals("org.objectstyle.wolips.components.input.ComponentEditorFileEditorInput")) {
try {
actualParent = actualParent.getClass().getMethod("getFile", (Class[]) null).invoke(actualParent, (Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println("ViewContentProvider.getElements: " +
// parent);
}
if (actualParent instanceof IFileEditorInput) {
IFileEditorInput input = (IFileEditorInput) actualParent;
actualParent = input.getFile();
}
if (actualParent instanceof IFile) {
try {
// HACK AK: we should use sth more generic here
if ("java".equals(((IFile)actualParent).getFileExtension())) {
actualParent = JavaCore.createCompilationUnitFrom((IFile)actualParent);
}
} catch (Exception ex) {
UIPlugin.getDefault().log(ex);
}
}
if (actualParent instanceof IMember) {
actualParent = ((IMember) actualParent).getCompilationUnit();
}
if (actualParent instanceof IAdaptable) {
wolipsResource = (IWOLipsResource)((IAdaptable)actualParent).getAdapter(IWOLipsResource.class);
// getViewer().setInput(wolipsResource);
}
Object[] resultList;
if (_lastResource != null && wolipsResource != null && _lastResource.equals(wolipsResource)) {
resultList = _lastResultList;
}
else {
List<IResource> result = new LinkedList<IResource>();
if (wolipsResource != null) {
try {
List<IResource> list = wolipsResource.getRelatedResources();
result.addAll(list);
} catch (Exception e) {
UIPlugin.getDefault().log(e);
}
} else if (actualParent != null && actualParent instanceof IResource) {
try {
final IResource resource = (IResource) actualParent;
final List<IResource> list = new ArrayList<IResource>();
IContainer lproj = resource.getParent();
if (lproj != null && "lprog".equals(lproj.getFileExtension())) {
IContainer p = lproj.getParent();
p.accept(new IResourceProxyVisitor() {
public boolean visit(IResourceProxy proxy) throws CoreException {
if (proxy.getName().endsWith(".lproj")) {
IContainer f = (IContainer) proxy.requestResource();
IResource m = f.findMember(resource.getName());
if (m != null) {
list.add(m);
}
}
return true;
}
}, IResource.DEPTH_ONE);
result.addAll(list);
}
} catch (Exception e) {
UIPlugin.getDefault().log(e);
}
}
resultList = result.toArray();
}
_lastResource = wolipsResource;
_lastResultList = resultList;
_labelProvider.setResultList(resultList);
return resultList;
}
RelatedContentProvider() {
super();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
public Object[] getChildren(Object parentElement) {
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
public Object getParent(Object element) {
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
public boolean hasChildren(Object element) {
return false;
}
}