| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.ui.texteditor; |
| |
| |
| 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; |
| |
| import org.eclipse.jface.text.Assert; |
| |
| |
| |
| /** |
| * 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. |
| * |
| * @see IResourceChangeListener |
| */ |
| class ResourceChangeListener implements IResourceChangeListener { |
| /* |
| * @see IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) |
| */ |
| 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. |
| * |
| * @see IResourceDeltaVisitor |
| */ |
| class ResourceDeltaVisitor implements IResourceDeltaVisitor { |
| /* |
| * @see IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta) |
| */ |
| 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 AbstractMarkerAnnotationModel#isAcceptable(IMarker) |
| */ |
| protected boolean isAcceptable(IMarker marker) { |
| return marker != null && fResource.equals(marker.getResource()); |
| } |
| |
| /** |
| * Updates this model to the given marker deltas. |
| * |
| * @param markerDeltas the array of marker deltas |
| */ |
| protected 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); |
| } |
| |
| /** |
| * Returns the resource serving as the source of markers for this annotation model. |
| * |
| * @return the resource serving as the source of markers for this annotation model |
| * @since 2.0 |
| */ |
| protected IResource getResource() { |
| return fResource; |
| } |
| } |