package org.rubypeople.rdt.internal.ui.rubyeditor; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.text.Position; import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel; import org.rubypeople.rdt.core.IRubyScript; import org.rubypeople.rdt.internal.core.ExternalRubyScript; import org.rubypeople.rdt.internal.ui.RubyPlugin; public class ExternalFileRubyAnnotationModel extends AbstractMarkerAnnotationModel { private IWorkspace fWorkspace; private IRubyScript fScript; public ExternalFileRubyAnnotationModel(IRubyScript script) { fScript = script; fWorkspace= ResourcesPlugin.getWorkspace(); // TODO Grab all the markers from workspace root which match this file, and add annotaions for them? } 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, IWorkspace.AVOID_UPDATE, null); } protected boolean isAcceptable(IMarker marker) { return marker != null && marker.getResource().equals(getResource()) && getFileName(marker).equals(getFileName()); } private String getFileName(IMarker marker) { return marker.getAttribute("externalFileName", ""); // FIXME This is duplicated in RubyLineBreakpoint. Move this to an interface as a constant! } protected void listenToMarkerChanges(boolean listen) { // TODO Auto-generated method stub } protected IMarker[] retrieveMarkers() throws CoreException { IMarker[] markers = getResource().findMarkers(IMarker.MARKER, true, IResource.DEPTH_INFINITE); List<IMarker> filtered = new ArrayList<IMarker>(); for (int i = 0; i < markers.length; i++) { if (getFileName(markers[i]).equals(getFileName())) { filtered.add(markers[i]); } } return filtered.toArray(new IMarker[filtered.size()]); } private String getFileName() { if (fScript == null) return null; if (fScript instanceof ExternalRubyScript) { ExternalRubyScript script = (ExternalRubyScript) fScript; return script.getFile().getAbsolutePath(); } return fScript.getPath().toPortableString(); } private IResource getResource() { return ResourcesPlugin.getWorkspace().getRoot(); } }