/*******************************************************************************
* Copyright © 2012, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.edt.ide.ui.internal.editor;
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.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.edt.ide.core.model.EGLCore;
import org.eclipse.edt.ide.core.model.IClassFile;
import org.eclipse.edt.ide.ui.EDTUIPlugin;
import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel;
import org.eclipse.ui.texteditor.MarkerAnnotation;
public class ClassFileMarkerAnnotationModel extends AbstractMarkerAnnotationModel implements IResourceChangeListener {
private final IResource resource;
private final IClassFile classFile;
public ClassFileMarkerAnnotationModel(IResource resource, IClassFile classFile) {
this.resource = resource;
this.classFile = classFile;
}
@Override
protected IMarker[] retrieveMarkers() throws CoreException {
// BinaryReadOnlyFile doesn't support markers right now, but we'll check anyway in case it does in the future.
IMarker[] rootMarkers = resource.getWorkspace().getRoot().findMarkers(IMarker.MARKER, true, IResource.DEPTH_ZERO);
IMarker[] resourceMarkers = resource.findMarkers(IMarker.MARKER, true, IResource.DEPTH_ZERO);
if (rootMarkers.length == 0) {
return resourceMarkers;
}
if (resourceMarkers.length == 0) {
return rootMarkers;
}
IMarker[] all = new IMarker[resourceMarkers.length + rootMarkers.length];
System.arraycopy(resourceMarkers, 0, all, 0, resourceMarkers.length);
System.arraycopy(rootMarkers, 0, all, resourceMarkers.length, rootMarkers.length);
return all;
}
@Override
protected void deleteMarkers(final IMarker[] markers) throws CoreException {
resource.getWorkspace().run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
for (int i = 0; i < markers.length; i++) {
markers[i].delete();
}
}
}, null, IWorkspace.AVOID_UPDATE, null);
}
@Override
protected void listenToMarkerChanges(boolean listen) {
if (listen) {
resource.getWorkspace().addResourceChangeListener(this);
}
else {
resource.getWorkspace().removeResourceChangeListener(this);
}
}
@Override
protected boolean isAcceptable(IMarker marker) {
try {
return EGLCore.isReferencedBy(classFile, marker);
}
catch (CoreException ce) {
EDTUIPlugin.log(ce);
return false;
}
}
/**
* @see AbstractMarkerAnnotationModel#createMarkerAnnotation(IMarker)
*/
protected MarkerAnnotation createMarkerAnnotation(IMarker marker) {
return new EGLMarkerAnnotation(marker);
}
@Override
public void resourceChanged(IResourceChangeEvent event) {
IMarkerDelta[] deltas = event.findMarkerDeltas(null, true);
if (deltas != null && deltas.length > 0) {
boolean changed = false;
for (IMarkerDelta delta : deltas) {
try {
if (EGLCore.isReferencedBy(classFile, delta)) {
switch (delta.getKind()) {
case IResourceDelta.ADDED :
addMarkerAnnotation(delta.getMarker());
changed = true;
break;
case IResourceDelta.REMOVED :
removeMarkerAnnotation(delta.getMarker());
changed = true;
break;
case IResourceDelta.CHANGED:
modifyMarkerAnnotation(delta.getMarker());
changed = true;
break;
}
}
}
catch (CoreException ce) {
EDTUIPlugin.log(ce);
}
}
if (changed) {
fireModelChanged();
}
}
}
}