package com.yoursway.introspection.internal.resources;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
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.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import com.yoursway.introspection.common.AbstractModelMonitoringView;
import com.yoursway.introspection.common.internal.Activator;
public class ResourcesModelView extends AbstractModelMonitoringView {
public class Change extends AbstractChange {
private final IResourceChangeEvent event;
public Change(IResourceChangeEvent event) {
this.event = event;
}
public IResourceChangeEvent getEvent() {
return event;
}
}
class ElementChangedListener implements IResourceChangeListener {
public void install() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
public void resourceChanged(final IResourceChangeEvent event) {
addElementChangedEvent(new Change(event));
}
public void uninstall() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
}
}
class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
private Object input;
public void dispose() {
}
public Object[] getChildren(Object parent) {
if (parent == input) {
Collection<Object> result = new ArrayList<Object>();
addRecentChangesTo(result);
result.add(theModel);
return result.toArray();
} else if (parent instanceof IContainer) {
IContainer p = (IContainer) parent;
try {
IResource[] children = p.members();
return children;
} catch (CoreException e) {
Activator.log(e);
}
} else if (parent instanceof Change) {
IResourceChangeEvent event = ((Change) parent).getEvent();
IResource resource = event.getResource();
IResourceDelta delta = event.getDelta();
if (resource != null && delta == null)
return new Object[] { resource };
if (delta != null)
return new Object[] { delta };
} else if (parent instanceof IResourceDelta) {
IResourceDelta delta = (IResourceDelta) parent;
Collection<IResourceDelta> result = new ArrayList<IResourceDelta>();
result.addAll(Arrays.asList(delta.getAffectedChildren()));
return result.toArray();
}
return NO_CHILDREN;
}
public Object[] getElements(Object parent) {
return getChildren(parent);
}
public Object getParent(Object child) {
if (child instanceof IResource) {
IResource modelElement = (IResource) child;
return modelElement.getParent();
} else if (child instanceof Change) {
return theInput;
}
return null;
}
public boolean hasChildren(Object parent) {
if (parent instanceof IContainer) {
IContainer p = (IContainer) parent;
try {
return p.members().length > 0;
} catch (CoreException e) {
Activator.log(e);
}
} else if (parent instanceof Change || parent instanceof IResource
|| parent instanceof IResourceDelta) {
return getChildren(parent).length > 0;
}
return false;
}
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
this.input = newInput;
}
}
class ViewLabelProvider extends BaseLabelProvider {
@Override
public Image getImage(Object element) {
return workbenchProvider.getImage(element);
}
@Override
public String getText(Object element) {
String className = element.getClass().getSimpleName();
if (element instanceof IResource) {
return className + ": " + workbenchProvider.getText(element);
} else if (element instanceof Change) {
Change change = (Change) element;
IResourceChangeEvent event = change.getEvent();
String typeName = ResourcesModelPresentationUtils.changeEventTypeNameToString(event);
return change.getOrdinal() + ") " + className + ": " + typeName + " at "
+ change.getTimeMillis();
} else if (element instanceof IResourceDelta) {
IResourceDelta delta = (IResourceDelta) element;
IResource modelElement = delta.getResource();
StringBuilder result = new StringBuilder();
result.append(ResourcesModelPresentationUtils.deltaKindToString(delta)).append(' ').append(
className).append(' ').append(modelElement.getClass().getSimpleName()).append(' ')
.append(modelElement.getName());
ResourcesModelPresentationUtils.appendDeltaFlags(result, delta);
return result.toString();
}
return element.getClass().getSimpleName() + " - " + element.toString();
}
}
private final ILabelProvider workbenchProvider = WorkbenchLabelProvider
.getDecoratingWorkbenchLabelProvider();
private final ElementChangedListener elementChangedListener = new ElementChangedListener();
protected IWorkspaceRoot theModel;
/**
* The constructor.
*/
public ResourcesModelView() {
}
@Override
public void dispose() {
super.dispose();
elementChangedListener.uninstall();
}
private void visit(IResourceDelta delta) {
IResource resource = delta.getResource();
reportChangedElement(resource);
visit(delta.getAffectedChildren());
}
private void visit(IResourceDelta[] addedChildren) {
for (int i = 0; i < addedChildren.length; i++) {
visit(addedChildren[i]);
}
}
@Override
protected void connectToModel() {
theModel = ResourcesPlugin.getWorkspace().getRoot();
elementChangedListener.install();
}
@Override
protected void findChangedItems(AbstractChange change) {
visit(((Change) change).getEvent().getDelta());
}
@Override
protected Object getModelRoot() {
return theModel;
}
@Override
protected void handleDoubleClick(Object firstElement) {
if (firstElement instanceof IFile) {
IFile file = (IFile) firstElement;
try {
IDE.openEditor(getSite().getPage(), file);
} catch (PartInitException e) {
e.printStackTrace();
}
}
}
@Override
protected void refreshModel() {
}
@Override
protected void setupTreeViewer(TreeViewer viewer) {
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
}
}