import net.sourceforge.phpdt.core.IOpenable;
import net.sourceforge.phpdt.core.IProblemRequestor;
import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.core.JavaCore;
import net.sourceforge.phpdt.core.compiler.IProblem;
import net.sourceforge.phpdt.internal.ui.PHPStatusConstants;
import net.sourceforge.phpdt.internal.ui.PHPUIStatus;
import net.sourceforge.phpdt.internal.ui.text.java.IProblemRequestorExtension;
import net.sourceforge.phpdt.ui.PreferenceConstants;
import net.sourceforge.phpdt.ui.text.JavaTextTools;
-import net.sourceforge.phpeclipse.PHPCore;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.AnnotationModelEvent;
+import org.eclipse.jface.text.source.IAnnotationAccessExtension;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.IAnnotationModelListener;
import org.eclipse.jface.text.source.IAnnotationModelListenerExtension;
+import org.eclipse.jface.text.source.IAnnotationPresentation;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.ListenerList;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.editors.text.FileDocumentProvider;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel;
+import org.eclipse.ui.texteditor.AnnotationPreference;
+import org.eclipse.ui.texteditor.AnnotationPreferenceLookup;
import org.eclipse.ui.texteditor.MarkerAnnotation;
import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModel;
/*
* @see AnnotationModel#addAnnotation(Annotation, Position, boolean)
*/
- protected void addAnnotation(Annotation annotation, Position position, boolean fireModelChanged) {
+ protected void addAnnotation(Annotation annotation, Position position, boolean fireModelChanged) throws BadLocationException {
super.addAnnotation(annotation, position, fireModelChanged);
Object cached = fReverseMap.get(position);
return new Position(start, length);
}
-
/*
* @see IProblemRequestor#endReporting()
*/
public void endReporting() {
if (!isActive())
return;
-
+
if (fProgressMonitor != null && fProgressMonitor.isCanceled())
return;
-
- boolean isCanceled = false;
- boolean temporaryProblemsChanged = false;
- fPreviouslyOverlaid = fCurrentlyOverlaid;
- fCurrentlyOverlaid = new ArrayList();
-
+
+
+ boolean isCanceled= false;
+ boolean temporaryProblemsChanged= false;
+
synchronized (fAnnotations) {
+
+ fPreviouslyOverlaid= fCurrentlyOverlaid;
+ fCurrentlyOverlaid= new ArrayList();
if (fGeneratedAnnotations.size() > 0) {
- temporaryProblemsChanged = true;
+ temporaryProblemsChanged= true;
removeAnnotations(fGeneratedAnnotations, false, true);
fGeneratedAnnotations.clear();
}
-
+
if (fCollectedProblems != null && fCollectedProblems.size() > 0) {
-
- Iterator e = fCollectedProblems.iterator();
+
+ ICompilationUnit cu= getWorkingCopy(fInput);
+ Iterator e= fCollectedProblems.iterator();
while (e.hasNext()) {
-
- IProblem problem = (IProblem) e.next();
-
+
+ IProblem problem= (IProblem) e.next();
+
if (fProgressMonitor != null && fProgressMonitor.isCanceled()) {
- isCanceled = true;
+ isCanceled= true;
break;
}
-
- Position position = createPositionFromProblem(problem);
+
+ Position position= createPositionFromProblem(problem);
if (position != null) {
-
- ProblemAnnotation annotation = new ProblemAnnotation(problem);
- overlayMarkers(position, annotation);
- fGeneratedAnnotations.add(annotation);
- addAnnotation(annotation, position, false);
-
- temporaryProblemsChanged = true;
+ try {
+ ProblemAnnotation annotation= new ProblemAnnotation(problem, cu);
+ addAnnotation(annotation, position, false);
+ overlayMarkers(position, annotation);
+ fGeneratedAnnotations.add(annotation);
+
+ temporaryProblemsChanged= true;
+ } catch (BadLocationException x) {
+ // ignore invalid position
+ }
}
}
-
+
fCollectedProblems.clear();
}
-
+
removeMarkerOverlays(isCanceled);
fPreviouslyOverlaid.clear();
- fPreviouslyOverlaid = null;
+ fPreviouslyOverlaid= null;
}
-
+
if (temporaryProblemsChanged)
- fireModelChanged(new CompilationUnitAnnotationModelEvent(this, getResource(), false));
+ fireModelChanged();
}
+ /*
+ * @see IProblemRequestor#endReporting()
+ */
+// public void endReporting() {
+// if (!isActive())
+// return;
+//
+// if (fProgressMonitor != null && fProgressMonitor.isCanceled())
+// return;
+//
+// boolean isCanceled = false;
+// boolean temporaryProblemsChanged = false;
+// fPreviouslyOverlaid = fCurrentlyOverlaid;
+// fCurrentlyOverlaid = new ArrayList();
+//
+// synchronized (fAnnotations) {
+//
+// if (fGeneratedAnnotations.size() > 0) {
+// temporaryProblemsChanged = true;
+// removeAnnotations(fGeneratedAnnotations, false, true);
+// fGeneratedAnnotations.clear();
+// }
+//
+// if (fCollectedProblems != null && fCollectedProblems.size() > 0) {
+//
+// Iterator e = fCollectedProblems.iterator();
+// while (e.hasNext()) {
+//
+// IProblem problem = (IProblem) e.next();
+//
+// if (fProgressMonitor != null && fProgressMonitor.isCanceled()) {
+// isCanceled = true;
+// break;
+// }
+//
+// Position position = createPositionFromProblem(problem);
+// if (position != null) {
+//
+// ProblemAnnotation annotation = new ProblemAnnotation(problem);
+// overlayMarkers(position, annotation);
+// fGeneratedAnnotations.add(annotation);
+// addAnnotation(annotation, position, false);
+//
+// temporaryProblemsChanged = true;
+// }
+// }
+//
+// fCollectedProblems.clear();
+// }
+//
+// removeMarkerOverlays(isCanceled);
+// fPreviouslyOverlaid.clear();
+// fPreviouslyOverlaid = null;
+// }
+//
+// if (temporaryProblemsChanged)
+// fireModelChanged(new CompilationUnitAnnotationModelEvent(this, getResource(), false));
+// }
private Object getAnnotations(Position position) {
return fReverseMap.get(position);
}
/**
- * Annotation representating an <code>IProblem</code>.
- */
- static protected class ProblemAnnotation extends Annotation implements IJavaAnnotation {
-
- // private static Image fgQuickFixImage;
- // private static Image fgQuickFixErrorImage;
- // private static boolean fgQuickFixImagesInitialized = false;
-
- private List fOverlaids;
- private IProblem fProblem;
- private Image fImage;
- // private boolean fQuickFixImagesInitialized = false;
- private AnnotationType fType;
-
- public ProblemAnnotation(IProblem problem) {
-
- fProblem = problem;
- setLayer(MarkerAnnotation.PROBLEM_LAYER + 1);
-
- if (IProblem.Task == fProblem.getID())
- fType = AnnotationType.TASK;
- else if (fProblem.isWarning())
- fType = AnnotationType.WARNING;
- else
- fType = AnnotationType.ERROR;
- }
-
- private void initializeImages() {
- // http://bugs.eclipse.org/bugs/show_bug.cgi?id=18936
- // if (!fQuickFixImagesInitialized) {
- // if (indicateQuixFixableProblems() && JavaCorrectionProcessor.hasCorrections(fProblem.getID())) {
- // if (!fgQuickFixImagesInitialized) {
- // fgQuickFixImage = JavaPluginImages.get(JavaPluginImages.IMG_OBJS_FIXABLE_PROBLEM);
- // fgQuickFixErrorImage = JavaPluginImages.get(JavaPluginImages.IMG_OBJS_FIXABLE_ERROR);
- // fgQuickFixImagesInitialized = true;
- // }
- // if (fType == AnnotationType.ERROR)
- // fImage = fgQuickFixErrorImage;
- // else
- // fImage = fgQuickFixImage;
- // }
- // fQuickFixImagesInitialized = true;
- // }
- }
-
- private boolean indicateQuixFixableProblems() {
- return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_CORRECTION_INDICATION);
- }
-
- /*
- * @see Annotation#paint
- */
- public void paint(GC gc, Canvas canvas, Rectangle r) {
- initializeImages();
- if (fImage != null)
- drawImage(fImage, gc, canvas, r, SWT.CENTER, SWT.TOP);
- }
-
- /*
- * @see IJavaAnnotation#getImage(Display)
- */
- public Image getImage(Display display) {
- initializeImages();
- return fImage;
- }
-
- /*
- * @see IJavaAnnotation#getMessage()
- */
- public String getMessage() {
- return fProblem.getMessage();
- }
-
- /*
- * @see IJavaAnnotation#isTemporary()
- */
- public boolean isTemporary() {
- return true;
- }
-
- /*
- * @see IJavaAnnotation#getArguments()
- */
- public String[] getArguments() {
- return isProblem() ? fProblem.getArguments() : null;
- }
-
- /*
- * @see IJavaAnnotation#getId()
- */
- public int getId() {
- return isProblem() ? fProblem.getID() : -1;
- }
-
- /*
- * @see IJavaAnnotation#isProblem()
- */
- public boolean isProblem() {
- return fType == AnnotationType.WARNING || fType == AnnotationType.ERROR;
- }
-
- /*
- * @see IJavaAnnotation#isRelevant()
- */
- public boolean isRelevant() {
- return true;
- }
-
- /*
- * @see IJavaAnnotation#hasOverlay()
- */
- public boolean hasOverlay() {
- return false;
- }
-
- /*
- * @see IJavaAnnotation#addOverlaid(IJavaAnnotation)
- */
- public void addOverlaid(IJavaAnnotation annotation) {
- if (fOverlaids == null)
- fOverlaids = new ArrayList(1);
- fOverlaids.add(annotation);
- }
-
- /*
- * @see IJavaAnnotation#removeOverlaid(IJavaAnnotation)
- */
- public void removeOverlaid(IJavaAnnotation annotation) {
- if (fOverlaids != null) {
- fOverlaids.remove(annotation);
- if (fOverlaids.size() == 0)
- fOverlaids = null;
- }
- }
-
- /*
- * @see IJavaAnnotation#getOverlaidIterator()
- */
- public Iterator getOverlaidIterator() {
- if (fOverlaids != null)
- return fOverlaids.iterator();
- return null;
- }
-
- public AnnotationType getAnnotationType() {
- return fType;
- }
- };
+ * Annotation representating an <code>IProblem</code>.
+ */
+ static protected class ProblemAnnotation extends Annotation implements IJavaAnnotation, IAnnotationPresentation {
+
+ private static final String SPELLING_ANNOTATION_TYPE= "org.eclipse.ui.workbench.texteditor.spelling";
+
+ //XXX: To be fully correct these constants should be non-static
+ /**
+ * The layer in which task problem annotations are located.
+ */
+ private static final int TASK_LAYER;
+ /**
+ * The layer in which info problem annotations are located.
+ */
+ private static final int INFO_LAYER;
+ /**
+ * The layer in which warning problem annotations representing are located.
+ */
+ private static final int WARNING_LAYER;
+ /**
+ * The layer in which error problem annotations representing are located.
+ */
+ private static final int ERROR_LAYER;
+
+ static {
+ AnnotationPreferenceLookup lookup= EditorsUI.getAnnotationPreferenceLookup();
+ TASK_LAYER= computeLayer("org.eclipse.ui.workbench.texteditor.task", lookup); //$NON-NLS-1$
+ INFO_LAYER= computeLayer("net.sourceforge.phpdt.ui.info", lookup); //$NON-NLS-1$
+ WARNING_LAYER= computeLayer("net.sourceforge.phpdt.ui.warning", lookup); //$NON-NLS-1$
+ ERROR_LAYER= computeLayer("net.sourceforge.phpdt.ui.error", lookup); //$NON-NLS-1$
+ }
+
+ private static int computeLayer(String annotationType, AnnotationPreferenceLookup lookup) {
+ Annotation annotation= new Annotation(annotationType, false, null);
+ AnnotationPreference preference= lookup.getAnnotationPreference(annotation);
+ if (preference != null)
+ return preference.getPresentationLayer() + 1;
+ else
+ return IAnnotationAccessExtension.DEFAULT_LAYER + 1;
+ }
+
+// private static Image fgQuickFixImage;
+// private static Image fgQuickFixErrorImage;
+// private static boolean fgQuickFixImagesInitialized= false;
+
+ private ICompilationUnit fCompilationUnit;
+ private List fOverlaids;
+ private IProblem fProblem;
+ private Image fImage;
+ private boolean fQuickFixImagesInitialized= false;
+ private int fLayer= IAnnotationAccessExtension.DEFAULT_LAYER;
+
+ public ProblemAnnotation(IProblem problem, ICompilationUnit cu) {
+
+ fProblem= problem;
+ fCompilationUnit= cu;
+
+// if (SpellProblem.Spelling == fProblem.getID()) {
+// setType(SPELLING_ANNOTATION_TYPE);
+// fLayer= WARNING_LAYER;
+// } else
+ if (IProblem.Task == fProblem.getID()) {
+ setType(JavaMarkerAnnotation.TASK_ANNOTATION_TYPE);
+ fLayer= TASK_LAYER;
+ } else if (fProblem.isWarning()) {
+ setType(JavaMarkerAnnotation.WARNING_ANNOTATION_TYPE);
+ fLayer= WARNING_LAYER;
+ } else if (fProblem.isError()) {
+ setType(JavaMarkerAnnotation.ERROR_ANNOTATION_TYPE);
+ fLayer= ERROR_LAYER;
+ } else {
+ setType(JavaMarkerAnnotation.INFO_ANNOTATION_TYPE);
+ fLayer= INFO_LAYER;
+ }
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.IAnnotationPresentation#getLayer()
+ */
+ public int getLayer() {
+ return fLayer;
+ }
+
+ private void initializeImages() {
+ // http://bugs.eclipse.org/bugs/show_bug.cgi?id=18936
+// if (!fQuickFixImagesInitialized) {
+// if (isProblem() && indicateQuixFixableProblems() && JavaCorrectionProcessor.hasCorrections(this)) { // no light bulb for tasks
+// if (!fgQuickFixImagesInitialized) {
+// fgQuickFixImage= JavaPluginImages.get(JavaPluginImages.IMG_OBJS_FIXABLE_PROBLEM);
+// fgQuickFixErrorImage= JavaPluginImages.get(JavaPluginImages.IMG_OBJS_FIXABLE_ERROR);
+// fgQuickFixImagesInitialized= true;
+// }
+// if (JavaMarkerAnnotation.ERROR_ANNOTATION_TYPE.equals(getType()))
+// fImage= fgQuickFixErrorImage;
+// else
+// fImage= fgQuickFixImage;
+// }
+// fQuickFixImagesInitialized= true;
+// }
+ }
+
+ private boolean indicateQuixFixableProblems() {
+ return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_CORRECTION_INDICATION);
+ }
+
+ /*
+ * @see Annotation#paint
+ */
+ public void paint(GC gc, Canvas canvas, Rectangle r) {
+ initializeImages();
+ if (fImage != null)
+ drawImage(fImage, gc, canvas, r, SWT.CENTER, SWT.TOP);
+ }
+
+ /*
+ * @see IJavaAnnotation#getImage(Display)
+ */
+ public Image getImage(Display display) {
+ initializeImages();
+ return fImage;
+ }
+
+ /*
+ * @see IJavaAnnotation#getMessage()
+ */
+ public String getText() {
+ return fProblem.getMessage();
+ }
+
+ /*
+ * @see IJavaAnnotation#getArguments()
+ */
+ public String[] getArguments() {
+ return isProblem() ? fProblem.getArguments() : null;
+ }
+
+ /*
+ * @see IJavaAnnotation#getId()
+ */
+ public int getId() {
+ return fProblem.getID();
+ }
+
+ /*
+ * @see IJavaAnnotation#isProblem()
+ */
+ public boolean isProblem() {
+ String type= getType();
+ return JavaMarkerAnnotation.WARNING_ANNOTATION_TYPE.equals(type) ||
+ JavaMarkerAnnotation.ERROR_ANNOTATION_TYPE.equals(type) ||
+ SPELLING_ANNOTATION_TYPE.equals(type);
+ }
+
+ /*
+ * @see IJavaAnnotation#hasOverlay()
+ */
+ public boolean hasOverlay() {
+ return false;
+ }
+
+ /*
+ * @see org.eclipse.jdt.internal.ui.javaeditor.IJavaAnnotation#getOverlay()
+ */
+ public IJavaAnnotation getOverlay() {
+ return null;
+ }
+
+ /*
+ * @see IJavaAnnotation#addOverlaid(IJavaAnnotation)
+ */
+ public void addOverlaid(IJavaAnnotation annotation) {
+ if (fOverlaids == null)
+ fOverlaids= new ArrayList(1);
+ fOverlaids.add(annotation);
+ }
+
+ /*
+ * @see IJavaAnnotation#removeOverlaid(IJavaAnnotation)
+ */
+ public void removeOverlaid(IJavaAnnotation annotation) {
+ if (fOverlaids != null) {
+ fOverlaids.remove(annotation);
+ if (fOverlaids.size() == 0)
+ fOverlaids= null;
+ }
+ }
+
+ /*
+ * @see IJavaAnnotation#getOverlaidIterator()
+ */
+ public Iterator getOverlaidIterator() {
+ if (fOverlaids != null)
+ return fOverlaids.iterator();
+ return null;
+ }
+
+ /*
+ * @see org.eclipse.jdt.internal.ui.javaeditor.IJavaAnnotation#getCompilationUnit()
+ */
+ public ICompilationUnit getCompilationUnit() {
+ return fCompilationUnit;
+ }
+ }
+
+
/**
* Internal structure for mapping positions to some value.
* The reason for this specific structure is that positions can
* @param file the file from which to create the compilation unit
*/
protected ICompilationUnit createCompilationUnit(IFile file) {
- Object element = PHPCore.create(file);
+ Object element = JavaCore.create(file);
if (element instanceof ICompilationUnit)
return (ICompilationUnit) element;
return null;
}
/*
- * @see AbstractDocumentProvider#resetDocument(Object)
+ * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#doResetDocument(java.lang.Object, org.eclipse.core.runtime.IProgressMonitor)
*/
- public void resetDocument(Object element) throws CoreException {
+ protected void doResetDocument(Object element, IProgressMonitor monitor) throws CoreException {
if (element == null)
return;
-
- ElementInfo elementInfo = getElementInfo(element);
+
+ ElementInfo elementInfo= getElementInfo(element);
if (elementInfo instanceof CompilationUnitInfo) {
- CompilationUnitInfo info = (CompilationUnitInfo) elementInfo;
-
+ CompilationUnitInfo info= (CompilationUnitInfo) elementInfo;
+
IDocument document;
- IStatus status = null;
-
+ IStatus status= null;
+
try {
-
- ICompilationUnit original = (ICompilationUnit) info.fCopy.getOriginalElement();
- IResource resource = original.getResource();
+
+ ICompilationUnit original= (ICompilationUnit) info.fCopy.getOriginalElement();
+ IResource resource= original.getResource();
if (resource instanceof IFile) {
-
- IFile file = (IFile) resource;
-
+
+ IFile file= (IFile) resource;
+
try {
- refreshFile(file);
+ refreshFile(file, monitor);
} catch (CoreException x) {
- handleCoreException(x, PHPEditorMessages.getString("PHPDocumentProvider.error.resetDocument")); //$NON-NLS-1$
+ handleCoreException(x, PHPEditorMessages.getString("CompilationUnitDocumentProvider.error.resetDocument")); //$NON-NLS-1$
}
-
- IFileEditorInput input = new FileEditorInput(file);
- document = super.createDocument(input);
-
+
+ IFileEditorInput input= new FileEditorInput(file);
+ document= super.createDocument(input);
+
} else {
- document = new Document();
+ document= createEmptyDocument();
}
-
+
} catch (CoreException x) {
- document = new Document();
- status = x.getStatus();
+ document= createEmptyDocument();
+ status= x.getStatus();
}
-
+
fireElementContentAboutToBeReplaced(element);
-
+
removeUnchangedElementListeners(element, info);
info.fDocument.set(document.get());
- info.fCanBeSaved = false;
- info.fStatus = status;
+ info.fCanBeSaved= false;
+ info.fStatus= status;
addUnchangedElementListeners(element, info);
-
+
fireElementContentReplaced(element);
fireElementDirtyStateChanged(element, false);
-
+
} else {
- super.resetDocument(element);
+ super.doResetDocument(element, monitor);
}
}
+
+ /*
+ * @see AbstractDocumentProvider#resetDocument(Object)
+ */
+// public void resetDocument(Object element) throws CoreException {
+// if (element == null)
+// return;
+//
+// ElementInfo elementInfo = getElementInfo(element);
+// if (elementInfo instanceof CompilationUnitInfo) {
+// CompilationUnitInfo info = (CompilationUnitInfo) elementInfo;
+//
+// IDocument document;
+// IStatus status = null;
+//
+// try {
+//
+// ICompilationUnit original = (ICompilationUnit) info.fCopy.getOriginalElement();
+// IResource resource = original.getResource();
+// if (resource instanceof IFile) {
+//
+// IFile file = (IFile) resource;
+//
+// try {
+// refreshFile(file);
+// } catch (CoreException x) {
+// handleCoreException(x, PHPEditorMessages.getString("PHPDocumentProvider.error.resetDocument")); //$NON-NLS-1$
+// }
+//
+// IFileEditorInput input = new FileEditorInput(file);
+// document = super.createDocument(input);
+//
+// } else {
+// document = new Document();
+// }
+//
+// } catch (CoreException x) {
+// document = new Document();
+// status = x.getStatus();
+// }
+//
+// fireElementContentAboutToBeReplaced(element);
+//
+// removeUnchangedElementListeners(element, info);
+// info.fDocument.set(document.get());
+// info.fCanBeSaved = false;
+// info.fStatus = status;
+// addUnchangedElementListeners(element, info);
+//
+// fireElementContentReplaced(element);
+// fireElementDirtyStateChanged(element, false);
+//
+// } else {
+// super.resetDocument(element);
+// }
+// }
/**
* Saves the content of the given document to the given element.
* This is only performed when this provider initiated the save.