inital plugin from webtools project
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / PHPEditor.java
index d7b5126..01a510c 100644 (file)
@@ -11,6 +11,8 @@ package net.sourceforge.phpeclipse.phpeditor;
  IBM Corporation - Initial implementation
  Klaus Hartlage - www.eclipseproject.de
  **********************************************************************/
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -42,6 +44,7 @@ import net.sourceforge.phpdt.ui.JavaUI;
 import net.sourceforge.phpdt.ui.PreferenceConstants;
 import net.sourceforge.phpdt.ui.actions.GotoMatchingBracketAction;
 import net.sourceforge.phpdt.ui.text.JavaTextTools;
+import net.sourceforge.phpdt.ui.text.PHPSourceViewerConfiguration;
 import net.sourceforge.phpdt.ui.text.folding.IJavaFoldingStructureProvider;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 
@@ -68,6 +71,7 @@ import org.eclipse.jface.text.IDocumentListener;
 import org.eclipse.jface.text.IInformationControl;
 import org.eclipse.jface.text.IInformationControlCreator;
 import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ISynchronizable;
 import org.eclipse.jface.text.ITextHover;
 import org.eclipse.jface.text.ITextInputListener;
 import org.eclipse.jface.text.ITextSelection;
@@ -142,18 +146,19 @@ import org.eclipse.ui.part.IShowInTargetList;
 import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
 import org.eclipse.ui.texteditor.AnnotationPreference;
 import org.eclipse.ui.texteditor.ChainedPreferenceStore;
-import org.eclipse.ui.texteditor.DefaultRangeIndicator;
 import org.eclipse.ui.texteditor.IDocumentProvider;
 import org.eclipse.ui.texteditor.IEditorStatusLine;
 import org.eclipse.ui.texteditor.ITextEditorActionConstants;
 import org.eclipse.ui.texteditor.MarkerAnnotation;
 import org.eclipse.ui.texteditor.ResourceAction;
+import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
 import org.eclipse.ui.texteditor.TextEditorAction;
 import org.eclipse.ui.texteditor.TextOperationAction;
 import org.eclipse.ui.views.contentoutline.ContentOutline;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 import org.eclipse.ui.views.tasklist.TaskList;
 
+
 /**
  * PHP specific text editor.
  */
@@ -1623,12 +1628,6 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
   protected String fOutlinerContextMenuId;
 
   /**
-   * The editor selection changed listener.
-   * 
-   * @since 3.0
-   */
-  //  private EditorSelectionChangedListener fEditorSelectionChangedListener;
-  /**
    * Indicates whether this editor should react on outline page selection changes
    */
   private int fIgnoreOutlinePageSelection;
@@ -1663,6 +1662,20 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
   /** The mouse listener */
   private MouseClickListener fMouseListener;
 
+  /**
+   * Indicates whether this editor is about to update any annotation views.
+   * 
+   * @since 3.0
+   */
+  private boolean fIsUpdatingAnnotationViews = false;
+
+  /**
+   * The marker that served as last target for a goto marker request.
+   * 
+   * @since 3.0
+   */
+  private IMarker fLastMarkerTarget = null;
+
   protected CompositeActionGroup fActionGroups;
 
   protected CompositeActionGroup fContextMenuGroup;
@@ -1682,6 +1695,12 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
   private IJavaFoldingStructureProvider fProjectionModelUpdater;
 
   /**
+   * The override and implements indicator manager for this editor.
+   * 
+   * @since 3.0
+   */
+  //   protected OverrideIndicatorManager fOverrideIndicatorManager;
+  /**
    * The action group for folding.
    * 
    * @since 3.0
@@ -1740,18 +1759,18 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
    */
   protected void initializeEditor() {
     //jsurfer old code
-    JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
-    setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools, this)); //, IJavaPartitions.JAVA_PARTITIONING));
-    setRangeIndicator(new DefaultRangeIndicator());
-    //         IPreferenceStore store=
-    // PHPeclipsePlugin.getDefault().getPreferenceStore();
-    //         setPreferenceStore(store);
+    //    JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
+    //    setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools, this, IPHPPartitions.PHP_PARTITIONING)); //,
+    // IJavaPartitions.JAVA_PARTITIONING));
     IPreferenceStore store = createCombinedPreferenceStore(null);
     setPreferenceStore(store);
