package org.bundlemaker.core.jdt.internal;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bundlemaker.core.jdt.content.JdtProjectContentProvider;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
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.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
final class InternalResourceChangedListener implements IResourceChangeListener {
/** - */
private final Map<IProject, List<JdtProjectContentProvider>> _project2provider;
/**
* <p>
* </p>
*
* @param activator
*/
public InternalResourceChangedListener(Map<IProject, List<JdtProjectContentProvider>> project2provider) {
Assert.isNotNull(project2provider);
_project2provider = project2provider;
}
//
public void resourceChanged(IResourceChangeEvent event) {
// // we are only interested in POST_CHANGE events
// if (event.getType() != IResourceChangeEvent.POST_CHANGE)
// return;
IResourceDelta rootDelta = event.getDelta();
// get the delta, if any, for the documentation directory
IResourceDeltaVisitor visitor = new InternalResourceDeltaVisitor();
//
if (rootDelta != null) {
try {
rootDelta.accept(visitor);
} catch (CoreException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
/**
* <p>
* </p>
*
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
private final class InternalResourceDeltaVisitor implements IResourceDeltaVisitor {
/**
* {@inheritDoc}
*/
public boolean visit(IResourceDelta delta) {
//
IResource eclipseResource = delta.getResource();
//
if (eclipseResource instanceof IProject
&& Activator.getInstance().getProject2ProviderMap().containsKey(eclipseResource)) {
if (delta.getKind() == IResourceDelta.REMOVED) {
Activator.getInstance().getProject2ProviderMap().remove(eclipseResource);
}
return true;
}
//
if (!(eclipseResource instanceof IFile)) {
return true;
}
//
for (Entry<IProject, List<JdtProjectContentProvider>> entry : InternalResourceChangedListener.this._project2provider
.entrySet()) {
//
if (!entry.getKey().isAccessible()) {
continue;
}
// we can use 'getFullPath' here (getFullPath always
// contains the project name)
if (entry.getKey().getFullPath().isPrefixOf(eclipseResource.getFullPath())) {
for (JdtProjectContentProvider jdtProjectContentProvider : entry.getValue()) {
if (delta.getKind() == IResourceDelta.ADDED) {
jdtProjectContentProvider.eclipseResourceAdded(eclipseResource);
} else if (delta.getKind() == IResourceDelta.REMOVED) {
jdtProjectContentProvider.eclipseResourceRemoved(eclipseResource);
} else if (delta.getKind() == IResourceDelta.CHANGED) {
jdtProjectContentProvider.eclipseResourceChanged(eclipseResource);
}
}
}
}
return true;
}
}
}