package tool.content;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.progress.UIJob;
import tool.ToolNavigatorActivator;
import tool.model.ToolPlan;
/**
* Provides the properties contained in a *.properties file as children of that
* file in a Common Navigator.
* @since 3.2
*/
public class PexContentProvider implements ITreeContentProvider,
IResourceChangeListener, IResourceDeltaVisitor {
private static final Object[] NO_CHILDREN = new Object[0];
private static final String PLAN_EXT = "pex"; //$NON-NLS-1$
private StructuredViewer viewer;
/**
* Create the PropertiesContentProvider instance.
*
* Adds the content provider as a resource change listener to track changes on disk.
*
*/
public PexContentProvider() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
/**
* Return the model elements for a Plan IFile or
* NO_CHILDREN for otherwise.
*/
@Override
public Object[] getChildren(Object parentElement) {
Object[] children = null;
if ((parentElement instanceof IFolder) && (ResourceTester.isPlanFolder((IFolder)parentElement))) {
IFolder planFolder = (IFolder)parentElement;
SupplierPlanFolder supplierFolder = new SupplierPlanFolder(planFolder);
StartClassMethod startClassMethod = null;
ToolPlan plan = ToolPlan.fetch(planFolder);;
if (plan == null){
System.out.println("Plan not found in cache: " + planFolder.getName());
} else {
//check for start class method
String startClass = plan.getStartClass();
String startMethod = plan.getStartMethod();
if (startClass != null && !startClass.isEmpty()){
startClassMethod = new StartClassMethod(startClass, startMethod, planFolder);
}
if (startClassMethod == null)
children = new Object[] {supplierFolder};
else
children = new Object[] {startClassMethod, supplierFolder};
}
} else if (parentElement instanceof SupplierPlanFolder) {
SupplierPlanFolder supplierFolder = (SupplierPlanFolder) parentElement;
children = supplierFolder.getChildren();
}
return children != null ? children : NO_CHILDREN;
}
@Override
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
@Override
public Object getParent(Object inputElement) {
if (inputElement instanceof IResource)
return ((IResource)inputElement).getParent();
else if (inputElement instanceof SupplierPlanFolder)
return ((SupplierPlanFolder)inputElement).getPlanFolder();
else
return null;
}
@Override
public boolean hasChildren(Object inputElement) {
if (inputElement instanceof SupplierPlanFolder)
return true;
try {
return ((inputElement instanceof IContainer) &&
((IContainer)inputElement).members().length > 0);
} catch (CoreException e) {
ToolNavigatorActivator.showError("Error in HasChildren.", e);
}
return false;
}
@Override
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
}
public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
if (oldInput != null && !oldInput.equals(newInput))
viewer = (StructuredViewer) aViewer;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
*/
@Override
public void resourceChanged(IResourceChangeEvent event) {
IResourceDelta delta = event.getDelta();
try {
delta.accept(this);
} catch (CoreException e) {
ToolNavigatorActivator.showError("Error in resourceChange.", e);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
*/
@Override
public boolean visit(IResourceDelta delta) {
IResource source = delta.getResource();
switch (source.getType()) {
case IResource.ROOT:
case IResource.PROJECT:
case IResource.FOLDER:
return true;
case IResource.FILE:
final IFile file = (IFile) source;
if (PLAN_EXT.equals(file.getFileExtension())) {
new UIJob("Update Plan Model in ToolViewer") { //$NON-NLS-1$
public IStatus runInUIThread(IProgressMonitor monitor) {
if (viewer != null && !viewer.getControl().isDisposed())
viewer.refresh(file);
return Status.OK_STATUS;
}
}.schedule();
}
return false;
}
return false;
}
}