-
+    JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
+    setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools.getColorManager(), store, this,
+        IPHPPartitions.PHP_PARTITIONING));
     // TODO changed in 3.x ?
-    if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE))
-      fUpdater = new OutlinePageSelectionUpdater();
+    //    setRangeIndicator(new DefaultRangeIndicator());
+    //    if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE))
+    //      fUpdater = new OutlinePageSelectionUpdater();
     // jsurfer end
 
     //         IPreferenceStore store= createCombinedPreferenceStore(null);
@@ -1889,10 +1908,117 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
 
     if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_DISABLE_OVERWRITE_MODE))
       enableOverwriteMode(false);
-
+    
+    setWordWrap();
     // getEditorSite().getShell().addShellListener(fActivationListener);
   }
 
+  private void setWordWrap() {
+    if (getSourceViewer() != null) {
+      getSourceViewer().getTextWidget().setWordWrap(
+          PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_WRAP_WORDS));
+    }
+  }
+
+  protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) {
+
+    support.setCharacterPairMatcher(fBracketMatcher);
+    support.setMatchingCharacterPainterPreferenceKeys(MATCHING_BRACKETS, MATCHING_BRACKETS_COLOR);
+
+    super.configureSourceViewerDecorationSupport(support);
+  }
+
+  /*
+   * @see org.eclipse.ui.texteditor.AbstractTextEditor#gotoMarker(org.eclipse.core.resources.IMarker)
+   */
+  public void gotoMarker(IMarker marker) {
+    fLastMarkerTarget = marker;
+    if (!fIsUpdatingAnnotationViews) {
+      super.gotoMarker(marker);
+    }
+  }
+
+  /**
+   * Jumps to the next enabled annotation according to the given direction. An annotation type is enabled if it is configured to be
+   * in the Next/Previous tool bar drop down menu and if it is checked.
+   * 
+   * @param forward
+   *          <code>true</code> if search direction is forward, <code>false</code> if backward
+   */
+  public void gotoAnnotation(boolean forward) {
+    ITextSelection selection = (ITextSelection) getSelectionProvider().getSelection();
+    Position position = new Position(0, 0);
+    if (false /* delayed - see bug 18316 */) {
+      getNextAnnotation(selection.getOffset(), selection.getLength(), forward, position);
+      selectAndReveal(position.getOffset(), position.getLength());
+    } else /* no delay - see bug 18316 */{
+      Annotation annotation = getNextAnnotation(selection.getOffset(), selection.getLength(), forward, position);
+      setStatusLineErrorMessage(null);
+      setStatusLineMessage(null);
+      if (annotation != null) {
+        updateAnnotationViews(annotation);
+        selectAndReveal(position.getOffset(), position.getLength());
+        setStatusLineMessage(annotation.getText());
+      }
+    }
+  }
+
+  /**
+   * Returns the lock object for the given annotation model.
+   * 
+   * @param annotationModel
+   *          the annotation model
+   * @return the annotation model's lock object
+   * @since 3.0
+   */
+  private Object getLockObject(IAnnotationModel annotationModel) {
+    if (annotationModel instanceof ISynchronizable)
+      return ((ISynchronizable) annotationModel).getLockObject();
+    else
+      return annotationModel;
+  }
+
+  /**
+   * Updates the annotation views that show the given annotation.
+   * 
+   * @param annotation
+   *          the annotation
+   */
+  private void updateAnnotationViews(Annotation annotation) {
+    IMarker marker = null;
+    if (annotation instanceof MarkerAnnotation)
+      marker = ((MarkerAnnotation) annotation).getMarker();
+    else if (annotation instanceof IJavaAnnotation) {
+      Iterator e = ((IJavaAnnotation) annotation).getOverlaidIterator();
+      if (e != null) {
+        while (e.hasNext()) {
+          Object o = e.next();
+          if (o instanceof MarkerAnnotation) {
+            marker = ((MarkerAnnotation) o).getMarker();
+            break;
+          }
+        }
+      }
+    }
+
+    if (marker != null && !marker.equals(fLastMarkerTarget)) {
+      try {
+        boolean isProblem = marker.isSubtypeOf(IMarker.PROBLEM);
+        IWorkbenchPage page = getSite().getPage();
+        IViewPart view = page.findView(isProblem ? IPageLayout.ID_PROBLEM_VIEW : IPageLayout.ID_TASK_LIST); //$NON-NLS-1$  //$NON-NLS-2$
+        if (view != null) {
+          Method method = view.getClass().getMethod("setSelection", new Class[] { IStructuredSelection.class, boolean.class }); //$NON-NLS-1$
+          method.invoke(view, new Object[] { new StructuredSelection(marker), Boolean.TRUE });
+        }
+      } catch (CoreException x) {
+      } catch (NoSuchMethodException x) {
+      } catch (IllegalAccessException x) {
+      } catch (InvocationTargetException x) {
+      }
+      // ignore exceptions, don't update any of the lists, just set status line
+    }
+  }
+
   /**
    * Returns this document's complete text.
    * 
@@ -2018,16 +2144,16 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
     super.doSetInput(input);
 
     if (getSourceViewer() instanceof JavaSourceViewer) {
-               JavaSourceViewer viewer= (JavaSourceViewer)getSourceViewer();
-               if (viewer.getReconciler() == null) {
-                       IReconciler reconciler= getSourceViewerConfiguration().getReconciler(viewer);
-                       if (reconciler != null) {
-                               reconciler.install(viewer);
-                               viewer.setReconciler(reconciler);
-                       }
-               }
-       }
-       
+      JavaSourceViewer viewer = (JavaSourceViewer) getSourceViewer();
+      if (viewer.getReconciler() == null) {
+        IReconciler reconciler = getSourceViewerConfiguration().getReconciler(viewer);
+        if (reconciler != null) {
+          reconciler.install(viewer);
+          viewer.setReconciler(reconciler);
+        }
+      }
+    }
+
     if (fEncodingSupport != null)
       fEncodingSupport.reset();
 
@@ -2036,8 +2162,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
     if (fProjectionModelUpdater != null)
       fProjectionModelUpdater.initialize();
 
-//    if (isShowingOverrideIndicators())
-//             installOverrideIndicator(false);
+    //        if (isShowingOverrideIndicators())
+    //                 installOverrideIndicator(false);
   }
 
   /*
@@ -2619,7 +2745,12 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
         if (value instanceof Integer) {
           sourceViewer.getTextWidget().setTabs(((Integer) value).intValue());
         } else if (value instanceof String) {
-          sourceViewer.getTextWidget().setTabs(Integer.parseInt((String) value));
+          try {
+            sourceViewer.getTextWidget().setTabs(Integer.parseInt((String) value));
+          } catch (NumberFormatException e){
+            // bug #1038071 - set default tab:
+            sourceViewer.getTextWidget().setTabs(80);
+          }
         }
         return;
       }
@@ -2659,14 +2790,11 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
         return;
       }
 
-      //      if
-      // (PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE.equals(property))
-      // {
-      //               if ((event.getNewValue() instanceof Boolean) &&
-      // ((Boolean)event.getNewValue()).booleanValue())
-      //                       fEditorSelectionChangedListener.selectionChanged();
-      //               return;
-      //       }
+      if (PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE.equals(property)) {
+        if ((event.getNewValue() instanceof Boolean) && ((Boolean) event.getNewValue()).booleanValue())
+          selectionChanged();
+        return;
+      }
 
       if (PreferenceConstants.EDITOR_DISABLE_OVERWRITE_MODE.equals(property)) {
         if (event.getNewValue() instanceof Boolean) {
@@ -2706,6 +2834,20 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
       //                       }
       //               }
       //       }
+
+      ((PHPSourceViewerConfiguration) getSourceViewerConfiguration()).handlePropertyChangeEvent(event);
+
+      //               if (affectsOverrideIndicatorAnnotations(event)) {
+      //                       if (isShowingOverrideIndicators()) {
+      //                               if (fOverrideIndicatorManager == null)
+      //                                       installOverrideIndicator(true);
+      //                       } else {
+      //                               if (fOverrideIndicatorManager != null)
+      //                                       uninstallOverrideIndicator();
+      //                       }
+      //                       return;
+      //               }
+
       if (PreferenceConstants.EDITOR_FOLDING_PROVIDER.equals(property)) {
         if (sourceViewer instanceof ProjectionViewer) {
           ProjectionViewer projectionViewer = (ProjectionViewer) sourceViewer;
@@ -2841,6 +2983,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
               .getNewValue())))
         sourceViewer.invalidateTextPresentation();
     }
+    if (PreferenceConstants.EDITOR_WRAP_WORDS.equals(event.getProperty())) {
+      setWordWrap();
+    }
   }
 
   /**
@@ -2940,39 +3085,40 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
   //      ruler.addDecorator(1, createLineNumberRulerColumn());
   //    return ruler;
   //  }
-//  private static IRegion getSignedSelection(ITextViewer viewer) {
-//
-//    StyledText text = viewer.getTextWidget();
-//    int caretOffset = text.getCaretOffset();
-//    Point selection = text.getSelection();
-//
-//    // caret left
-//    int offset, length;
-//    if (caretOffset == selection.x) {
-//      offset = selection.y;
-//      length = selection.x - selection.y;
-//
-//      // caret right
-//    } else {
-//      offset = selection.x;
-//      length = selection.y - selection.x;
-//    }
-//
-//    return new Region(offset, length);
-//  }
-       protected IRegion getSignedSelection(ISourceViewer sourceViewer) {
-               StyledText text= sourceViewer.getTextWidget();
-               Point selection= text.getSelectionRange();
-               
-               if (text.getCaretOffset() == selection.x) {
-                       selection.x= selection.x + selection.y;
-                       selection.y= -selection.y;
-               }
-               
-               selection.x= widgetOffset2ModelOffset(sourceViewer, selection.x);
-               
-               return new Region(selection.x, selection.y);
-       }
+  //  private static IRegion getSignedSelection(ITextViewer viewer) {
+  //
+  //    StyledText text = viewer.getTextWidget();
+  //    int caretOffset = text.getCaretOffset();
+  //    Point selection = text.getSelection();
+  //
+  //    // caret left
+  //    int offset, length;
+  //    if (caretOffset == selection.x) {
+  //      offset = selection.y;
+  //      length = selection.x - selection.y;
+  //
+  //      // caret right
+  //    } else {
+  //      offset = selection.x;
+  //      length = selection.y - selection.x;
+  //    }
+  //
+  //    return new Region(offset, length);
+  //  }
+  protected IRegion getSignedSelection(ISourceViewer sourceViewer) {
+    StyledText text = sourceViewer.getTextWidget();
+    Point selection = text.getSelectionRange();
+
+    if (text.getCaretOffset() == selection.x) {
+      selection.x = selection.x + selection.y;
+      selection.y = -selection.y;
+    }
+
+    selection.x = widgetOffset2ModelOffset(sourceViewer, selection.x);
+
+    return new Region(selection.x, selection.y);
+  }
+
   /** Preference key for matching brackets */
   protected final static String MATCHING_BRACKETS = PreferenceConstants.EDITOR_MATCHING_BRACKETS;
 
