001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.texteditor;
011:
012: import org.eclipse.core.resources.IMarker;
013: import org.eclipse.core.resources.IMarkerDelta;
014: import org.eclipse.core.resources.IResource;
015: import org.eclipse.core.resources.IResourceChangeEvent;
016: import org.eclipse.core.resources.IResourceChangeListener;
017: import org.eclipse.core.resources.IResourceDelta;
018: import org.eclipse.core.resources.IWorkspace;
019: import org.eclipse.core.resources.IWorkspaceRunnable;
020:
021: import org.eclipse.core.runtime.Assert;
022: import org.eclipse.core.runtime.CoreException;
023: import org.eclipse.core.runtime.IProgressMonitor;
024:
025: /**
026: * A marker annotation model whose underlying source of markers is
027: * a resource in the workspace.
028: * <p>
029: * This class may be instantiated; it is not intended to be subclassed.</p>
030: */
031: public class ResourceMarkerAnnotationModel extends
032: AbstractMarkerAnnotationModel {
033:
034: /**
035: * Internal resource change listener.
036: */
037: class ResourceChangeListener implements IResourceChangeListener {
038: /*
039: * @see IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
040: */
041: public void resourceChanged(IResourceChangeEvent e) {
042: IResourceDelta delta = e.getDelta();
043: if (delta != null && fResource != null) {
044: IResourceDelta child = delta.findMember(fResource
045: .getFullPath());
046: if (child != null)
047: update(child.getMarkerDeltas());
048: }
049: }
050: }
051:
052: /** The workspace. */
053: private IWorkspace fWorkspace;
054: /** The resource. */
055: private IResource fResource;
056: /** The resource change listener. */
057: private IResourceChangeListener fResourceChangeListener = new ResourceChangeListener();
058:
059: /**
060: * Creates a marker annotation model with the given resource as the source
061: * of the markers.
062: *
063: * @param resource the resource
064: */
065: public ResourceMarkerAnnotationModel(IResource resource) {
066: Assert.isNotNull(resource);
067: fResource = resource;
068: fWorkspace = resource.getWorkspace();
069: }
070:
071: /*
072: * @see AbstractMarkerAnnotationModel#isAcceptable(IMarker)
073: */
074: protected boolean isAcceptable(IMarker marker) {
075: return marker != null && fResource.equals(marker.getResource());
076: }
077:
078: /**
079: * Updates this model to the given marker deltas.
080: *
081: * @param markerDeltas the array of marker deltas
082: */
083: protected void update(IMarkerDelta[] markerDeltas) {
084:
085: if (markerDeltas.length == 0)
086: return;
087:
088: for (int i = 0; i < markerDeltas.length; i++) {
089: IMarkerDelta delta = markerDeltas[i];
090: switch (delta.getKind()) {
091: case IResourceDelta.ADDED:
092: addMarkerAnnotation(delta.getMarker());
093: break;
094: case IResourceDelta.REMOVED:
095: removeMarkerAnnotation(delta.getMarker());
096: break;
097: case IResourceDelta.CHANGED:
098: modifyMarkerAnnotation(delta.getMarker());
099: break;
100: }
101: }
102:
103: fireModelChanged();
104: }
105:
106: /*
107: * @see AbstractMarkerAnnotationModel#listenToMarkerChanges(boolean)
108: */
109: protected void listenToMarkerChanges(boolean listen) {
110: if (listen)
111: fWorkspace
112: .addResourceChangeListener(fResourceChangeListener);
113: else
114: fWorkspace
115: .removeResourceChangeListener(fResourceChangeListener);
116: }
117:
118: /*
119: * @see AbstractMarkerAnnotationModel#deleteMarkers(IMarker[])
120: */
121: protected void deleteMarkers(final IMarker[] markers)
122: throws CoreException {
123: fWorkspace.run(new IWorkspaceRunnable() {
124: public void run(IProgressMonitor monitor)
125: throws CoreException {
126: for (int i = 0; i < markers.length; ++i) {
127: markers[i].delete();
128: }
129: }
130: }, null, IWorkspace.AVOID_UPDATE, null);
131: }
132:
133: /*
134: * @see AbstractMarkerAnnotationModel#retrieveMarkers()
135: */
136: protected IMarker[] retrieveMarkers() throws CoreException {
137: return fResource.findMarkers(IMarker.MARKER, true,
138: IResource.DEPTH_ZERO);
139: }
140:
141: /**
142: * Returns the resource serving as the source of markers for this annotation model.
143: *
144: * @return the resource serving as the source of markers for this annotation model
145: * @since 2.0
146: */
147: protected IResource getResource() {
148: return fResource;
149: }
150: }
|