#1365431 (toshihiro) - PHP Editor crashes Windows with JavaScript 'windows.close()'
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / CompilationUnitAnnotationModelEvent.java
index 069e68b..fa55f33 100644 (file)
  *******************************************************************************/
 package net.sourceforge.phpeclipse.phpeditor;
 
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 
-
+import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
-
+import org.eclipse.core.runtime.CoreException;
+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.IAnnotationModel;
+import org.eclipse.ui.texteditor.MarkerAnnotation;
 
 /**
  * Event sent out by changes of the compilation unit annotation model.
  */
-public class CompilationUnitAnnotationModelEvent  extends AnnotationModelEvent {
-       
-       private boolean fIncludesMarkerAnnotationChanges;
+public class CompilationUnitAnnotationModelEvent extends AnnotationModelEvent {
+
+       private boolean fIncludesProblemMarkerAnnotations;
+
        private IResource fUnderlyingResource;
-       
-       
+
        /**
         * Constructor for CompilationUnitAnnotationModelEvent.
+        * 
         * @param model
-        * @param underlyingResource The annotation model's underlying resource 
-        * @param includesMarkerAnnotationChanges
+        * @param underlyingResource
+        *            The annotation model's underlying resource
         */
-       public CompilationUnitAnnotationModelEvent(IAnnotationModel model, IResource underlyingResource, boolean includesMarkerAnnotationChanges) {
+       public CompilationUnitAnnotationModelEvent(IAnnotationModel model,
+                       IResource underlyingResource) {
                super(model);
-               fIncludesMarkerAnnotationChanges= includesMarkerAnnotationChanges;
-               fUnderlyingResource= underlyingResource;
+               fUnderlyingResource = underlyingResource;
+               fIncludesProblemMarkerAnnotations = false;
+       }
+
+       private void testIfProblemMarker(Annotation annotation) {
+               if (fIncludesProblemMarkerAnnotations) {
+                       return;
+               }
+               if (annotation instanceof JavaMarkerAnnotation) {
+                       fIncludesProblemMarkerAnnotations = ((JavaMarkerAnnotation) annotation)
+                                       .isProblem();
+               } else if (annotation instanceof MarkerAnnotation) {
+                       try {
+                               IMarker marker = ((MarkerAnnotation) annotation).getMarker();
+                               if (!marker.exists() || marker.isSubtypeOf(IMarker.PROBLEM)) {
+                                       fIncludesProblemMarkerAnnotations = true;
+                               }
+                       } catch (CoreException e) {
+                               PHPeclipsePlugin.log(e);
+                       }
+               }
+       }
+
+       /*
+        * @see org.eclipse.jface.text.source.AnnotationModelEvent#annotationAdded(org.eclipse.jface.text.source.Annotation)
+        */
+       public void annotationAdded(Annotation annotation) {
+               super.annotationAdded(annotation);
+               testIfProblemMarker(annotation);
        }
-       
+
+       /*
+        * @see org.eclipse.jface.text.source.AnnotationModelEvent#annotationRemoved(org.eclipse.jface.text.source.Annotation)
+        */
+       public void annotationRemoved(Annotation annotation) {
+               super.annotationRemoved(annotation);
+               testIfProblemMarker(annotation);
+       }
+
+       /*
+        * @see org.eclipse.jface.text.source.AnnotationModelEvent#annotationRemoved(org.eclipse.jface.text.source.Annotation,
+        *      org.eclipse.jface.text.Position)
+        */
+       public void annotationRemoved(Annotation annotation, Position position) {
+               super.annotationRemoved(annotation, position);
+               testIfProblemMarker(annotation);
+       }
+
+       /*
+        * @see org.eclipse.jface.text.source.AnnotationModelEvent#annotationChanged(org.eclipse.jface.text.source.Annotation)
+        */
+       public void annotationChanged(Annotation annotation) {
+               testIfProblemMarker(annotation);
+               super.annotationChanged(annotation);
+       }
+
        /**
-        * Returns whether the change included marker annotations.
+        * Returns whether the change included problem marker annotations.
         * 
         * @return <code>true</code> if the change included marker annotations
         */
-       public boolean includesMarkerAnnotationChanges() {
-               return fIncludesMarkerAnnotationChanges;
+       public boolean includesProblemMarkerAnnotationChanges() {
+               return fIncludesProblemMarkerAnnotations;
        }
-       
+
        /**
         * Returns the annotation model's underlying resource
         */