@@ -2980,20 +3126,15 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
   protected final static String MATCHING_BRACKETS_COLOR = PreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR;
 
   /** Preference key for highlighting current line */
-  protected final static String CURRENT_LINE = PreferenceConstants.EDITOR_CURRENT_LINE;
-
+  //  protected final static String CURRENT_LINE = PreferenceConstants.EDITOR_CURRENT_LINE;
   /** Preference key for highlight color of current line */
-  protected final static String CURRENT_LINE_COLOR = PreferenceConstants.EDITOR_CURRENT_LINE_COLOR;
-
+  //  protected final static String CURRENT_LINE_COLOR = PreferenceConstants.EDITOR_CURRENT_LINE_COLOR;
   /** Preference key for showing print marging ruler */
-  protected final static String PRINT_MARGIN = PreferenceConstants.EDITOR_PRINT_MARGIN;
-
+  //  protected final static String PRINT_MARGIN = PreferenceConstants.EDITOR_PRINT_MARGIN;
   /** Preference key for print margin ruler color */
-  protected final static String PRINT_MARGIN_COLOR = PreferenceConstants.EDITOR_PRINT_MARGIN_COLOR;
-
+  //  protected final static String PRINT_MARGIN_COLOR = PreferenceConstants.EDITOR_PRINT_MARGIN_COLOR;
   /** Preference key for print margin ruler column */
