package monolipse.ui.views; import monolipse.core.BooCore; import monolipse.core.IAssemblySource; import monolipse.core.foundation.ArrayUtilities; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ui.model.WorkbenchContentProvider; class BooExplorerContentProvider implements IStructuredContentProvider, ITreeContentProvider { ITreeContentProvider _delegate = new WorkbenchContentProvider(); public void inputChanged(Viewer v, Object oldInput, Object newInput) { _delegate.inputChanged(v, oldInput, newInput); } public void dispose() { _delegate.dispose(); } public Object getParent(Object element) { return _delegate.getParent(element); } public boolean hasChildren(Object parentElement) { if (BooCore.isAssemblySource(parentElement)) { return true; } if (parentElement instanceof ReferenceContainer) { try { return ((ReferenceContainer)parentElement).hasChildren(); } catch (CoreException e) { e.printStackTrace(); return false; } } return _delegate.hasChildren(parentElement); } public Object[] getElements(Object inputElement) { return getChildren(inputElement); } public Object[] getChildren(Object parentElement) { if (parentElement instanceof ReferenceContainer) { return getReferenceContainerChildren(parentElement); } IAssemblySource source = getAssemblySource(parentElement); if (null != source) { return getAssemblySourceChildren(source); } return _delegate.getChildren(parentElement); } private IAssemblySource getAssemblySource(Object parentElement) { if (parentElement instanceof IFolder) { try { return BooCore.getAssemblySource((IFolder) parentElement); } catch (CoreException e) { e.printStackTrace(); } } return null; } private Object[] getAssemblySourceChildren(IAssemblySource assemblySource) { Object[] children = _delegate.getChildren(assemblySource.getFolder()); return ArrayUtilities.prepend(Object.class, children, new ReferenceContainer(assemblySource)); } private Object[] getReferenceContainerChildren(Object parentElement) { try { return ((ReferenceContainer)parentElement).getChildren(); } catch (CoreException e) { e.printStackTrace(); return new Object[0]; } } }