blob: 88e80d990aa65415e5dfcbde6db21f65197e3c97 [file] [log] [blame]
package org.eclipse.ui.texteditor;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.jface.util.Assert;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IMarkerDelta;
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.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* A marker annotation model whose underlying source of markers is
* a resource in the workspace.
* <p>
* This class may be instantiated; it is not intended to be subclassed.
* </p>
*/
public class ResourceMarkerAnnotationModel extends AbstractMarkerAnnotationModel {
/**
* Internal resource change listener.
*/
class ResourceChangeListener implements IResourceChangeListener {
/*
* @see IResourceChangeListener#resourceChanged
*/
public void resourceChanged(IResourceChangeEvent e) {
IResourceDelta delta= e.getDelta();
try {
if (delta != null)
delta.accept(fResourceDeltaVisitor);
} catch (CoreException x) {
handleCoreException(x, EditorMessages.getString("ResourceMarkerAnnotationModel.resourceChanged")); //$NON-NLS-1$
}
}
};
/**
* Internal resource delta visitor.
*/
class ResourceDeltaVisitor implements IResourceDeltaVisitor {
/*
* @see IResourceDeltaVisitor#visit
*/
public boolean visit(IResourceDelta delta) throws CoreException {
if (delta != null && fResource.equals(delta.getResource())) {
update(delta.getMarkerDeltas());
return false;
}
return true;
}
};
/** The workspace */
private IWorkspace fWorkspace;
/** The resource */
private IResource fResource;
/** The resource change listener */
private IResourceChangeListener fResourceChangeListener= new ResourceChangeListener();
/** The resource delta visitor */
private IResourceDeltaVisitor fResourceDeltaVisitor= new ResourceDeltaVisitor();
/**
* Creates a marker annotation model with the given resource as the source
* of the markers.
*
* @param resource the resource
*/
public ResourceMarkerAnnotationModel(IResource resource) {
Assert.isNotNull(resource);
fResource= resource;
fWorkspace= resource.getWorkspace();
}
/*
* @see AnnotationModel#isAcceptable
*/
protected boolean isAcceptable(IMarker marker) {
return marker != null && fResource.equals(marker.getResource());
}
/**
* Updates this model to the given marker deltas.
*
* @param markerDeltas the list of marker deltas
*/
private void update(IMarkerDelta[] markerDeltas) {
if (markerDeltas.length == 0)
return;
for (int i= 0; i < markerDeltas.length; i++) {
IMarkerDelta delta= markerDeltas[i];
switch (delta.getKind()) {
case IResourceDelta.ADDED :
addMarkerAnnotation(delta.getMarker());
break;
case IResourceDelta.REMOVED :
removeMarkerAnnotation(delta.getMarker());
break;
case IResourceDelta.CHANGED :
modifyMarkerAnnotation(delta.getMarker());
break;
}
}
fireModelChanged();
}
/*
* @see AbstractMarkerAnnotationModel#listenToMarkerChanges(boolean)
*/
protected void listenToMarkerChanges(boolean listen) {
if (listen)
fWorkspace.addResourceChangeListener(fResourceChangeListener);
else
fWorkspace.removeResourceChangeListener(fResourceChangeListener);
}
/*
* @see AbstractMarkerAnnotationModel#deleteMarkers(IMarker[])
*/
protected void deleteMarkers(final IMarker[] markers) throws CoreException {
fWorkspace.run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
for (int i= 0; i < markers.length; ++i) {
markers[i].delete();
}
}
}, null);
}
/*
* @see AbstractMarkerAnnotationModel#retrieveMarkers()
*/
protected IMarker[] retrieveMarkers() throws CoreException {
return fResource.findMarkers(IMarker.MARKER, true, IResource.DEPTH_ZERO);
}
}