-  protected final static String PRINT_MARGIN_COLUMN = PreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN;
-
+  //  protected final static String PRINT_MARGIN_COLUMN = PreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN;
   /** Preference key for error indication */
   //  protected final static String ERROR_INDICATION =
   // PreferenceConstants.EDITOR_PROBLEM_INDICATION;
@@ -3148,6 +3289,23 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
    */
   abstract protected IJavaElement getInputJavaElement();
 
+  protected void updateStatusLine() {
+    ITextSelection selection = (ITextSelection) getSelectionProvider().getSelection();
+    Annotation annotation = getAnnotation(selection.getOffset(), selection.getLength());
+    setStatusLineErrorMessage(null);
+    setStatusLineMessage(null);
+    if (annotation != null) {
+      try {
+        fIsUpdatingAnnotationViews = true;
+        updateAnnotationViews(annotation);
+      } finally {
+        fIsUpdatingAnnotationViews = false;
+      }
+      if (annotation instanceof IJavaAnnotation && ((IJavaAnnotation) annotation).isProblem())
+        setStatusLineMessage(annotation.getText());
+    }
+  }
+
   /**
    * Jumps to the matching bracket.
    */
@@ -3223,6 +3381,146 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
   }
 
   /**
+   * Sets the given message as message to this editor's status line.
+   * 
+   * @param msg
+   *          message to be set
+   * @since 3.0
+   */
+  protected void setStatusLineMessage(String msg) {
+    IEditorStatusLine statusLine = (IEditorStatusLine) getAdapter(IEditorStatusLine.class);
+    if (statusLine != null)
+      statusLine.setMessage(false, msg, null);
+  }
+
+  /**
+   * Returns the annotation closest to the given range respecting the given direction. If an annotation is found, the annotations
+   * current position is copied into the provided annotation position.
+   * 
+   * @param offset
+   *          the region offset
+   * @param length
+   *          the region length
+   * @param forward
+   *          <code>true</code> for forwards, <code>false</code> for backward
+   * @param annotationPosition
+   *          the position of the found annotation
+   * @return the found annotation
+   */
+  private Annotation getNextAnnotation(final int offset, final int length, boolean forward, Position annotationPosition) {
+
+    Annotation nextAnnotation = null;
+    Position nextAnnotationPosition = null;
+    Annotation containingAnnotation = null;
+    Position containingAnnotationPosition = null;
+    boolean currentAnnotation = false;
+
+    IDocument document = getDocumentProvider().getDocument(getEditorInput());
+    int endOfDocument = document.getLength();
+    int distance = Integer.MAX_VALUE;
+
+    IAnnotationModel model = getDocumentProvider().getAnnotationModel(getEditorInput());
+    Iterator e = new JavaAnnotationIterator(model, true, true);
+    while (e.hasNext()) {
+      Annotation a = (Annotation) e.next();
+      if ((a instanceof IJavaAnnotation) && ((IJavaAnnotation) a).hasOverlay() || !isNavigationTarget(a))
+        continue;
+
+      Position p = model.getPosition(a);
+      if (p == null)
+        continue;
+
+      if (forward && p.offset == offset || !forward && p.offset + p.getLength() == offset + length) {// || p.includes(offset)) {
+        if (containingAnnotation == null
+            || (forward && p.length >= containingAnnotationPosition.length || !forward
+                && p.length >= containingAnnotationPosition.length)) {
+          containingAnnotation = a;
+          containingAnnotationPosition = p;
+          currentAnnotation = p.length == length;
+        }
+      } else {
+        int currentDistance = 0;
+
+        if (forward) {
+          currentDistance = p.getOffset() - offset;
+          if (currentDistance < 0)
+            currentDistance = endOfDocument + currentDistance;
+
+          if (currentDistance < distance || currentDistance == distance && p.length < nextAnnotationPosition.length) {
+            distance = currentDistance;
+            nextAnnotation = a;
+            nextAnnotationPosition = p;
+          }
+        } else {
+          currentDistance = offset + length - (p.getOffset() + p.length);
+          if (currentDistance < 0)
+            currentDistance = endOfDocument + currentDistance;
+
+          if (currentDistance < distance || currentDistance == distance && p.length < nextAnnotationPosition.length) {
+            distance = currentDistance;
+            nextAnnotation = a;
+            nextAnnotationPosition = p;
+          }
+        }
+      }
+    }
+    if (containingAnnotationPosition != null && (!currentAnnotation || nextAnnotation == null)) {
+      annotationPosition.setOffset(containingAnnotationPosition.getOffset());
+      annotationPosition.setLength(containingAnnotationPosition.getLength());
+      return containingAnnotation;
+    }
+    if (nextAnnotationPosition != null) {
+      annotationPosition.setOffset(nextAnnotationPosition.getOffset());
+      annotationPosition.setLength(nextAnnotationPosition.getLength());
+    }
+
+    return nextAnnotation;
+  }
+
+  /**
+   * Returns the annotation overlapping with the given range or <code>null</code>.
+   * 
+   * @param offset
+   *          the region offset
+   * @param length
+   *          the region length
+   * @return the found annotation or <code>null</code>
+   * @since 3.0
+   */
+  private Annotation getAnnotation(int offset, int length) {
+    IAnnotationModel model = getDocumentProvider().getAnnotationModel(getEditorInput());
+    Iterator e = new JavaAnnotationIterator(model, true, true);
+    while (e.hasNext()) {
+      Annotation a = (Annotation) e.next();
+      if (!isNavigationTarget(a))
+        continue;
+
+      Position p = model.getPosition(a);
+      if (p != null && p.overlapsWith(offset, length))
+        return a;
+    }
+
+    return null;
+  }
+
+  /**
+   * Returns whether the given annotation is configured as a target for the "Go to Next/Previous Annotation" actions
+   * 
+   * @param annotation
+   *          the annotation
+   * @return <code>true</code> if this is a target, <code>false</code> otherwise
+   * @since 3.0
+   */
+  private boolean isNavigationTarget(Annotation annotation) {
+    Preferences preferences = EditorsUI.getPluginPreferences();
+    AnnotationPreference preference = getAnnotationPreferenceLookup().getAnnotationPreference(annotation);
+    //         See bug 41689
+    //         String key= forward ? preference.getIsGoToNextNavigationTargetKey() : preference.getIsGoToPreviousNavigationTargetKey();
+    String key = preference == null ? null : preference.getIsGoToNextNavigationTargetKey();
+    return (key != null && preferences.getBoolean(key));
+  }
+
+  /**
    * Returns a segmentation of the line of the given document appropriate for bidi rendering. The default implementation returns
    * only the string literals of a php code line as segments.
    * 
@@ -3388,6 +3686,19 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
     return viewer;
   }
 
+  /*
+   * @see AbstractTextEditor#affectsTextPresentation(PropertyChangeEvent)
+   */
+  protected boolean affectsTextPresentation(PropertyChangeEvent event) {
+    return ((PHPSourceViewerConfiguration) getSourceViewerConfiguration()).affectsTextPresentation(event)
+        || super.affectsTextPresentation(event);
+  }
+
+  //
+  //     protected boolean affectsTextPresentation(PropertyChangeEvent event) {
+  //       JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
+  //       return textTools.affectsBehavior(event);
+  //     }
   /**
    * Creates and returns the preference store for this Java editor with the given input.
    * 
@@ -3423,23 +3734,6 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
     return new ChainedPreferenceStore((IPreferenceStore[]) stores.toArray(new IPreferenceStore[stores.size()]));
   }
 
-  /*
-   * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int)
-   */
-  //   protected ISourceViewer createJavaSourceViewer(Composite parent,
-  // IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, boolean
-  // isOverviewRulerVisible, int styles) {
-  //           return new JavaSourceViewer(parent, verticalRuler, getOverviewRuler(),
-  // isOverviewRulerVisible(), styles);
-  //   }
-  /*
-   * @see AbstractTextEditor#affectsTextPresentation(PropertyChangeEvent)
-   */
-  protected boolean affectsTextPresentation(PropertyChangeEvent event) {
-    JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
-    return textTools.affectsBehavior(event);
-  }
-
   /**
    * Jumps to the error next according to the given direction.
    */
@@ -3556,42 +3850,57 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
     }
   }
 
-  //  protected void uninstallOverrideIndicator() {
-  //   if (fOverrideIndicatorManager != null) {
-  //           fOverrideIndicatorManager.removeAnnotations();
-  //           fOverrideIndicatorManager= null;
-  //   }
-  //}
+  protected void uninstallOverrideIndicator() {
+    //         if (fOverrideIndicatorManager != null) {
+    //                 fOverrideIndicatorManager.removeAnnotations();
+    //                 fOverrideIndicatorManager= null;
+    //         }
+  }
 
   protected void installOverrideIndicator(boolean waitForReconcilation) {
-    // uninstallOverrideIndicator();
+    uninstallOverrideIndicator();
     IAnnotationModel model = getDocumentProvider().getAnnotationModel(getEditorInput());
-    // IJavaElement inputElement= getInputJavaElement();
+    final IJavaElement inputElement = getInputJavaElement();
 
-    // if (model == null || inputElement == null)
-    //         return;
+    if (model == null || inputElement == null)
+      return;
 
-    // CompilationUnit ast=
-    // PHPeclipsePlugin.getDefault().getASTProvider().getAST(inputElement,
-    // true, null);
-    // fOverrideIndicatorManager= new OverrideIndicatorManager(model,
-    // inputElement, ast);
+    // fOverrideIndicatorManager= new OverrideIndicatorManager(model, inputElement, null);
+    // 
+    // if (provideAST) {
+    //         Job job= new Job(JavaEditorMessages.getString("OverrideIndicatorManager.intallJob")) { //$NON-NLS-1$
+    //                 /*
+    //                  * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+    //                  * @since 3.0
+    //                  */
+    //                 protected IStatus run(IProgressMonitor monitor) {
+    //                         CompilationUnit ast= JavaPlugin.getDefault().getASTProvider().getAST(inputElement, true, null);
+    //                         if (fOverrideIndicatorManager != null) // editor might have been closed in the meanwhile
+    //                                 fOverrideIndicatorManager.reconciled(ast, true, monitor);
+    //                         return Status.OK_STATUS;
+    //                 }
+    //         };
+    //         job.setPriority(Job.DECORATE);
+    //         job.setSystem(true);
+    //         job.schedule();
+    // }
   }
 
   /**
-        * Tells whether override indicators are shown.
-        * 
-        * @return <code>true</code> if the override indicators are shown
-        * @since 3.0
-        */
-//     protected boolean isShowingOverrideIndicators() {
-//             AnnotationPreference preference= getAnnotationPreferenceLookup().getAnnotationPreference(OverrideIndicatorManager.ANNOTATION_TYPE);
-//             IPreferenceStore store= getPreferenceStore();
-//             return getBoolean(store, preference.getHighlightPreferenceKey())
-//                     || getBoolean(store, preference.getVerticalRulerPreferenceKey())
-//                     || getBoolean(store, preference.getOverviewRulerPreferenceKey())
-//                     || getBoolean(store, preference.getTextPreferenceKey());
-//     }
+   * Tells whether override indicators are shown.
+   * 
+   * @return <code>true</code> if the override indicators are shown
+   * @since 3.0
+   */
+  //   protected boolean isShowingOverrideIndicators() {
+  //           AnnotationPreference preference=
+  // getAnnotationPreferenceLookup().getAnnotationPreference(OverrideIndicatorManager.ANNOTATION_TYPE);
+  //           IPreferenceStore store= getPreferenceStore();
+  //           return getBoolean(store, preference.getHighlightPreferenceKey())
+  //                   || getBoolean(store, preference.getVerticalRulerPreferenceKey())
+  //                   || getBoolean(store, preference.getOverviewRulerPreferenceKey())
+  //                   || getBoolean(store, preference.getTextPreferenceKey());
+  //   }
   /**
    * Returns the boolean preference for the given key.
    * 
@@ -3628,7 +3937,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I
     if (getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE))
       synchronizeOutlinePage(element);
     setSelection(element, false);
-    //         updateStatusLine();
+    updateStatusLine();
   }
 
   private boolean isJavaOutlinePageActive() {