X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java index 5f57887..cc75aed 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java @@ -33,7 +33,11 @@ import net.sourceforge.phpdt.core.ISourceRange; import net.sourceforge.phpdt.core.ISourceReference; import net.sourceforge.phpdt.core.JavaCore; import net.sourceforge.phpdt.core.JavaModelException; +import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; +import net.sourceforge.phpdt.core.compiler.ITerminalSymbols.TokenName; +import net.sourceforge.phpdt.core.compiler.InvalidInputException; import net.sourceforge.phpdt.internal.compiler.parser.Scanner; +import net.sourceforge.phpdt.internal.compiler.parser.SyntaxError; import net.sourceforge.phpdt.internal.ui.actions.CompositeActionGroup; import net.sourceforge.phpdt.internal.ui.actions.FoldingActionGroup; import net.sourceforge.phpdt.internal.ui.actions.SelectionConverter; @@ -41,11 +45,14 @@ import net.sourceforge.phpdt.internal.ui.text.CustomSourceInformationControl; import net.sourceforge.phpdt.internal.ui.text.DocumentCharacterIterator; import net.sourceforge.phpdt.internal.ui.text.HTMLTextPresenter; import net.sourceforge.phpdt.internal.ui.text.IPHPPartitions; +import net.sourceforge.phpdt.internal.ui.text.JavaWordFinder; import net.sourceforge.phpdt.internal.ui.text.JavaWordIterator; import net.sourceforge.phpdt.internal.ui.text.PHPPairMatcher; import net.sourceforge.phpdt.internal.ui.text.PreferencesAdapter; -import net.sourceforge.phpdt.internal.ui.text.java.JavaExpandHover; +import net.sourceforge.phpdt.internal.ui.text.java.hover.JavaExpandHover; +import net.sourceforge.phpdt.internal.ui.viewsupport.ISelectionListenerWithAST; import net.sourceforge.phpdt.internal.ui.viewsupport.IViewPartInputProvider; +import net.sourceforge.phpdt.internal.ui.viewsupport.SelectionListenerWithASTManager; import net.sourceforge.phpdt.ui.IContextMenuConstants; import net.sourceforge.phpdt.ui.JavaUI; import net.sourceforge.phpdt.ui.PreferenceConstants; @@ -55,14 +62,19 @@ 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; +import net.sourceforge.phpeclipse.builder.ExternalEditorInput; import net.sourceforge.phpeclipse.ui.editor.BrowserUtil; import net.sourceforge.phpeclipse.webbrowser.views.BrowserView; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; @@ -77,10 +89,12 @@ import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentExtension4; 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.ISelectionValidator; import org.eclipse.jface.text.ISynchronizable; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.ITextInputListener; @@ -88,7 +102,6 @@ import org.eclipse.jface.text.ITextPresentationListener; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.ITextViewerExtension2; -import org.eclipse.jface.text.ITextViewerExtension3; import org.eclipse.jface.text.ITextViewerExtension4; import org.eclipse.jface.text.ITextViewerExtension5; import org.eclipse.jface.text.ITypedRegion; @@ -99,6 +112,7 @@ import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.text.TextUtilities; import org.eclipse.jface.text.information.IInformationProvider; import org.eclipse.jface.text.information.InformationPresenter; +import org.eclipse.jface.text.link.LinkedModeModel; import org.eclipse.jface.text.reconciler.IReconciler; import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.AnnotationRulerColumn; @@ -109,12 +123,15 @@ import org.eclipse.jface.text.source.IOverviewRuler; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.ISourceViewerExtension2; import org.eclipse.jface.text.source.IVerticalRuler; +import org.eclipse.jface.text.source.IVerticalRulerColumn; import org.eclipse.jface.text.source.OverviewRuler; import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.jface.text.source.projection.ProjectionSupport; import org.eclipse.jface.text.source.projection.ProjectionViewer; import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.ListenerList; +//incastrix +//import org.eclipse.jface.util.ListenerList; +import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; @@ -151,18 +168,22 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPartService; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWindowListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionContext; import org.eclipse.ui.actions.ActionGroup; import org.eclipse.ui.editors.text.DefaultEncodingSupport; import org.eclipse.ui.editors.text.EditorsUI; import org.eclipse.ui.editors.text.IEncodingSupport; +import org.eclipse.ui.ide.FileStoreEditorInput; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.IShowInSource; import org.eclipse.ui.part.IShowInTargetList; @@ -187,24 +208,25 @@ import org.eclipse.ui.views.tasklist.TaskList; /** * PHP specific text editor. */ -public abstract class PHPEditor extends AbstractDecoratedTextEditor implements IViewPartInputProvider, IShowInTargetList, - IShowInSource { +public abstract class PHPEditor extends AbstractDecoratedTextEditor implements + IViewPartInputProvider, IShowInTargetList, IShowInSource { // extends StatusTextEditor implements IViewPartInputProvider { // extends // TextEditor { /** * Internal implementation class for a change listener. - * + * * @since 3.0 */ - protected abstract class AbstractSelectionChangedListener implements ISelectionChangedListener { + protected abstract class AbstractSelectionChangedListener implements + ISelectionChangedListener { /** * Installs this selection changed listener with the given selection - * provider. If the selection provider is a post selection provider, post - * selection changed events are the preferred choice, otherwise normal - * selection changed events are requested. - * + * provider. If the selection provider is a post selection provider, + * post selection changed events are the preferred choice, otherwise + * normal selection changed events are requested. + * * @param selectionProvider */ public void install(ISelectionProvider selectionProvider) { @@ -222,9 +244,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Removes this selection changed listener from the given selection * provider. - * + * * @param selectionProvider - * the selection provider + * the selection provider */ public void uninstall(ISelectionProvider selectionProvider) { if (selectionProvider == null) @@ -240,11 +262,13 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } /** - * Updates the Java outline page selection and this editor's range indicator. - * + * Updates the Java outline page selection and this editor's range + * indicator. + * * @since 3.0 */ - private class EditorSelectionChangedListener extends AbstractSelectionChangedListener { + private class EditorSelectionChangedListener extends + AbstractSelectionChangedListener { /* * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) @@ -301,7 +325,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * This preference store is read-only i.e. write access throws an * {@link java.lang.UnsupportedOperationException}. *

- * + * * @since 3.0 */ private static class OptionsAdapter implements IPreferenceStore { @@ -313,19 +337,20 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Should the given event be filtered? - * + * * @param event - * The property change event. - * @return true iff the given event should be filtered. + * The property change event. + * @return true iff the given event should be + * filtered. */ public boolean isFiltered(PropertyChangeEvent event); } /** - * Property change listener. Listens for events in the options Map and fires - * a {@link org.eclipse.jface.util.PropertyChangeEvent}on this adapter with - * arguments from the received event. + * Property change listener. Listens for events in the options Map and + * fires a {@link org.eclipse.jface.util.PropertyChangeEvent}on this + * adapter with arguments from the received event. */ private class PropertyChangeListener implements IPropertyChangeListener { @@ -341,7 +366,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I else fOptions.put(event.getProperty(), event.getNewValue()); - firePropertyChangeEvent(event.getProperty(), event.getOldValue(), event.getNewValue()); + firePropertyChangeEvent(event.getProperty(), event + .getOldValue(), event.getNewValue()); } } @@ -362,15 +388,17 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Initialize with the given options. - * + * * @param options - * The options to wrap + * The options to wrap * @param mockupPreferenceStore - * the mock-up preference store + * the mock-up preference store * @param filter - * the property change filter + * the property change filter */ - public OptionsAdapter(Map options, IPreferenceStore mockupPreferenceStore, IPropertyChangeEventFilter filter) { + public OptionsAdapter(Map options, + IPreferenceStore mockupPreferenceStore, + IPropertyChangeEventFilter filter) { fMockupPreferenceStore = mockupPreferenceStore; fOptions = options; setFilter(filter); @@ -388,7 +416,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * {@inheritDoc} */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { + public void removePropertyChangeListener( + IPropertyChangeListener listener) { fListeners.remove(listener); if (fListeners.size() == 0) fMockupPreferenceStore.removePropertyChangeListener(fListener); @@ -404,8 +433,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * {@inheritDoc} */ - public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) { - PropertyChangeEvent event = new PropertyChangeEvent(this, name, oldValue, newValue); + public void firePropertyChangeEvent(String name, Object oldValue, + Object newValue) { + PropertyChangeEvent event = new PropertyChangeEvent(this, name, + oldValue, newValue); Object[] listeners = fListeners.getListeners(); for (int i = 0; i < listeners.length; i++) ((IPropertyChangeListener) listeners[i]).propertyChange(event); @@ -648,7 +679,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Returns the adapted options Map. - * + * * @return Returns the adapted options Map. */ public Map getOptions() { @@ -656,9 +687,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } /** - * Returns the mock-up preference store, events are received through this - * preference store. - * + * Returns the mock-up preference store, events are received through + * this preference store. + * * @return Returns the mock-up preference store. */ public IPreferenceStore getMockupPreferenceStore() { @@ -667,9 +698,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Set the event filter to the given filter. - * + * * @param filter - * The new filter. + * The new filter. */ public void setFilter(IPropertyChangeEventFilter filter) { fFilter = filter; @@ -677,7 +708,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Returns the event filter. - * + * * @return The event filter. */ public IPropertyChangeEventFilter getFilter() { @@ -772,7 +803,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // return SWT.NONE; // // int stateMask = 0; - // StringTokenizer modifierTokenizer = new StringTokenizer(modifiers, ",;.:+-* + // StringTokenizer modifierTokenizer = new StringTokenizer(modifiers, + // ",;.:+-* // "); //$NON-NLS-1$ // while (modifierTokenizer.hasMoreTokens()) { // int modifier = @@ -843,7 +875,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // return; // // Display display = text.getDisplay(); - // fColor = createColor(getPreferenceStore(), PHPEditor.LINK_COLOR, display); + // fColor = createColor(getPreferenceStore(), PHPEditor.LINK_COLOR, + // display); // } // // /** @@ -1193,7 +1226,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // return; // } // - // if ((event.stateMask & SWT.BUTTON1) != 0 && text.getSelectionCount() != 0) + // if ((event.stateMask & SWT.BUTTON1) != 0 && text.getSelectionCount() != + // 0) // { // deactivate(); // return; @@ -1283,7 +1317,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // org.eclipse.jface.text.ITextInputListener#inputDocumentChanged(org.eclipse.jface.text.IDocument, // * org.eclipse.jface.text.IDocument) // */ - // public void inputDocumentChanged(IDocument oldInput, IDocument newInput) { + // public void inputDocumentChanged(IDocument oldInput, IDocument newInput) + // { // if (newInput == null) // return; // newInput.addDocumentListener(this); @@ -1348,7 +1383,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // region.getLength(); // } // - // private Point getMinimumLocation(StyledText text, int offset, int length) { + // private Point getMinimumLocation(StyledText text, int offset, int length) + // { // Point minLocation = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE); // // for (int i = 0; i <= length; i++) { @@ -1363,7 +1399,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // return minLocation; // } // - // private Point getMaximumLocation(StyledText text, int offset, int length) { + // private Point getMaximumLocation(StyledText text, int offset, int length) + // { // Point maxLocation = new Point(Integer.MIN_VALUE, Integer.MIN_VALUE); // // for (int i = 0; i <= length; i++) { @@ -1381,8 +1418,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /* * Link mode. */ - class MouseClickListener implements KeyListener, MouseListener, MouseMoveListener, FocusListener, PaintListener, - IPropertyChangeListener, IDocumentListener, ITextInputListener, ITextPresentationListener { + class MouseClickListener implements KeyListener, MouseListener, + MouseMoveListener, FocusListener, PaintListener, + IPropertyChangeListener, IDocumentListener, ITextInputListener, + ITextPresentationListener { /** The session is active. */ private boolean fActive; @@ -1437,7 +1476,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I text.addFocusListener(this); text.addPaintListener(this); - ((ITextViewerExtension4) sourceViewer).addTextPresentationListener(this); + ((ITextViewerExtension4) sourceViewer) + .addTextPresentationListener(this); updateKeyModifierMask(); @@ -1446,11 +1486,13 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } private void updateKeyModifierMask() { - String modifiers = getPreferenceStore().getString(BROWSER_LIKE_LINKS_KEY_MODIFIER); + String modifiers = getPreferenceStore().getString( + BROWSER_LIKE_LINKS_KEY_MODIFIER); fKeyModifierMask = computeStateMask(modifiers); if (fKeyModifierMask == -1) { // Fall back to stored state mask - fKeyModifierMask = getPreferenceStore().getInt(BROWSER_LIKE_LINKS_KEY_MODIFIER_MASK); + fKeyModifierMask = getPreferenceStore().getInt( + BROWSER_LIKE_LINKS_KEY_MODIFIER_MASK); } } @@ -1462,9 +1504,11 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return SWT.NONE; int stateMask = 0; - StringTokenizer modifierTokenizer = new StringTokenizer(modifiers, ",;.:+-* "); //$NON-NLS-1$ + StringTokenizer modifierTokenizer = new StringTokenizer(modifiers, + ",;.:+-* "); //$NON-NLS-1$ while (modifierTokenizer.hasMoreTokens()) { - int modifier = EditorUtility.findLocalizedModifier(modifierTokenizer.nextToken()); + int modifier = EditorUtility + .findLocalizedModifier(modifierTokenizer.nextToken()); if (modifier == 0 || (stateMask & modifier) == modifier) return -1; stateMask = stateMask | modifier; @@ -1490,7 +1534,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I IDocumentProvider documentProvider = getDocumentProvider(); if (documentProvider != null) { - IDocument document = documentProvider.getDocument(getEditorInput()); + IDocument document = documentProvider + .getDocument(getEditorInput()); if (document != null) document.removeDocumentListener(this); } @@ -1512,7 +1557,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I text.removeFocusListener(this); text.removePaintListener(this); - ((ITextViewerExtension4) sourceViewer).removeTextPresentationListener(this); + ((ITextViewerExtension4) sourceViewer) + .removeTextPresentationListener(this); } /* @@ -1523,7 +1569,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I ISourceViewer viewer = getSourceViewer(); if (viewer != null) updateColor(viewer); - } else if (event.getProperty().equals(BROWSER_LIKE_LINKS_KEY_MODIFIER)) { + } else if (event.getProperty().equals( + BROWSER_LIKE_LINKS_KEY_MODIFIER)) { updateKeyModifierMask(); } } @@ -1537,23 +1584,25 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return; Display display = text.getDisplay(); - fColor = createColor(getPreferenceStore(), PHPEditor.LINK_COLOR, display); + fColor = createColor(getPreferenceStore(), PHPEditor.LINK_COLOR, + display); } /** * Creates a color from the information stored in the given preference * store. - * + * * @param store - * the preference store + * the preference store * @param key - * the key + * the key * @param display - * the display - * @return the color or null if there is no such information - * available + * the display + * @return the color or null if there is no such + * information available */ - private Color createColor(IPreferenceStore store, String key, Display display) { + private Color createColor(IPreferenceStore store, String key, + Display display) { RGB rgb = null; @@ -1591,7 +1640,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // Invalidate ==> remove applied text presentation if (!redrawAll && viewer instanceof ITextViewerExtension2) - ((ITextViewerExtension2) viewer).invalidateTextPresentation(offset, length); + ((ITextViewerExtension2) viewer) + .invalidateTextPresentation(offset, length); else viewer.invalidateTextPresentation(); @@ -1705,9 +1755,12 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (fActiveRegion == null) return; IRegion region = textPresentation.getExtent(); - if (fActiveRegion.getOffset() + fActiveRegion.getLength() >= region.getOffset() - && region.getOffset() + region.getLength() > fActiveRegion.getOffset()) - textPresentation.mergeStyleRange(new StyleRange(fActiveRegion.getOffset(), fActiveRegion.getLength(), fColor, null)); + if (fActiveRegion.getOffset() + fActiveRegion.getLength() >= region + .getOffset() + && region.getOffset() + region.getLength() > fActiveRegion + .getOffset()) + textPresentation.mergeStyleRange(new StyleRange(fActiveRegion + .getOffset(), fActiveRegion.getLength(), fColor, null)); } private void highlightRegion(ISourceViewer viewer, IRegion region) { @@ -1734,7 +1787,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I length = widgetRange.getLength(); } else { - offset = region.getOffset() - viewer.getVisibleRegion().getOffset(); + offset = region.getOffset() + - viewer.getVisibleRegion().getOffset(); length = region.getLength(); } text.redrawRange(offset, length, false); @@ -1742,7 +1796,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // Invalidate region ==> apply text presentation fActiveRegion = region; if (viewer instanceof ITextViewerExtension2) - ((ITextViewerExtension2) viewer).invalidateTextPresentation(region.getOffset(), region.getLength()); + ((ITextViewerExtension2) viewer).invalidateTextPresentation( + region.getOffset(), region.getLength()); else viewer.invalidateTextPresentation(); } @@ -1864,7 +1919,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I */ public void mouseMove(MouseEvent event) { - if (event.widget instanceof Control && !((Control) event.widget).isFocusControl()) { + if (event.widget instanceof Control + && !((Control) event.widget).isFocusControl()) { deactivate(); return; } @@ -1888,7 +1944,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return; } - if ((event.stateMask & SWT.BUTTON1) != 0 && text.getSelectionCount() != 0) { + if ((event.stateMask & SWT.BUTTON1) != 0 + && text.getSelectionCount() != 0) { deactivate(); return; } @@ -1921,7 +1978,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I */ public void documentAboutToBeChanged(DocumentEvent event) { if (fActive && fActiveRegion != null) { - fRememberedPosition = new Position(fActiveRegion.getOffset(), fActiveRegion.getLength()); + fRememberedPosition = new Position(fActiveRegion.getOffset(), + fActiveRegion.getLength()); try { event.getDocument().addPosition(fRememberedPosition); } catch (BadLocationException x) { @@ -1938,7 +1996,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (!fRememberedPosition.isDeleted()) { event.getDocument().removePosition(fRememberedPosition); - fActiveRegion = new Region(fRememberedPosition.getOffset(), fRememberedPosition.getLength()); + fActiveRegion = new Region(fRememberedPosition.getOffset(), + fRememberedPosition.getLength()); fRememberedPosition = null; ISourceViewer viewer = getSourceViewer(); @@ -1965,7 +2024,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * @see org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface.text.IDocument, * org.eclipse.jface.text.IDocument) */ - public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) { + public void inputDocumentAboutToBeChanged(IDocument oldInput, + IDocument newInput) { if (oldInput == null) return; deactivate(); @@ -2003,7 +2063,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (viewer instanceof ITextViewerExtension5) { ITextViewerExtension5 extension = (ITextViewerExtension5) viewer; - IRegion widgetRange = extension.modelRange2WidgetRange(fActiveRegion); + IRegion widgetRange = extension + .modelRange2WidgetRange(fActiveRegion); if (widgetRange == null) return; @@ -2036,7 +2097,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I private boolean includes(IRegion region, IRegion position) { return position.getOffset() >= region.getOffset() - && position.getOffset() + position.getLength() <= region.getOffset() + region.getLength(); + && position.getOffset() + position.getLength() <= region + .getOffset() + + region.getLength(); } private Point getMinimumLocation(StyledText text, int offset, int length) { @@ -2072,9 +2135,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * This action dispatches into two behaviours: If there is no current text - * hover, the javadoc is displayed using information presenter. If there is a - * current text hover, it is converted into a information presenter in order - * to make it sticky. + * hover, the javadoc is displayed using information presenter. If there is + * a current text hover, it is converted into a information presenter in + * order to make it sticky. */ class InformationDispatchAction extends TextEditorAction { @@ -2084,7 +2147,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Creates a dispatch action. */ - public InformationDispatchAction(ResourceBundle resourceBundle, String prefix, final TextOperationAction textOperationAction) { + public InformationDispatchAction(ResourceBundle resourceBundle, + String prefix, final TextOperationAction textOperationAction) { super(resourceBundle, prefix, PHPEditor.this); if (textOperationAction == null) throw new IllegalArgumentException(); @@ -2116,8 +2180,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return; } - Point hoverEventLocation = textViewerExtension2.getHoverEventLocation(); - int offset = computeOffsetAtLocation(sourceViewer, hoverEventLocation.x, hoverEventLocation.y); + Point hoverEventLocation = textViewerExtension2 + .getHoverEventLocation(); + int offset = computeOffsetAtLocation(sourceViewer, + hoverEventLocation.x, hoverEventLocation.y); if (offset == -1) { fTextOperationAction.run(); return; @@ -2128,11 +2194,13 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I IDocument document = sourceViewer.getDocument(); String contentType = document.getContentType(offset); - final IRegion hoverRegion = textHover.getHoverRegion(sourceViewer, offset); + final IRegion hoverRegion = textHover.getHoverRegion( + sourceViewer, offset); if (hoverRegion == null) return; - final String hoverInfo = textHover.getHoverInfo(sourceViewer, hoverRegion); + final String hoverInfo = textHover.getHoverInfo(sourceViewer, + hoverRegion); // with information provider IInformationProvider informationProvider = new IInformationProvider() { @@ -2148,13 +2216,15 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * @see org.eclipse.jface.text.information.IInformationProvider#getInformation(org.eclipse.jface.text.ITextViewer, * org.eclipse.jface.text.IRegion) */ - public String getInformation(ITextViewer textViewer, IRegion subject) { + public String getInformation(ITextViewer textViewer, + IRegion subject) { return hoverInfo; } }; fInformationPresenter.setOffset(offset); - fInformationPresenter.setInformationProvider(informationProvider, contentType); + fInformationPresenter.setInformationProvider( + informationProvider, contentType); fInformationPresenter.showInformation(); } catch (BadLocationException e) { @@ -2171,9 +2241,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return -1; try { - int widgetLocation = styledText.getOffsetAtLocation(new Point(x, y)); - if (textViewer instanceof ITextViewerExtension3) { - ITextViewerExtension3 extension = (ITextViewerExtension3) textViewer; + int widgetLocation = styledText.getOffsetAtLocation(new Point( + x, y)); + if (textViewer instanceof ITextViewerExtension5) { + ITextViewerExtension5 extension = (ITextViewerExtension5) textViewer; return extension.widgetOffset2ModelOffset(widgetLocation); } else { IRegion visibleRegion = textViewer.getVisibleRegion(); @@ -2188,28 +2259,29 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * This action implements smart home. - * + * * Instead of going to the start of a line it does the following: - if smart - * home/end is enabled and the caret is after the line's first non-whitespace - * then the caret is moved directly before it, taking JavaDoc and multi-line - * comments into account. - if the caret is before the line's first - * non-whitespace the caret is moved to the beginning of the line - if the - * caret is at the beginning of the line see first case. - * + * home/end is enabled and the caret is after the line's first + * non-whitespace then the caret is moved directly before it, taking JavaDoc + * and multi-line comments into account. - if the caret is before the line's + * first non-whitespace the caret is moved to the beginning of the line - if + * the caret is at the beginning of the line see first case. + * * @since 3.0 */ protected class SmartLineStartAction extends LineStartAction { /** * Creates a new smart line start action - * + * * @param textWidget - * the styled text widget + * the styled text widget * @param doSelect - * a boolean flag which tells if the text up to the beginning of - * the line should be selected + * a boolean flag which tells if the text up to the beginning + * of the line should be selected */ - public SmartLineStartAction(final StyledText textWidget, final boolean doSelect) { + public SmartLineStartAction(final StyledText textWidget, + final boolean doSelect) { super(textWidget, doSelect); } @@ -2217,28 +2289,36 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * @see org.eclipse.ui.texteditor.AbstractTextEditor.LineStartAction#getLineStartPosition(java.lang.String, * int, java.lang.String) */ - protected int getLineStartPosition(final IDocument document, final String line, final int length, final int offset) { + protected int getLineStartPosition(final IDocument document, + final String line, final int length, final int offset) { String type = IDocument.DEFAULT_CONTENT_TYPE; try { - type = TextUtilities.getContentType(document, IPHPPartitions.PHP_PARTITIONING, offset, true); + type = TextUtilities.getContentType(document, + IPHPPartitions.PHP_PARTITIONING, offset, true); } catch (BadLocationException exception) { // Should not happen } - int index = super.getLineStartPosition(document, line, length, offset); - if (type.equals(IPHPPartitions.PHP_PHPDOC_COMMENT) || type.equals(IPHPPartitions.PHP_MULTILINE_COMMENT)) { - if (index < length - 1 && line.charAt(index) == '*' && line.charAt(index + 1) != '/') { + int index = super.getLineStartPosition(document, line, length, + offset); + if (type.equals(IPHPPartitions.PHP_PHPDOC_COMMENT) + || type.equals(IPHPPartitions.PHP_MULTILINE_COMMENT)) { + if (index < length - 1 && line.charAt(index) == '*' + && line.charAt(index + 1) != '/') { do { ++index; - } while (index < length && Character.isWhitespace(line.charAt(index))); + } while (index < length + && Character.isWhitespace(line.charAt(index))); } } else { - if (index < length - 1 && line.charAt(index) == '/' && line.charAt(index + 1) == '/') { + if (index < length - 1 && line.charAt(index) == '/' + && line.charAt(index + 1) == '/') { index++; do { ++index; - } while (index < length && Character.isWhitespace(line.charAt(index))); + } while (index < length + && Character.isWhitespace(line.charAt(index))); } } return index; @@ -2247,7 +2327,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Text navigation action to navigate to the next sub-word. - * + * * @since 3.0 */ protected abstract class NextSubWordAction extends TextNavigationAction { @@ -2256,10 +2336,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Creates a new next sub-word action. - * + * * @param code - * Action code for the default operation. Must be an action code - * from + * Action code for the default operation. Must be an action + * code from * @see org.eclipse.swt.custom.ST. */ protected NextSubWordAction(int code) { @@ -2270,18 +2350,23 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * @see org.eclipse.jface.action.IAction#run() */ public void run() { - // Check whether we are in a java code partition and the preference is + // Check whether we are in a java code partition and the preference + // is // enabled final IPreferenceStore store = getPreferenceStore(); - if (!store.getBoolean(PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION)) { + if (!store + .getBoolean(PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION)) { super.run(); return; } final ISourceViewer viewer = getSourceViewer(); final IDocument document = viewer.getDocument(); - fIterator.setText((CharacterIterator) new DocumentCharacterIterator(document)); - int position = widgetOffset2ModelOffset(viewer, viewer.getTextWidget().getCaretOffset()); + fIterator + .setText((CharacterIterator) new DocumentCharacterIterator( + document)); + int position = widgetOffset2ModelOffset(viewer, viewer + .getTextWidget().getCaretOffset()); if (position == -1) return; @@ -2293,19 +2378,19 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } } - + /** * Finds the next position after the given position. - * + * * @param position - * the current position + * the current position * @return the next position */ protected int findNextPosition(int position) { ISourceViewer viewer = getSourceViewer(); int widget = -1; while (position != BreakIterator.DONE && widget == -1) { // TODO: - // optimize + // optimize position = fIterator.following(position); if (position != BreakIterator.DONE) widget = modelOffset2WidgetOffset(viewer, position); @@ -2316,16 +2401,16 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Sets the caret position to the sub-word boundary given with * position. - * + * * @param position - * Position where the action should move the caret + * Position where the action should move the caret */ protected abstract void setCaretPosition(int position); } /** * Text navigation action to navigate to the next sub-word. - * + * * @since 3.0 */ protected class NavigateNextSubWordAction extends NextSubWordAction { @@ -2341,16 +2426,18 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * @see net.sourceforge.phpdt.internal.ui.javaeditor.JavaEditor.NextSubWordAction#setCaretPosition(int) */ protected void setCaretPosition(final int position) { - getTextWidget().setCaretOffset(modelOffset2WidgetOffset(getSourceViewer(), position)); + getTextWidget().setCaretOffset( + modelOffset2WidgetOffset(getSourceViewer(), position)); } } /** * Text operation action to delete the next sub-word. - * + * * @since 3.0 */ - protected class DeleteNextSubWordAction extends NextSubWordAction implements IUpdate { + protected class DeleteNextSubWordAction extends NextSubWordAction implements + IUpdate { /** * Creates a new delete next sub-word action. @@ -2367,7 +2454,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return; final ISourceViewer viewer = getSourceViewer(); - final int caret = widgetOffset2ModelOffset(viewer, viewer.getTextWidget().getCaretOffset()); + final int caret = widgetOffset2ModelOffset(viewer, viewer + .getTextWidget().getCaretOffset()); try { viewer.getDocument().replace(caret, position - caret, ""); //$NON-NLS-1$ @@ -2393,7 +2481,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Text operation action to select the next sub-word. - * + * * @since 3.0 */ protected class SelectNextSubWordAction extends NextSubWordAction { @@ -2428,7 +2516,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Text navigation action to navigate to the previous sub-word. - * + * * @since 3.0 */ protected abstract class PreviousSubWordAction extends TextNavigationAction { @@ -2437,10 +2525,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Creates a new previous sub-word action. - * + * * @param code - * Action code for the default operation. Must be an action code - * from + * Action code for the default operation. Must be an action + * code from * @see org.eclipse.swt.custom.ST. */ protected PreviousSubWordAction(final int code) { @@ -2451,18 +2539,23 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * @see org.eclipse.jface.action.IAction#run() */ public void run() { - // Check whether we are in a java code partition and the preference is + // Check whether we are in a java code partition and the preference + // is // enabled final IPreferenceStore store = getPreferenceStore(); - if (!store.getBoolean(PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION)) { + if (!store + .getBoolean(PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION)) { super.run(); return; } final ISourceViewer viewer = getSourceViewer(); final IDocument document = viewer.getDocument(); - fIterator.setText((CharacterIterator) new DocumentCharacterIterator(document)); - int position = widgetOffset2ModelOffset(viewer, viewer.getTextWidget().getCaretOffset()); + fIterator + .setText((CharacterIterator) new DocumentCharacterIterator( + document)); + int position = widgetOffset2ModelOffset(viewer, viewer + .getTextWidget().getCaretOffset()); if (position == -1) return; @@ -2477,16 +2570,16 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Finds the previous position before the given position. - * + * * @param position - * the current position + * the current position * @return the previous position */ protected int findPreviousPosition(int position) { ISourceViewer viewer = getSourceViewer(); int widget = -1; while (position != BreakIterator.DONE && widget == -1) { // TODO: - // optimize + // optimize position = fIterator.preceding(position); if (position != BreakIterator.DONE) widget = modelOffset2WidgetOffset(viewer, position); @@ -2497,16 +2590,16 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Sets the caret position to the sub-word boundary given with * position. - * + * * @param position - * Position where the action should move the caret + * Position where the action should move the caret */ protected abstract void setCaretPosition(int position); } /** * Text navigation action to navigate to the previous sub-word. - * + * * @since 3.0 */ protected class NavigatePreviousSubWordAction extends PreviousSubWordAction { @@ -2522,16 +2615,18 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * @see net.sourceforge.phpdt.internal.ui.javaeditor.JavaEditor.PreviousSubWordAction#setCaretPosition(int) */ protected void setCaretPosition(final int position) { - getTextWidget().setCaretOffset(modelOffset2WidgetOffset(getSourceViewer(), position)); + getTextWidget().setCaretOffset( + modelOffset2WidgetOffset(getSourceViewer(), position)); } } /** * Text operation action to delete the previous sub-word. - * + * * @since 3.0 */ - protected class DeletePreviousSubWordAction extends PreviousSubWordAction implements IUpdate { + protected class DeletePreviousSubWordAction extends PreviousSubWordAction + implements IUpdate { /** * Creates a new delete previous sub-word action. @@ -2548,7 +2643,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return; final ISourceViewer viewer = getSourceViewer(); - final int caret = widgetOffset2ModelOffset(viewer, viewer.getTextWidget().getCaretOffset()); + final int caret = widgetOffset2ModelOffset(viewer, viewer + .getTextWidget().getCaretOffset()); try { viewer.getDocument().replace(position, caret - position, ""); //$NON-NLS-1$ @@ -2574,7 +2670,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Text operation action to select the previous sub-word. - * + * * @since 3.0 */ protected class SelectPreviousSubWordAction extends PreviousSubWordAction { @@ -2643,39 +2739,59 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // } // }; - private class PropertyChangeListener implements org.eclipse.core.runtime.Preferences.IPropertyChangeListener { + private class PropertyChangeListener implements + org.eclipse.core.runtime.Preferences.IPropertyChangeListener { /* * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent) */ - public void propertyChange(org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) { + public void propertyChange( + org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) { handlePreferencePropertyChanged(event); } }; /** * Finds and marks occurrence annotations. - * + * * @since 3.0 */ - class OccurrencesFinderJob extends Job implements IDocumentListener { + class OccurrencesFinderJob extends Job { private IDocument fDocument; - private boolean fCancelled = false; + private ISelection fSelection; + + private ISelectionValidator fPostSelectionValidator; + + private boolean fCanceled = false; private IProgressMonitor fProgressMonitor; private Position[] fPositions; - public OccurrencesFinderJob(IDocument document, Position[] positions) { - super("Occurrences Marker"); //$NON-NLS-1$ + public OccurrencesFinderJob(IDocument document, Position[] positions, + ISelection selection) { + super(PHPEditorMessages.JavaEditor_markOccurrences_job_name); fDocument = document; + fSelection = selection; fPositions = positions; - fDocument.addDocumentListener(this); + + if (getSelectionProvider() instanceof ISelectionValidator) + fPostSelectionValidator = (ISelectionValidator) getSelectionProvider(); + } + + // cannot use cancel() because it is declared final + void doCancel() { + fCanceled = true; + cancel(); } - private boolean isCancelled() { - return fCancelled || fProgressMonitor.isCanceled(); + private boolean isCanceled() { + return fCanceled + || fProgressMonitor.isCanceled() + || fPostSelectionValidator != null + && !(fPostSelectionValidator.isValid(fSelection) || fForcedMarkOccurrencesSelection == fSelection) + || LinkedModeModel.hasInstalledModel(fDocument); } /* @@ -2685,76 +2801,120 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I fProgressMonitor = progressMonitor; - try { + if (isCanceled()) + return Status.CANCEL_STATUS; - if (isCancelled()) - return Status.CANCEL_STATUS; + ITextViewer textViewer = getViewer(); + if (textViewer == null) + return Status.CANCEL_STATUS; - ITextViewer textViewer = getViewer(); - if (textViewer == null) - return Status.CANCEL_STATUS; - - IDocument document = textViewer.getDocument(); - if (document == null) - return Status.CANCEL_STATUS; + IDocument document = textViewer.getDocument(); + if (document == null) + return Status.CANCEL_STATUS; - IDocumentProvider documentProvider = getDocumentProvider(); - if (documentProvider == null) - return Status.CANCEL_STATUS; + IDocumentProvider documentProvider = getDocumentProvider(); + if (documentProvider == null) + return Status.CANCEL_STATUS; - IAnnotationModel annotationModel = documentProvider.getAnnotationModel(getEditorInput()); - if (annotationModel == null) - return Status.CANCEL_STATUS; + IAnnotationModel annotationModel = documentProvider + .getAnnotationModel(getEditorInput()); + if (annotationModel == null) + return Status.CANCEL_STATUS; - // Add occurrence annotations - int length = fPositions.length; - Map annotationMap = new HashMap(length); - for (int i = 0; i < length; i++) { + // Add occurrence annotations + int length = fPositions.length; + Map annotationMap = new HashMap(length); + for (int i = 0; i < length; i++) { - if (isCancelled()) - return Status.CANCEL_STATUS; + if (isCanceled()) + return Status.CANCEL_STATUS; - String message; - Position position = fPositions[i]; + String message; + Position position = fPositions[i]; - // Create & add annotation - try { - message = document.get(position.offset, position.length); - } catch (BadLocationException ex) { - // Skip this match - continue; - } - annotationMap.put(new Annotation("net.sourceforge.phpdt.ui.occurrences", false, message), //$NON-NLS-1$ - position); + // Create & add annotation + try { + message = document.get(position.offset, position.length); + } catch (BadLocationException ex) { + // Skip this match + continue; } + annotationMap + .put( + new Annotation( + "net.sourceforge.phpdt.ui.occurrences", false, message), //$NON-NLS-1$ + position); + } - if (isCancelled()) - return Status.CANCEL_STATUS; + if (isCanceled()) + return Status.CANCEL_STATUS; - synchronized (annotationModel) { - if (annotationModel instanceof IAnnotationModelExtension) { - ((IAnnotationModelExtension) annotationModel).replaceAnnotations(fOccurrenceAnnotations, annotationMap); - } else { - removeOccurrenceAnnotations(); - Iterator iter = annotationMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry mapEntry = (Map.Entry) iter.next(); - annotationModel.addAnnotation((Annotation) mapEntry.getKey(), (Position) mapEntry.getValue()); - } + synchronized (getLockObject(annotationModel)) { + if (annotationModel instanceof IAnnotationModelExtension) { + ((IAnnotationModelExtension) annotationModel) + .replaceAnnotations(fOccurrenceAnnotations, + annotationMap); + } else { + removeOccurrenceAnnotations(); + Iterator iter = annotationMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry mapEntry = (Map.Entry) iter.next(); + annotationModel.addAnnotation((Annotation) mapEntry + .getKey(), (Position) mapEntry.getValue()); } - fOccurrenceAnnotations = (Annotation[]) annotationMap.keySet().toArray(new Annotation[annotationMap.keySet().size()]); } - } finally { - fDocument.removeDocumentListener(this); + fOccurrenceAnnotations = (Annotation[]) annotationMap.keySet() + .toArray(new Annotation[annotationMap.keySet().size()]); } + return Status.OK_STATUS; } + } + + /** + * Cancels the occurrences finder job upon document changes. + * + * @since 3.0 + */ + class OccurrencesFinderJobCanceler implements IDocumentListener, + ITextInputListener { + + public void install() { + ISourceViewer sourceViewer = getSourceViewer(); + if (sourceViewer == null) + return; + + StyledText text = sourceViewer.getTextWidget(); + if (text == null || text.isDisposed()) + return; + + sourceViewer.addTextInputListener(this); + + IDocument document = sourceViewer.getDocument(); + if (document != null) + document.addDocumentListener(this); + } + + public void uninstall() { + ISourceViewer sourceViewer = getSourceViewer(); + if (sourceViewer != null) + sourceViewer.removeTextInputListener(this); + + IDocumentProvider documentProvider = getDocumentProvider(); + if (documentProvider != null) { + IDocument document = documentProvider + .getDocument(getEditorInput()); + if (document != null) + document.removeDocumentListener(this); + } + } /* * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent) */ public void documentAboutToBeChanged(DocumentEvent event) { - fCancelled = true; + if (fOccurrencesFinderJob != null) + fOccurrencesFinderJob.doCancel(); } /* @@ -2762,33 +2922,151 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I */ public void documentChanged(DocumentEvent event) { } + + /* + * @see org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface.text.IDocument, + * org.eclipse.jface.text.IDocument) + */ + public void inputDocumentAboutToBeChanged(IDocument oldInput, + IDocument newInput) { + if (oldInput == null) + return; + + oldInput.removeDocumentListener(this); + } + + /* + * @see org.eclipse.jface.text.ITextInputListener#inputDocumentChanged(org.eclipse.jface.text.IDocument, + * org.eclipse.jface.text.IDocument) + */ + public void inputDocumentChanged(IDocument oldInput, IDocument newInput) { + if (newInput == null) + return; + newInput.addDocumentListener(this); + } + } + + /** + * Internal activation listener. + * + * @since 3.0 + */ + private class ActivationListener implements IWindowListener { + + /* + * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow) + * @since 3.1 + */ + public void windowActivated(IWorkbenchWindow window) { + if (window == getEditorSite().getWorkbenchWindow() + && fMarkOccurrenceAnnotations && isActivePart()) { + fForcedMarkOccurrencesSelection = getSelectionProvider() + .getSelection(); + SelectionListenerWithASTManager + .getDefault() + .forceSelectionChange( + PHPEditor.this, + (ITextSelection) fForcedMarkOccurrencesSelection); + } + } + + /* + * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow) + * @since 3.1 + */ + public void windowDeactivated(IWorkbenchWindow window) { + if (window == getEditorSite().getWorkbenchWindow() + && fMarkOccurrenceAnnotations && isActivePart()) + removeOccurrenceAnnotations(); + } + + /* + * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow) + * @since 3.1 + */ + public void windowClosed(IWorkbenchWindow window) { + } + + /* + * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow) + * @since 3.1 + */ + public void windowOpened(IWorkbenchWindow window) { + } } /** * Updates the selection in the editor's widget with the selection of the * outline page. */ - class OutlineSelectionChangedListener extends AbstractSelectionChangedListener { + class OutlineSelectionChangedListener extends + AbstractSelectionChangedListener { public void selectionChanged(SelectionChangedEvent event) { doSelectionChanged(event); } } /** + * The internal shell activation listener for updating occurrences. + * + * @since 3.0 + */ + private ActivationListener fActivationListener = new ActivationListener(); + + private ISelectionListenerWithAST fPostSelectionListenerWithAST; + + private OccurrencesFinderJob fOccurrencesFinderJob; + + /** The occurrences finder job canceler */ + private OccurrencesFinderJobCanceler fOccurrencesFinderJobCanceler; + + /** * Holds the current occurrence annotations. - * + * * @since 3.0 */ private Annotation[] fOccurrenceAnnotations = null; - private Job fOccurrencesFinderJob; + /** + * Tells whether all occurrences of the element at the current caret + * location are automatically marked in this editor. + * + * @since 3.0 + */ + private boolean fMarkOccurrenceAnnotations; + + /** + * The selection used when forcing occurrence marking through code. + * + * @since 3.0 + */ + private ISelection fForcedMarkOccurrencesSelection; + + /** + * The document modification stamp at the time when the last occurrence + * marking took place. + * + * @since 3.1 + */ + private long fMarkOccurrenceModificationStamp = IDocumentExtension4.UNKNOWN_MODIFICATION_STAMP; + + /** + * The region of the word under the caret used to when computing the current + * occurrence markings. + * + * @since 3.1 + */ + private IRegion fMarkOccurrenceTargetRegion; + + /** + * Tells whether the occurrence annotations are sticky i.e. whether they + * stay even if there's no valid Java element at the current caret position. + * Only valid if {@link #fMarkOccurrenceAnnotations} is true. + * + * @since 3.0 + */ + private boolean fStickyOccurrenceAnnotations; - /** Preference key for showing the line number ruler */ - // private final static String LINE_NUMBER_RULER = - // PreferenceConstants.EDITOR_LINE_NUMBER_RULER; - /** Preference key for the foreground color of the line numbers */ - // private final static String LINE_NUMBER_COLOR = - // PreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR; /** Preference key for the link color */ private final static String LINK_COLOR = PreferenceConstants.EDITOR_LINK_COLOR; @@ -2819,7 +3097,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // SelectionChangedListener(); /** * The editor selection changed listener. - * + * * @since 3.0 */ private EditorSelectionChangedListener fEditorSelectionChangedListener; @@ -2840,14 +3118,14 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * 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; @@ -2858,27 +3136,27 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * This editor's projection support - * + * * @since 3.0 */ private ProjectionSupport fProjectionSupport; /** * This editor's projection model updater - * + * * @since 3.0 */ 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 */ private FoldingActionGroup fFoldingGroup; @@ -2900,28 +3178,29 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Returns the most narrow java element including the given offset - * + * * @param offset - * the offset inside of the requested element + * the offset inside of the requested element */ abstract protected IJavaElement getElementAt(int offset); /** - * Returns the java element of this editor's input corresponding to the given - * IJavaElement + * Returns the java element of this editor's input corresponding to the + * given IJavaElement */ abstract protected IJavaElement getCorrespondingElement(IJavaElement element); /** * Sets the input of the editor's outline page. */ - abstract protected void setOutlinePageInput(JavaOutlinePage page, IEditorInput input); + abstract protected void setOutlinePageInput(JavaOutlinePage page, + IEditorInput input); /** * Default constructor. */ public PHPEditor() { - super(); + super(); } /* @@ -2938,15 +3217,18 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // jsurfer old code // JavaTextTools textTools = // PHPeclipsePlugin.getDefault().getJavaTextTools(); - // setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools, + // 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, + JavaTextTools textTools = PHPeclipsePlugin.getDefault() + .getJavaTextTools(); + setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools + .getColorManager(), store, this, IPHPPartitions.PHP_PARTITIONING)); - + // TODO changed in 3.x ? // setRangeIndicator(new DefaultRangeIndicator()); // if @@ -2961,10 +3243,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // setSourceViewerConfiguration(new // JavaSourceViewerConfiguration(textTools.getColorManager(), store, // this, IJavaPartitions.JAVA_PARTITIONING)); - // fMarkOccurrenceAnnotations= - // store.getBoolean(PreferenceConstants.EDITOR_MARK_OCCURRENCES); - // fStickyOccurrenceAnnotations= - // store.getBoolean(PreferenceConstants.EDITOR_STICKY_OCCURRENCES); + fMarkOccurrenceAnnotations = store + .getBoolean(PreferenceConstants.EDITOR_MARK_OCCURRENCES); + fStickyOccurrenceAnnotations = store + .getBoolean(PreferenceConstants.EDITOR_STICKY_OCCURRENCES); // fMarkTypeOccurrences= // store.getBoolean(PreferenceConstants.EDITOR_MARK_TYPE_OCCURRENCES); // fMarkMethodOccurrences= @@ -2975,10 +3257,13 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // store.getBoolean(PreferenceConstants.EDITOR_MARK_FIELD_OCCURRENCES); // fMarkLocalVariableypeOccurrences= // store.getBoolean(PreferenceConstants.EDITOR_MARK_LOCAL_VARIABLE_OCCURRENCES); - // fMarkExceptionOccurrences= + // fMarkExceptions= // store.getBoolean(PreferenceConstants.EDITOR_MARK_EXCEPTION_OCCURRENCES); + // fMarkImplementors= + // store.getBoolean(PreferenceConstants.EDITOR_MARK_IMPLEMENTORS); // fMarkMethodExitPoints= // store.getBoolean(PreferenceConstants.EDITOR_MARK_METHOD_EXIT_POINTS); + } /* @@ -2995,28 +3280,36 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I */ private void updateHoverBehavior() { SourceViewerConfiguration configuration = getSourceViewerConfiguration(); - String[] types = configuration.getConfiguredContentTypes(getSourceViewer()); + String[] types = configuration + .getConfiguredContentTypes(getSourceViewer()); for (int i = 0; i < types.length; i++) { String t = types[i]; - int[] stateMasks = configuration.getConfiguredTextHoverStateMasks(getSourceViewer(), t); + int[] stateMasks = configuration.getConfiguredTextHoverStateMasks( + getSourceViewer(), t); ISourceViewer sourceViewer = getSourceViewer(); if (sourceViewer instanceof ITextViewerExtension2) { if (stateMasks != null) { for (int j = 0; j < stateMasks.length; j++) { int stateMask = stateMasks[j]; - ITextHover textHover = configuration.getTextHover(sourceViewer, t, stateMask); - ((ITextViewerExtension2) sourceViewer).setTextHover(textHover, t, stateMask); + ITextHover textHover = configuration.getTextHover( + sourceViewer, t, stateMask); + ((ITextViewerExtension2) sourceViewer).setTextHover( + textHover, t, stateMask); } } else { - ITextHover textHover = configuration.getTextHover(sourceViewer, t); - ((ITextViewerExtension2) sourceViewer).setTextHover(textHover, t, ITextViewerExtension2.DEFAULT_HOVER_STATE_MASK); + ITextHover textHover = configuration.getTextHover( + sourceViewer, t); + ((ITextViewerExtension2) sourceViewer).setTextHover( + textHover, t, + ITextViewerExtension2.DEFAULT_HOVER_STATE_MASK); } } else - sourceViewer.setTextHover(configuration.getTextHover(sourceViewer, t), t); + sourceViewer.setTextHover(configuration.getTextHover( + sourceViewer, t), t); } } @@ -3040,7 +3333,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } boolean isFoldingEnabled() { - return PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_FOLDING_ENABLED); + return PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean( + PreferenceConstants.EDITOR_FOLDING_ENABLED); } /* @@ -3054,34 +3348,44 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I ProjectionViewer projectionViewer = (ProjectionViewer) getSourceViewer(); - fProjectionSupport = new ProjectionSupport(projectionViewer, getAnnotationAccess(), getSharedColors()); - fProjectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.error"); //$NON-NLS-1$ - fProjectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.warning"); //$NON-NLS-1$ - fProjectionSupport.setHoverControlCreator(new IInformationControlCreator() { - public IInformationControl createInformationControl(Shell shell) { - return new CustomSourceInformationControl(shell, IDocument.DEFAULT_CONTENT_TYPE); - } - }); + fProjectionSupport = new ProjectionSupport(projectionViewer, + getAnnotationAccess(), getSharedColors()); + fProjectionSupport + .addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.error"); //$NON-NLS-1$ + fProjectionSupport + .addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.warning"); //$NON-NLS-1$ + fProjectionSupport + .setHoverControlCreator(new IInformationControlCreator() { + public IInformationControl createInformationControl( + Shell shell) { + return new CustomSourceInformationControl(shell, + IDocument.DEFAULT_CONTENT_TYPE); + } + }); fProjectionSupport.install(); - fProjectionModelUpdater = PHPeclipsePlugin.getDefault().getFoldingStructureProviderRegistry().getCurrentFoldingProvider(); + fProjectionModelUpdater = PHPeclipsePlugin.getDefault() + .getFoldingStructureProviderRegistry() + .getCurrentFoldingProvider(); if (fProjectionModelUpdater != null) fProjectionModelUpdater.install(this, projectionViewer); if (isFoldingEnabled()) projectionViewer.doOperation(ProjectionViewer.TOGGLE); - Preferences preferences = PHPeclipsePlugin.getDefault().getPluginPreferences(); + Preferences preferences = PHPeclipsePlugin.getDefault() + .getPluginPreferences(); preferences.addPropertyChangeListener(fPropertyChangeListener); - IInformationControlCreator informationControlCreator = new IInformationControlCreator() { public IInformationControl createInformationControl(Shell parent) { boolean cutDown = false; int style = cutDown ? SWT.NONE : (SWT.V_SCROLL | SWT.H_SCROLL); - return new DefaultInformationControl(parent, SWT.RESIZE, style, new HTMLTextPresenter(cutDown)); + return new DefaultInformationControl(parent, SWT.RESIZE, style, + new HTMLTextPresenter(cutDown)); } }; - fInformationPresenter = new InformationPresenter(informationControlCreator); + fInformationPresenter = new InformationPresenter( + informationControlCreator); fInformationPresenter.setSizeConstraints(60, 10, true, true); fInformationPresenter.install(getSourceViewer()); @@ -3091,24 +3395,57 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (isBrowserLikeLinks()) enableBrowserLikeLinks(); - if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_DISABLE_OVERWRITE_MODE)) + if (PreferenceConstants.getPreferenceStore().getBoolean( + PreferenceConstants.EDITOR_DISABLE_OVERWRITE_MODE)) enableOverwriteMode(false); + if (fMarkOccurrenceAnnotations) + installOccurrencesFinder(); + + PlatformUI.getWorkbench().addWindowListener(fActivationListener); + + /* + * start of EDITOR_SAVE_ON_BLUR + * ed_mann + */ + final PHPEditor editor = this; + FocusListener focusListener = new FocusListener() { + + public void focusGained(FocusEvent e) { + return; + } + + public void focusLost(FocusEvent e) { + //viewer.get + if(editor.isDirty() && PHPeclipsePlugin.getDefault().getPreferenceStore() + .getBoolean(PreferenceConstants.EDITOR_SAVE_ON_BLUR)){ + editor.doSave(null); + } + } + }; + projectionViewer.getTextWidget().addFocusListener(focusListener); + /* + * end of EDITOR_SAVE_ON_BLUR + * ed_mann + */ + setWordWrap(); - // getEditorSite().getShell().addShellListener(fActivationListener); } private void setWordWrap() { if (getSourceViewer() != null) { getSourceViewer().getTextWidget().setWordWrap( - PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_WRAP_WORDS)); + PHPeclipsePlugin.getDefault().getPreferenceStore() + .getBoolean(PreferenceConstants.EDITOR_WRAP_WORDS)); } } - protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) { + protected void configureSourceViewerDecorationSupport( + SourceViewerDecorationSupport support) { support.setCharacterPairMatcher(fBracketMatcher); - support.setMatchingCharacterPainterPreferenceKeys(MATCHING_BRACKETS, MATCHING_BRACKETS_COLOR); + support.setMatchingCharacterPainterPreferenceKeys(MATCHING_BRACKETS, + MATCHING_BRACKETS_COLOR); super.configureSourceViewerDecorationSupport(support); } @@ -3127,19 +3464,23 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * 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 - * true if search direction is forward, - * false if backward + * true if search direction is forward, + * false if backward */ - public void gotoAnnotation(boolean forward) { - ITextSelection selection = (ITextSelection) getSelectionProvider().getSelection(); + public Annotation gotoAnnotation(boolean forward) { + ITextSelection selection = (ITextSelection) getSelectionProvider() + .getSelection(); Position position = new Position(0, 0); + Annotation annotation = null; if (false /* delayed - see bug 18316 */) { - getNextAnnotation(selection.getOffset(), selection.getLength(), forward, position); + annotation = 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); + annotation = getNextAnnotation(selection.getOffset(), selection + .getLength(), forward, position); setStatusLineErrorMessage(null); setStatusLineMessage(null); if (annotation != null) { @@ -3148,13 +3489,14 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I setStatusLineMessage(annotation.getText()); } } + return annotation; } /** * Returns the lock object for the given annotation model. - * + * * @param annotationModel - * the annotation model + * the annotation model * @return the annotation model's lock object * @since 3.0 */ @@ -3167,9 +3509,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Updates the annotation views that show the given annotation. - * + * * @param annotation - * the annotation + * the annotation */ private void updateAnnotationViews(Annotation annotation) { IMarker marker = null; @@ -3192,27 +3534,35 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I 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$ + 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 }); + 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 + // ignore exceptions, don't update any of the lists, just set status + // line } } /** * Returns this document's complete text. - * + * * @return the document's complete text */ public String get() { - IDocument doc = this.getDocumentProvider().getDocument(this.getEditorInput()); + IDocument doc = this.getDocumentProvider().getDocument( + this.getEditorInput()); return doc.get(); } @@ -3242,9 +3592,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I protected void createActions() { super.createActions(); - ActionGroup oeg, ovg, jsg, sg; - fActionGroups = new CompositeActionGroup(new ActionGroup[] { oeg = new OpenEditorActionGroup(this), - // sg= new ShowActionGroup(this), + ActionGroup oeg/*, ovg, jsg, sg*/; + fActionGroups = new CompositeActionGroup( + new ActionGroup[] { oeg = new OpenEditorActionGroup(this), + // sg= new ShowActionGroup(this), // ovg= new OpenViewActionGroup(this), // jsg= new JavaSearchActionGroup(this) }); @@ -3266,7 +3617,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // IJavaHelpContextIds.SHOW_JAVADOC_ACTION); Action action = new GotoMatchingBracketAction(this); - action.setActionDefinitionId(PHPEditorActionDefinitionIds.GOTO_MATCHING_BRACKET); + action + .setActionDefinitionId(PHPEditorActionDefinitionIds.GOTO_MATCHING_BRACKET); setAction(GotoMatchingBracketAction.GOTO_MATCHING_BRACKET, action); // action= new @@ -3336,7 +3688,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // setAction("RemoveOccurrenceAnnotations", action); //$NON-NLS-1$ // add annotation actions - action = new JavaSelectMarkerRulerAction2(PHPEditorMessages.getResourceBundle(), "Editor.RulerAnnotationSelection.", this); //$NON-NLS-1$ + action = new JavaSelectMarkerRulerAction2(PHPEditorMessages + .getResourceBundle(), "Editor.RulerAnnotationSelection.", this); //$NON-NLS-1$ setAction("AnnotationAction", action); //$NON-NLS-1$ } @@ -3346,7 +3699,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (getSourceViewer() instanceof JavaSourceViewer) { JavaSourceViewer viewer = (JavaSourceViewer) getSourceViewer(); if (viewer.getReconciler() == null) { - IReconciler reconciler = getSourceViewerConfiguration().getReconciler(viewer); + IReconciler reconciler = getSourceViewerConfiguration() + .getReconciler(viewer); if (reconciler != null) { reconciler.install(viewer); viewer.setReconciler(reconciler); @@ -3373,8 +3727,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I protected void setPreferenceStore(IPreferenceStore store) { super.setPreferenceStore(store); if (getSourceViewerConfiguration() instanceof PHPSourceViewerConfiguration) { - JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools(); - setSourceViewerConfiguration(new PHPSourceViewerConfiguration(textTools.getColorManager(), store, this, + JavaTextTools textTools = PHPeclipsePlugin.getDefault() + .getJavaTextTools(); + setSourceViewerConfiguration(new PHPSourceViewerConfiguration( + textTools.getColorManager(), store, this, IPHPPartitions.PHP_PARTITIONING)); } if (getSourceViewer() instanceof JavaSourceViewer) @@ -3406,13 +3762,25 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (isBrowserLikeLinks()) disableBrowserLikeLinks(); + // cancel possible running computation + fMarkOccurrenceAnnotations = false; + uninstallOccurrencesFinder(); + + uninstallOverrideIndicator(); + + if (fActivationListener != null) { + PlatformUI.getWorkbench().removeWindowListener(fActivationListener); + fActivationListener = null; + } + if (fEncodingSupport != null) { fEncodingSupport.dispose(); fEncodingSupport = null; } if (fPropertyChangeListener != null) { - Preferences preferences = PHPeclipsePlugin.getDefault().getPluginPreferences(); + Preferences preferences = PHPeclipsePlugin.getDefault() + .getPluginPreferences(); preferences.removePropertyChangeListener(fPropertyChangeListener); fPropertyChangeListener = null; } @@ -3437,8 +3805,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * The PHPEditor implementation of this - * AbstractTextEditor method performs any extra revert behavior - * required by the php editor. + * AbstractTextEditor method performs any extra revert + * behavior required by the php editor. */ // public void doRevertToSaved() { // super.doRevertToSaved(); @@ -3546,7 +3914,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // install & register preference store listener sourceViewer.configure(getSourceViewerConfiguration()); - getSourceViewerDecorationSupport(sourceViewer).install(getPreferenceStore()); + getSourceViewerDecorationSupport(sourceViewer).install( + getPreferenceStore()); if (isBrowserLikeLinks()) enableBrowserLikeLinks(); @@ -3566,10 +3935,13 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I */ public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); - menu.appendToGroup(ITextEditorActionConstants.GROUP_UNDO, new Separator(IContextMenuConstants.GROUP_OPEN)); - menu.insertAfter(IContextMenuConstants.GROUP_OPEN, new GroupMarker(IContextMenuConstants.GROUP_SHOW)); + menu.appendToGroup(ITextEditorActionConstants.GROUP_UNDO, + new Separator(IContextMenuConstants.GROUP_OPEN)); + menu.insertAfter(IContextMenuConstants.GROUP_OPEN, new GroupMarker( + IContextMenuConstants.GROUP_SHOW)); - ActionContext context = new ActionContext(getSelectionProvider().getSelection()); + ActionContext context = new ActionContext(getSelectionProvider() + .getSelection()); fContextMenuGroup.setContext(context); fContextMenuGroup.fillContextMenu(menu); fContextMenuGroup.setContext(null); @@ -3605,28 +3977,30 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } /** - * Synchronizes the outliner selection with the given element position in the - * editor. - * + * Synchronizes the outliner selection with the given element position in + * the editor. + * * @param element - * the java element to select + * the java element to select */ protected void synchronizeOutlinePage(ISourceReference element) { synchronizeOutlinePage(element, true); } /** - * Synchronizes the outliner selection with the given element position in the - * editor. - * + * Synchronizes the outliner selection with the given element position in + * the editor. + * * @param element - * the java element to select + * the java element to select * @param checkIfOutlinePageActive - * true if check for active outline page needs to be - * done + * true if check for active outline page needs to + * be done */ - protected void synchronizeOutlinePage(ISourceReference element, boolean checkIfOutlinePageActive) { - if (fOutlinePage != null && element != null && !(checkIfOutlinePageActive && isJavaOutlinePageActive())) { + protected void synchronizeOutlinePage(ISourceReference element, + boolean checkIfOutlinePageActive) { + if (fOutlinePage != null && element != null + && !(checkIfOutlinePageActive && isJavaOutlinePageActive())) { fOutlineSelectionChangedListener.uninstall(fOutlinePage); fOutlinePage.select(element); fOutlineSelectionChangedListener.install(fOutlinePage); @@ -3634,8 +4008,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } /** - * Synchronizes the outliner selection with the actual cursor position in the - * editor. + * Synchronizes the outliner selection with the actual cursor position in + * the editor. */ public void synchronizeOutlinePageSelection() { synchronizeOutlinePage(computeHighlightRangeSourceReference()); @@ -3672,7 +4046,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I ISelection selection = getSelectionProvider().getSelection(); if (selection instanceof TextSelection) { TextSelection textSelection = (TextSelection) selection; - if (textSelection.getOffset() != 0 || textSelection.getLength() != 0) + if (textSelection.getOffset() != 0 + || textSelection.getLength() != 0) markInNavigationHistory(); } @@ -3764,9 +4139,10 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // IClassFile) // { /* - * If the element is an ICompilationUnit this unit is either the input of - * this editor or not being displayed. In both cases, nothing should - * happened. (http://dev.eclipse.org/bugs/show_bug.cgi?id=5128) + * If the element is an ICompilationUnit this unit is either the + * input of this editor or not being displayed. In both cases, + * nothing should happened. + * (http://dev.eclipse.org/bugs/show_bug.cgi?id=5128) */ return; } @@ -3816,13 +4192,15 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (required == IShowInTargetList.class) { return new IShowInTargetList() { public String[] getShowInTargetIds() { - return new String[] { JavaUI.ID_PACKAGES, IPageLayout.ID_OUTLINE, IPageLayout.ID_RES_NAV }; + return new String[] { JavaUI.ID_PACKAGES, + IPageLayout.ID_OUTLINE, IPageLayout.ID_RES_NAV }; } }; } if (fProjectionSupport != null) { - Object adapter = fProjectionSupport.getAdapter(getSourceViewer(), required); + Object adapter = fProjectionSupport.getAdapter(getSourceViewer(), + required); if (adapter != null) return adapter; } @@ -3879,18 +4257,23 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I IJavaElement element = getElementAt(offset); while (element instanceof ISourceReference) { - ISourceRange range = ((ISourceReference) element).getSourceRange(); - if (offset < range.getOffset() + range.getLength() && range.getOffset() < offset + length) { + ISourceRange range = ((ISourceReference) element) + .getSourceRange(); + if (offset < range.getOffset() + range.getLength() + && range.getOffset() < offset + length) { ISourceViewer viewer = getSourceViewer(); if (viewer instanceof ITextViewerExtension5) { ITextViewerExtension5 extension = (ITextViewerExtension5) viewer; - extension.exposeModelRange(new Region(range.getOffset(), range.getLength())); + extension.exposeModelRange(new Region( + range.getOffset(), range.getLength())); } - setHighlightRange(range.getOffset(), range.getLength(), true); + setHighlightRange(range.getOffset(), range.getLength(), + true); if (fOutlinePage != null) { - fOutlineSelectionChangedListener.uninstall(fOutlinePage); + fOutlineSelectionChangedListener + .uninstall(fOutlinePage); fOutlinePage.select((ISourceReference) element); fOutlineSelectionChangedListener.install(fOutlinePage); } @@ -3973,10 +4356,12 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (PreferenceConstants.EDITOR_TAB_WIDTH.equals(property)) { Object value = event.getNewValue(); if (value instanceof Integer) { - sourceViewer.getTextWidget().setTabs(((Integer) value).intValue()); + sourceViewer.getTextWidget().setTabs( + ((Integer) value).intValue()); } else if (value instanceof String) { try { - sourceViewer.getTextWidget().setTabs(Integer.parseInt((String) value)); + sourceViewer.getTextWidget().setTabs( + Integer.parseInt((String) value)); } catch (NumberFormatException e) { // bug #1038071 - set default tab: sourceViewer.getTextWidget().setTabs(80); @@ -4020,32 +4405,43 @@ 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()) + if (PreferenceConstants.EDITOR_DISABLE_OVERWRITE_MODE + .equals(property)) { + if (event.getNewValue() instanceof Boolean) { + Boolean disable = (Boolean) event.getNewValue(); + enableOverwriteMode(!disable.booleanValue()); + } + return; + } + + boolean newBooleanValue = false; + Object newValue = event.getNewValue(); + if (newValue != null) + newBooleanValue = Boolean.valueOf(newValue.toString()) + .booleanValue(); + + if (PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE + .equals(property)) { + if (newBooleanValue) selectionChanged(); return; } - if (PreferenceConstants.EDITOR_DISABLE_OVERWRITE_MODE.equals(property)) { - if (event.getNewValue() instanceof Boolean) { - Boolean disable = (Boolean) event.getNewValue(); - enableOverwriteMode(!disable.booleanValue()); + if (PreferenceConstants.EDITOR_MARK_OCCURRENCES.equals(property)) { + if (newBooleanValue != fMarkOccurrenceAnnotations) { + fMarkOccurrenceAnnotations = newBooleanValue; + if (!fMarkOccurrenceAnnotations) + uninstallOccurrencesFinder(); + else + installOccurrencesFinder(); } return; } - // if (PreferenceConstants.EDITOR_MARK_OCCURRENCES.equals(property)) - // { - // if (event.getNewValue() instanceof Boolean) { - // boolean markOccurrenceAnnotations= - // ((Boolean)event.getNewValue()).booleanValue(); - // if (markOccurrenceAnnotations != fMarkOccurrenceAnnotations) { - // fMarkOccurrenceAnnotations= markOccurrenceAnnotations; - // if (!fMarkOccurrenceAnnotations) - // uninstallOccurrencesFinder(); - // else - // installOccurrencesFinder(); - // } + if (PreferenceConstants.EDITOR_STICKY_OCCURRENCES.equals(property)) { + fStickyOccurrenceAnnotations = newBooleanValue; + return; + } // } // } // if @@ -4056,16 +4452,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // ((Boolean)event.getNewValue()).booleanValue(); // if (stickyOccurrenceAnnotations != fStickyOccurrenceAnnotations) // { - // fStickyOccurrenceAnnotations= stickyOccurrenceAnnotations; - // // if (!fMarkOccurrenceAnnotations) - // // uninstallOccurrencesFinder(); - // // else - // // installOccurrencesFinder(); - // } - // } - // } - ((PHPSourceViewerConfiguration) getSourceViewerConfiguration()).handlePropertyChangeEvent(event); + ((PHPSourceViewerConfiguration) getSourceViewerConfiguration()) + .handlePropertyChangeEvent(event); // if (affectsOverrideIndicatorAnnotations(event)) { // if (isShowingOverrideIndicators()) { @@ -4084,7 +4473,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (fProjectionModelUpdater != null) fProjectionModelUpdater.uninstall(); // either freshly enabled or provider changed - fProjectionModelUpdater = PHPeclipsePlugin.getDefault().getFoldingStructureProviderRegistry().getCurrentFoldingProvider(); + fProjectionModelUpdater = PHPeclipsePlugin.getDefault() + .getFoldingStructureProviderRegistry() + .getCurrentFoldingProvider(); if (fProjectionModelUpdater != null) { fProjectionModelUpdater.install(this, projectionViewer); } @@ -4171,7 +4562,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Return whether the browser like links should be enabled according to the * preference store settings. - * + * * @return true if the browser like links should be enabled */ private boolean isBrowserLikeLinks() { @@ -4202,16 +4593,18 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Handles a property change event describing a change of the java core's * preferences and updates the preference related editor properties. - * + * * @param event - * the property change event + * the property change event */ - protected void handlePreferencePropertyChanged(org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) { + protected void handlePreferencePropertyChanged( + org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) { if (COMPILER_TASK_TAGS.equals(event.getProperty())) { ISourceViewer sourceViewer = getSourceViewer(); if (sourceViewer != null - && affectsTextPresentation(new PropertyChangeEvent(event.getSource(), event.getProperty(), event.getOldValue(), event - .getNewValue()))) + && affectsTextPresentation(new PropertyChangeEvent(event + .getSource(), event.getProperty(), event + .getOldValue(), event.getNewValue()))) sourceViewer.invalidateTextPresentation(); } if (PreferenceConstants.EDITOR_WRAP_WORDS.equals(event.getProperty())) { @@ -4220,9 +4613,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } /** - * Return whether the line number ruler column should be visible according to - * the preference store settings. - * + * Return whether the line number ruler column should be visible according + * to the preference store settings. + * * @return true if the line numbers should be visible */ // protected boolean isLineNumberRulerVisible() { @@ -4261,9 +4654,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Initializes the given line number ruler column from the preference store. - * + * * @param rulerColumn - * the ruler column to be initialized + * the ruler column to be initialized */ // protected void initializeLineNumberRulerColumn(LineNumberRulerColumn // rulerColumn) { @@ -4441,7 +4834,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * Preference key for key modifier mask of browser like links. The value is * only used if the value of EDITOR_BROWSER_LIKE_LINKS cannot * be resolved to valid SWT modifier bits. - * + * * @since 2.1.1 */ private final static String BROWSER_LIKE_LINKS_KEY_MODIFIER_MASK = PreferenceConstants.EDITOR_BROWSER_LIKE_LINKS_KEY_MODIFIER_MASK; @@ -4460,7 +4853,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return false; try { - return isBracket(document.getChar(offset - 1)) && isBracket(document.getChar(offset)); + return isBracket(document.getChar(offset - 1)) + && isBracket(document.getChar(offset)); } catch (BadLocationException e) { return false; @@ -4520,15 +4914,17 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // } /** * Returns the Java element wrapped by this editors input. - * + * * @return the Java element wrapped by this editors input. * @since 3.0 */ abstract protected IJavaElement getInputJavaElement(); protected void updateStatusLine() { - ITextSelection selection = (ITextSelection) getSelectionProvider().getSelection(); - Annotation annotation = getAnnotation(selection.getOffset(), selection.getLength()); + ITextSelection selection = (ITextSelection) getSelectionProvider() + .getSelection(); + Annotation annotation = getAnnotation(selection.getOffset(), selection + .getLength()); setStatusLineErrorMessage(null); setStatusLineMessage(null); if (annotation != null) { @@ -4538,7 +4934,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } finally { fIsUpdatingAnnotationViews = false; } - if (annotation instanceof IJavaAnnotation && ((IJavaAnnotation) annotation).isProblem()) + if (annotation instanceof IJavaAnnotation + && ((IJavaAnnotation) annotation).isProblem()) setStatusLineMessage(annotation.getText()); } } @@ -4557,7 +4954,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I int selectionLength = Math.abs(selection.getLength()); if (selectionLength > 1) { - setStatusLineErrorMessage(PHPEditorMessages.getString("GotoMatchingBracket.error.invalidSelection")); //$NON-NLS-1$ + setStatusLineErrorMessage(PHPEditorMessages + .getString("GotoMatchingBracket.error.invalidSelection")); //$NON-NLS-1$ sourceViewer.getTextWidget().getDisplay().beep(); return; } @@ -4569,7 +4967,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I IRegion region = fBracketMatcher.match(document, sourceCaretOffset); if (region == null) { - setStatusLineErrorMessage(PHPEditorMessages.getString("GotoMatchingBracket.error.noMatchingBracket")); //$NON-NLS-1$ + setStatusLineErrorMessage(PHPEditorMessages + .getString("GotoMatchingBracket.error.noMatchingBracket")); //$NON-NLS-1$ sourceViewer.getTextWidget().getDisplay().beep(); return; } @@ -4581,19 +4980,23 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return; int anchor = fBracketMatcher.getAnchor(); - int targetOffset = (PHPPairMatcher.RIGHT == anchor) ? offset : offset + length - 1; + int targetOffset = (PHPPairMatcher.RIGHT == anchor) ? offset : offset + + length - 1; boolean visible = false; - if (sourceViewer instanceof ITextViewerExtension3) { - ITextViewerExtension3 extension = (ITextViewerExtension3) sourceViewer; + if (sourceViewer instanceof ITextViewerExtension5) { + ITextViewerExtension5 extension = (ITextViewerExtension5) sourceViewer; visible = (extension.modelOffset2WidgetOffset(targetOffset) > -1); } else { IRegion visibleRegion = sourceViewer.getVisibleRegion(); - visible = (targetOffset >= visibleRegion.getOffset() && targetOffset < visibleRegion.getOffset() + visibleRegion.getLength()); + visible = (targetOffset >= visibleRegion.getOffset() && targetOffset < visibleRegion + .getOffset() + + visibleRegion.getLength()); } if (!visible) { - setStatusLineErrorMessage(PHPEditorMessages.getString("GotoMatchingBracket.error.bracketOutsideSelectedElement")); //$NON-NLS-1$ + setStatusLineErrorMessage(PHPEditorMessages + .getString("GotoMatchingBracket.error.bracketOutsideSelectedElement")); //$NON-NLS-1$ sourceViewer.getTextWidget().getDisplay().beep(); return; } @@ -4607,9 +5010,9 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Ses the given message as error message to this editor's status line. - * + * * @param msg - * message to be set + * message to be set */ protected void setStatusLineErrorMessage(String msg) { IEditorStatusLine statusLine = (IEditorStatusLine) getAdapter(IEditorStatusLine.class); @@ -4619,9 +5022,9 @@ 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 + * message to be set * @since 3.0 */ protected void setStatusLineMessage(String msg) { @@ -4634,19 +5037,20 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * 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 + * the region offset * @param length - * the region length + * the region length * @param forward - * true for forwards, false for - * backward + * true for forwards, false for + * backward * @param annotationPosition - * the position of the found annotation + * the position of the found annotation * @return the found annotation */ - private Annotation getNextAnnotation(final int offset, final int length, boolean forward, Position annotationPosition) { + private Annotation getNextAnnotation(final int offset, final int length, + boolean forward, Position annotationPosition) { Annotation nextAnnotation = null; Position nextAnnotationPosition = null; @@ -4654,26 +5058,32 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I Position containingAnnotationPosition = null; boolean currentAnnotation = false; - IDocument document = getDocumentProvider().getDocument(getEditorInput()); + IDocument document = getDocumentProvider() + .getDocument(getEditorInput()); int endOfDocument = document.getLength(); int distance = Integer.MAX_VALUE; - IAnnotationModel model = getDocumentProvider().getAnnotationModel(getEditorInput()); + 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)) + 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 (forward && p.offset == offset || !forward + && p.offset + p.getLength() == offset + length) {// || + // p.includes(offset)) + // { if (containingAnnotation == null - || (forward && p.length >= containingAnnotationPosition.length || !forward + || (forward + && p.length >= containingAnnotationPosition.length || !forward && p.length >= containingAnnotationPosition.length)) { containingAnnotation = a; containingAnnotationPosition = p; @@ -4687,17 +5097,22 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (currentDistance < 0) currentDistance = endOfDocument + currentDistance; - if (currentDistance < distance || currentDistance == distance && p.length < nextAnnotationPosition.length) { + if (currentDistance < distance + || currentDistance == distance + && p.length < nextAnnotationPosition.length) { distance = currentDistance; nextAnnotation = a; nextAnnotationPosition = p; } } else { - currentDistance = offset + length - (p.getOffset() + p.length); + currentDistance = offset + length + - (p.getOffset() + p.length); if (currentDistance < 0) currentDistance = endOfDocument + currentDistance; - if (currentDistance < distance || currentDistance == distance && p.length < nextAnnotationPosition.length) { + if (currentDistance < distance + || currentDistance == distance + && p.length < nextAnnotationPosition.length) { distance = currentDistance; nextAnnotation = a; nextAnnotationPosition = p; @@ -4705,9 +5120,12 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } } } - if (containingAnnotationPosition != null && (!currentAnnotation || nextAnnotation == null)) { - annotationPosition.setOffset(containingAnnotationPosition.getOffset()); - annotationPosition.setLength(containingAnnotationPosition.getLength()); + if (containingAnnotationPosition != null + && (!currentAnnotation || nextAnnotation == null)) { + annotationPosition.setOffset(containingAnnotationPosition + .getOffset()); + annotationPosition.setLength(containingAnnotationPosition + .getLength()); return containingAnnotation; } if (nextAnnotationPosition != null) { @@ -4721,16 +5139,17 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Returns the annotation overlapping with the given range or * null. - * + * * @param offset - * the region offset + * the region offset * @param length - * the region length + * the region length * @return the found annotation or null * @since 3.0 */ private Annotation getAnnotation(int offset, int length) { - IAnnotationModel model = getDocumentProvider().getAnnotationModel(getEditorInput()); + IAnnotationModel model = getDocumentProvider().getAnnotationModel( + getEditorInput()); Iterator e = new JavaAnnotationIterator(model, true, true); while (e.hasNext()) { Annotation a = (Annotation) e.next(); @@ -4746,47 +5165,55 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } /** - * Returns whether the given annotation is configured as a target for the "Go - * to Next/Previous Annotation" actions - * + * Returns whether the given annotation is configured as a target for the + * "Go to Next/Previous Annotation" actions + * * @param annotation - * the annotation + * the annotation * @return true if this is a target, false * otherwise * @since 3.0 */ - private boolean isNavigationTarget(Annotation annotation) { + protected boolean isNavigationTarget(Annotation annotation) { Preferences preferences = EditorsUI.getPluginPreferences(); - AnnotationPreference preference = getAnnotationPreferenceLookup().getAnnotationPreference(annotation); + AnnotationPreference preference = getAnnotationPreferenceLookup() + .getAnnotationPreference(annotation); // See bug 41689 // String key= forward ? preference.getIsGoToNextNavigationTargetKey() : // preference.getIsGoToPreviousNavigationTargetKey(); - String key = preference == null ? null : preference.getIsGoToNextNavigationTargetKey(); + 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. - * + * bidi rendering. The default implementation returns only the string + * literals of a php code line as segments. + * * @param document - * the document + * the document * @param lineOffset - * the offset of the line + * the offset of the line * @return the line's bidi segmentation * @throws BadLocationException - * in case lineOffset is not valid in document + * in case lineOffset is not valid in document */ - public static int[] getBidiLineSegments(IDocument document, int lineOffset) throws BadLocationException { + public static int[] getBidiLineSegments(IDocument document, int lineOffset) + throws BadLocationException { IRegion line = document.getLineInformationOfOffset(lineOffset); - ITypedRegion[] linePartitioning = document.computePartitioning(lineOffset, line.getLength()); + ITypedRegion[] linePartitioning = document.computePartitioning (lineOffset, line.getLength()); List segmentation = new ArrayList(); + for (int i = 0; i < linePartitioning.length; i++) { - if (IPHPPartitions.PHP_STRING_DQ.equals(linePartitioning[i].getType())) - segmentation.add(linePartitioning[i]); + if (IPHPPartitions.PHP_STRING_DQ.equals (linePartitioning[i].getType())) { + segmentation.add (linePartitioning[i]); + } + else if (IPHPPartitions.PHP_STRING_HEREDOC.equals (linePartitioning[i].getType())) { + segmentation.add (linePartitioning[i]); + } } if (segmentation.size() == 0) @@ -4825,11 +5252,11 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * Returns a segmentation of the given line appropriate for bidi rendering. * The default implementation returns only the string literals of a php code * line as segments. - * + * * @param lineOffset - * the offset of the line + * the offset of the line * @param line - * the content of the line + * the content of the line * @return the line's bidi segmentation */ protected int[] getBidiLineSegments(int lineOffset, String line) { @@ -4847,7 +5274,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } /* - * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int) + * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, + * int) */ // protected final ISourceViewer createSourceViewer( // Composite parent, @@ -4890,7 +5318,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // return store.getBoolean(OVERVIEW_RULER); // } /* - * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int) + * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, + * int) */ // protected ISourceViewer createJavaSourceViewer( // Composite parent, @@ -4902,25 +5331,32 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // isOverviewRulerVisible(), styles); // } /* - * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int) + * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, + * int) */ - protected ISourceViewer createJavaSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, + protected ISourceViewer createJavaSourceViewer(Composite parent, + IVerticalRuler verticalRuler, IOverviewRuler overviewRuler, boolean isOverviewRulerVisible, int styles, IPreferenceStore store) { - return new JavaSourceViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles, store); + return new JavaSourceViewer(parent, verticalRuler, getOverviewRuler(), + isOverviewRulerVisible(), styles, store); } /* - * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, int) + * @see AbstractTextEditor#createSourceViewer(Composite, IVerticalRuler, + * int) */ - protected final ISourceViewer createSourceViewer(Composite parent, IVerticalRuler verticalRuler, int styles) { + protected final ISourceViewer createSourceViewer(Composite parent, + IVerticalRuler verticalRuler, int styles) { - ISourceViewer viewer = createJavaSourceViewer(parent, verticalRuler, getOverviewRuler(), isOverviewRulerVisible(), styles, + ISourceViewer viewer = createJavaSourceViewer(parent, verticalRuler, + getOverviewRuler(), isOverviewRulerVisible(), styles, getPreferenceStore()); StyledText text = viewer.getTextWidget(); text.addBidiSegmentListener(new BidiSegmentListener() { public void lineGetSegments(BidiSegmentEvent event) { - event.segments = getBidiLineSegments(event.lineOffset, event.lineText); + event.segments = getBidiLineSegments(event.lineOffset, + event.lineText); } }); @@ -4937,23 +5373,25 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * @see AbstractTextEditor#affectsTextPresentation(PropertyChangeEvent) */ protected boolean affectsTextPresentation(PropertyChangeEvent event) { - return ((PHPSourceViewerConfiguration) getSourceViewerConfiguration()).affectsTextPresentation(event) + return ((PHPSourceViewerConfiguration) getSourceViewerConfiguration()) + .affectsTextPresentation(event) || super.affectsTextPresentation(event); } // // protected boolean affectsTextPresentation(PropertyChangeEvent event) { - // JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools(); + // JavaTextTools textTools = + // PHPeclipsePlugin.getDefault().getJavaTextTools(); // return textTools.affectsBehavior(event); // } /** * Creates and returns the preference store for this Java editor with the * given input. - * + * * @param input - * The editor input for which to create the preference store + * The editor input for which to create the preference store * @return the preference store for this editor - * + * * @since 3.0 */ private IPreferenceStore createCombinedPreferenceStore(IEditorInput input) { @@ -4961,25 +5399,31 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I IJavaProject project = EditorUtility.getJavaProject(input); if (project != null) - stores.add(new OptionsAdapter(project.getOptions(false), PHPeclipsePlugin.getDefault().getMockupPreferenceStore(), + stores.add(new OptionsAdapter(project.getOptions(false), + PHPeclipsePlugin.getDefault().getMockupPreferenceStore(), new OptionsAdapter.IPropertyChangeEventFilter() { public boolean isFiltered(PropertyChangeEvent event) { IJavaElement inputJavaElement = getInputJavaElement(); - IJavaProject javaProject = inputJavaElement != null ? inputJavaElement.getJavaProject() : null; + IJavaProject javaProject = inputJavaElement != null ? inputJavaElement + .getJavaProject() + : null; if (javaProject == null) return true; - return !javaProject.getProject().equals(event.getSource()); + return !javaProject.getProject().equals( + event.getSource()); } })); stores.add(PHPeclipsePlugin.getDefault().getPreferenceStore()); - stores.add(new PreferencesAdapter(JavaCore.getPlugin().getPluginPreferences())); + stores.add(new PreferencesAdapter(JavaCore.getPlugin() + .getPluginPreferences())); stores.add(EditorsUI.getPreferenceStore()); - return new ChainedPreferenceStore((IPreferenceStore[]) stores.toArray(new IPreferenceStore[stores.size()])); + return new ChainedPreferenceStore((IPreferenceStore[]) stores + .toArray(new IPreferenceStore[stores.size()])); } /** @@ -4991,7 +5435,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I ITextSelection s = (ITextSelection) provider.getSelection(); Position errorPosition = new Position(0, 0); - IJavaAnnotation nextError = getNextError(s.getOffset(), forward, errorPosition); + IJavaAnnotation nextError = getNextError(s.getOffset(), forward, + errorPosition); if (nextError != null) { @@ -5013,14 +5458,16 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (marker != null) { IWorkbenchPage page = getSite().getPage(); - IViewPart view = view = page.findView("org.eclipse.ui.views.TaskList"); //$NON-NLS-1$ + IViewPart view = view = page + .findView("org.eclipse.ui.views.TaskList"); //$NON-NLS-1$ if (view instanceof TaskList) { StructuredSelection ss = new StructuredSelection(marker); ((TaskList) view).setSelection(ss, true); } } - selectAndReveal(errorPosition.getOffset(), errorPosition.getLength()); + selectAndReveal(errorPosition.getOffset(), errorPosition + .getLength()); // setStatusLineErrorMessage(nextError.getMessage()); } else { @@ -5030,16 +5477,19 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } } - private IJavaAnnotation getNextError(int offset, boolean forward, Position errorPosition) { + private IJavaAnnotation getNextError(int offset, boolean forward, + Position errorPosition) { IJavaAnnotation nextError = null; Position nextErrorPosition = null; - IDocument document = getDocumentProvider().getDocument(getEditorInput()); + IDocument document = getDocumentProvider() + .getDocument(getEditorInput()); int endOfDocument = document.getLength(); int distance = 0; - IAnnotationModel model = getDocumentProvider().getAnnotationModel(getEditorInput()); + IAnnotationModel model = getDocumentProvider().getAnnotationModel( + getEditorInput()); Iterator e = new JavaAnnotationIterator(model, false); while (e.hasNext()) { @@ -5055,11 +5505,13 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (forward) { currentDistance = p.getOffset() - offset; if (currentDistance < 0) - currentDistance = endOfDocument - offset + p.getOffset(); + currentDistance = endOfDocument - offset + + p.getOffset(); } else { currentDistance = offset - p.getOffset(); if (currentDistance < 0) - currentDistance = offset + endOfDocument - p.getOffset(); + currentDistance = offset + endOfDocument + - p.getOffset(); } if (nextError == null || currentDistance < distance) { @@ -5078,26 +5530,6 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I return nextError; } - void removeOccurrenceAnnotations() { - IDocumentProvider documentProvider = getDocumentProvider(); - if (documentProvider == null) - return; - - IAnnotationModel annotationModel = documentProvider.getAnnotationModel(getEditorInput()); - if (annotationModel == null || fOccurrenceAnnotations == null) - return; - - synchronized (annotationModel) { - if (annotationModel instanceof IAnnotationModelExtension) { - ((IAnnotationModelExtension) annotationModel).replaceAnnotations(fOccurrenceAnnotations, null); - } else { - for (int i = 0, length = fOccurrenceAnnotations.length; i < length; i++) - annotationModel.removeAnnotation(fOccurrenceAnnotations[i]); - } - fOccurrenceAnnotations = null; - } - } - protected void uninstallOverrideIndicator() { // if (fOverrideIndicatorManager != null) { // fOverrideIndicatorManager.removeAnnotations(); @@ -5107,7 +5539,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I protected void installOverrideIndicator(boolean waitForReconcilation) { uninstallOverrideIndicator(); - IAnnotationModel model = getDocumentProvider().getAnnotationModel(getEditorInput()); + IAnnotationModel model = getDocumentProvider().getAnnotationModel( + getEditorInput()); final IJavaElement inputElement = getInputJavaElement(); if (model == null || inputElement == null) @@ -5118,7 +5551,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // // if (provideAST) { // Job job= new - // Job(JavaEditorMessages.getString("OverrideIndicatorManager.intallJob")) { + // Job(JavaEditorMessages.getString("OverrideIndicatorManager.intallJob")) + // { // //$NON-NLS-1$ // /* // * @see @@ -5129,7 +5563,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // CompilationUnit ast= // JavaPlugin.getDefault().getASTProvider().getAST(inputElement, true, // null); - // if (fOverrideIndicatorManager != null) // editor might have been closed + // if (fOverrideIndicatorManager != null) // editor might have been + // closed // in the meanwhile // fOverrideIndicatorManager.reconciled(ast, true, monitor); // return Status.OK_STATUS; @@ -5143,7 +5578,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Tells whether override indicators are shown. - * + * * @return true if the override indicators are shown * @since 3.0 */ @@ -5158,22 +5593,23 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I // } /** * Returns the boolean preference for the given key. - * + * * @param store - * the preference store + * the preference store * @param key - * the preference key - * @return true if the key exists in the store and its value is - * true + * the preference key + * @return true if the key exists in the store and its value + * is true * @since 3.0 */ - private boolean getBoolean(IPreferenceStore store, String key) { - return key != null && store.getBoolean(key); - } +// private boolean getBoolean(IPreferenceStore store, String key) { +// return key != null && store.getBoolean(key); +// } protected boolean isPrefQuickDiffAlwaysOn() { - return false; // never show change ruler for the non-editable java editor. - // Overridden in subclasses like PHPUnitEditor + return false; // never show change ruler for the non-editable java + // editor. + // Overridden in subclasses like PHPUnitEditor } /* @@ -5189,11 +5625,13 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I setAction(ITextEditorActionDefinitionIds.LINE_START, action); action = new SmartLineStartAction(textWidget, true); - action.setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_LINE_START); + action + .setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_LINE_START); setAction(ITextEditorActionDefinitionIds.SELECT_LINE_START, action); action = new NavigatePreviousSubWordAction(); - action.setActionDefinitionId(ITextEditorActionDefinitionIds.WORD_PREVIOUS); + action + .setActionDefinitionId(ITextEditorActionDefinitionIds.WORD_PREVIOUS); setAction(ITextEditorActionDefinitionIds.WORD_PREVIOUS, action); textWidget.setKeyBinding(SWT.CTRL | SWT.ARROW_LEFT, SWT.NULL); @@ -5203,60 +5641,107 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I textWidget.setKeyBinding(SWT.CTRL | SWT.ARROW_RIGHT, SWT.NULL); action = new SelectPreviousSubWordAction(); - action.setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_WORD_PREVIOUS); + action + .setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_WORD_PREVIOUS); setAction(ITextEditorActionDefinitionIds.SELECT_WORD_PREVIOUS, action); - textWidget.setKeyBinding(SWT.CTRL | SWT.SHIFT | SWT.ARROW_LEFT, SWT.NULL); + textWidget.setKeyBinding(SWT.CTRL | SWT.SHIFT | SWT.ARROW_LEFT, + SWT.NULL); action = new SelectNextSubWordAction(); - action.setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_WORD_NEXT); + action + .setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_WORD_NEXT); setAction(ITextEditorActionDefinitionIds.SELECT_WORD_NEXT, action); - textWidget.setKeyBinding(SWT.CTRL | SWT.SHIFT | SWT.ARROW_RIGHT, SWT.NULL); + textWidget.setKeyBinding(SWT.CTRL | SWT.SHIFT | SWT.ARROW_RIGHT, + SWT.NULL); } /* * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#createCompositeRuler() */ - protected CompositeRuler createCompositeRuler() { - if (!getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_ANNOTATION_ROLL_OVER)) - return super.createCompositeRuler(); - - CompositeRuler ruler = new CompositeRuler(); - AnnotationRulerColumn column = new AnnotationRulerColumn(VERTICAL_RULER_WIDTH, getAnnotationAccess()); - column.setHover(new JavaExpandHover(ruler, getAnnotationAccess(), new IDoubleClickListener() { - - public void doubleClick(DoubleClickEvent event) { - // for now: just invoke ruler double click action - triggerAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK); - } - - private void triggerAction(String actionID) { - IAction action = getAction(actionID); - if (action != null) { - if (action instanceof IUpdate) - ((IUpdate) action).update(); - // hack to propagate line change - if (action instanceof ISelectionListener) { - ((ISelectionListener) action).selectionChanged(null, null); + // protected CompositeRuler createCompositeRuler() { + // if + // (!getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_ANNOTATION_ROLL_OVER)) + // return super.createCompositeRuler(); + // + // CompositeRuler ruler = new CompositeRuler(); + // AnnotationRulerColumn column = new + // AnnotationRulerColumn(VERTICAL_RULER_WIDTH, getAnnotationAccess()); + // column.setHover(new JavaExpandHover(ruler, getAnnotationAccess(), new + // IDoubleClickListener() { + // + // public void doubleClick(DoubleClickEvent event) { + // // for now: just invoke ruler double click action + // triggerAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK); + // } + // + // private void triggerAction(String actionID) { + // IAction action = getAction(actionID); + // if (action != null) { + // if (action instanceof IUpdate) + // ((IUpdate) action).update(); + // // hack to propagate line change + // if (action instanceof ISelectionListener) { + // ((ISelectionListener) action).selectionChanged(null, null); + // } + // if (action.isEnabled()) + // action.run(); + // } + // } + // + // })); + // ruler.addDecorator(0, column); + // + // if (isLineNumberRulerVisible()) + // ruler.addDecorator(1, createLineNumberRulerColumn()); + // else if (isPrefQuickDiffAlwaysOn()) + // ruler.addDecorator(1, createChangeRulerColumn()); + // + // return ruler; + // } + /* + * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#createAnnotationRulerColumn(org.eclipse.jface.text.source.CompositeRuler) + * @since 3.2 + */ + protected IVerticalRulerColumn createAnnotationRulerColumn( + CompositeRuler ruler) { + if (!getPreferenceStore().getBoolean( + PreferenceConstants.EDITOR_ANNOTATION_ROLL_OVER)) + return super.createAnnotationRulerColumn(ruler); + + AnnotationRulerColumn column = new AnnotationRulerColumn( + VERTICAL_RULER_WIDTH, getAnnotationAccess()); + column.setHover(new JavaExpandHover(ruler, getAnnotationAccess(), + new IDoubleClickListener() { + + public void doubleClick(DoubleClickEvent event) { + // for now: just invoke ruler double click action + triggerAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK); } - if (action.isEnabled()) - action.run(); - } - } - })); - ruler.addDecorator(0, column); + private void triggerAction(String actionID) { + IAction action = getAction(actionID); + if (action != null) { + if (action instanceof IUpdate) + ((IUpdate) action).update(); + // hack to propagate line change + if (action instanceof ISelectionListener) { + ((ISelectionListener) action).selectionChanged( + null, null); + } + if (action.isEnabled()) + action.run(); + } + } - if (isLineNumberRulerVisible()) - ruler.addDecorator(1, createLineNumberRulerColumn()); - else if (isPrefQuickDiffAlwaysOn()) - ruler.addDecorator(1, createChangeRulerColumn()); + })); - return ruler; + return column; } /** - * Returns the folding action group, or null if there is none. - * + * Returns the folding action group, or null if there is + * none. + * * @return the folding action group, or null if there is none * @since 3.0 */ @@ -5294,14 +5779,15 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * React to changed selection. - * + * * @since 3.0 */ protected void selectionChanged() { if (getSelectionProvider() == null) return; ISourceReference element = computeHighlightRangeSourceReference(); - if (getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE)) + if (getPreferenceStore().getBoolean( + PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE)) synchronizeOutlinePage(element); setSelection(element, false); updateStatusLine(); @@ -5309,7 +5795,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I private boolean isJavaOutlinePageActive() { IWorkbenchPart part = getActivePart(); - return part instanceof ContentOutline && ((ContentOutline) part).getCurrentPage() == fOutlinePage; + return part instanceof ContentOutline + && ((ContentOutline) part).getCurrentPage() == fOutlinePage; } private IWorkbenchPart getActivePart() { @@ -5323,7 +5810,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I * Computes and returns the source reference that includes the caret and * serves as provider for the outline page selection and the editor range * indication. - * + * * @return the computed source reference * @since 3.0 */ @@ -5339,7 +5826,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I int caret = 0; if (sourceViewer instanceof ITextViewerExtension5) { ITextViewerExtension5 extension = (ITextViewerExtension5) sourceViewer; - caret = extension.widgetOffset2ModelOffset(styledText.getCaretOffset()); + caret = extension.widgetOffset2ModelOffset(styledText + .getCaretOffset()); } else { int offset = sourceViewer.getVisibleRegion().getOffset(); caret = offset + styledText.getCaretOffset(); @@ -5353,7 +5841,8 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I if (element.getElementType() == IJavaElement.IMPORT_DECLARATION) { IImportDeclaration declaration = (IImportDeclaration) element; - IImportContainer container = (IImportContainer) declaration.getParent(); + IImportContainer container = (IImportContainer) declaration + .getParent(); ISourceRange srcRange = null; try { @@ -5370,12 +5859,12 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I /** * Returns the most narrow java element including the given offset. - * + * * @param offset - * the offset inside of the requested element + * the offset inside of the requested element * @param reconcile - * true if editor input should be reconciled in - * advance + * true if editor input should be reconciled in + * advance * @return the most narrow java element * @since 3.0 */ @@ -5384,15 +5873,233 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements I } public ShowInContext getShowInContext() { - FileEditorInput fei = (FileEditorInput) getEditorInput(); - ShowInContext context = BrowserUtil.getShowInContext(fei.getFile(), false, ""); - if (context!=null) { + IFile file = null; + if(getEditorInput() instanceof FileStoreEditorInput){ + FileStoreEditorInput fei = (FileStoreEditorInput) getEditorInput(); + file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fei.getURI().getPath())); + } else if (getEditorInput() instanceof FileEditorInput) { + FileEditorInput fei = (FileEditorInput) getEditorInput(); + // added to fix ticket 637 + file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fei.getURI().getPath())); + } else if (getEditorInput() instanceof ExternalEditorInput) { + ExternalEditorInput fei = (ExternalEditorInput) getEditorInput(); + file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fei.getFullPath()/* .getURI().getPath()*/)); + } + + ShowInContext context = BrowserUtil.getShowInContext(file, + false, ""); + if (context != null) { return context; } - return new ShowInContext(fei.getFile(), null); + return new ShowInContext(file, null); } public String[] getShowInTargetIds() { return new String[] { BrowserView.ID_BROWSER }; } + + /** + * Updates the occurrences annotations based on the current selection. + * + * @param selection + * the text selection + * @param astRoot + * the compilation unit AST + * @since 3.0 + */ + protected void updateOccurrenceAnnotations(ITextSelection selection) {// , + // CompilationUnit + // astRoot) + // { + + if (fOccurrencesFinderJob != null) + fOccurrencesFinderJob.cancel(); + + if (!fMarkOccurrenceAnnotations) + return; + + // if (astRoot == null || selection == null) + if (selection == null) + return; + + IDocument document = getSourceViewer().getDocument(); + if (document == null) + return; + + fMarkOccurrenceTargetRegion = null; + if (document instanceof IDocumentExtension4) { + int offset = selection.getOffset(); + long currentModificationStamp = ((IDocumentExtension4) document) + .getModificationStamp(); + if (fMarkOccurrenceTargetRegion != null + && currentModificationStamp == fMarkOccurrenceModificationStamp) { + if (fMarkOccurrenceTargetRegion.getOffset() <= offset + && offset <= fMarkOccurrenceTargetRegion.getOffset() + + fMarkOccurrenceTargetRegion.getLength()) + return; + } + fMarkOccurrenceTargetRegion = JavaWordFinder.findWord(document, + offset); + fMarkOccurrenceModificationStamp = currentModificationStamp; + } + + if (fMarkOccurrenceTargetRegion == null + || fMarkOccurrenceTargetRegion.getLength() == 0) { + return; + } + + List matches = null; + + if (matches == null) { + try { + matches = new ArrayList(); + + Scanner fScanner = new Scanner(); + fScanner.setSource(document.get().toCharArray()); + fScanner.setPHPMode(false); + String wordStr; + char[] word; + + wordStr = document.get(fMarkOccurrenceTargetRegion.getOffset(), + fMarkOccurrenceTargetRegion.getLength()); + if (wordStr != null) { + word = wordStr.toCharArray(); + TokenName fToken = ITerminalSymbols.TokenName.EOF; + try { + fToken = fScanner.getNextToken(); + while (fToken != ITerminalSymbols.TokenName.EOF) { // && + // fToken + // != + // TokenName.ERROR) { + if (fToken == ITerminalSymbols.TokenName.VARIABLE + || fToken == ITerminalSymbols.TokenName.IDENTIFIER) { + // global variable + if (fScanner.equalsCurrentTokenSource(word)) { + matches + .add(new Region( + fScanner + .getCurrentTokenStartPosition(), + fScanner + .getCurrentTokenEndPosition() + - fScanner + .getCurrentTokenStartPosition() + + 1)); + } + } + fToken = fScanner.getNextToken(); + } + } catch (InvalidInputException e) { + // ignore errors + } catch (SyntaxError e) { + // ignore errors + } + } + } catch (BadLocationException e1) { + // ignore errors + } catch (Exception e) { + e.printStackTrace(); + // ignore errors + } + + } + + if (matches == null || matches.size() == 0) { + if (!fStickyOccurrenceAnnotations) + removeOccurrenceAnnotations(); + return; + } + + Position[] positions = new Position[matches.size()]; + int i = 0; + for (Iterator each = matches.iterator(); each.hasNext();) { + IRegion currentNode = (IRegion) each.next(); + positions[i++] = new Position(currentNode.getOffset(), currentNode + .getLength()); + } + + fOccurrencesFinderJob = new OccurrencesFinderJob(document, positions, + selection); + // fOccurrencesFinderJob.setPriority(Job.DECORATE); + // fOccurrencesFinderJob.setSystem(true); + // fOccurrencesFinderJob.schedule(); + fOccurrencesFinderJob.run(new NullProgressMonitor()); + } + + protected void installOccurrencesFinder() { + fMarkOccurrenceAnnotations = true; + + fPostSelectionListenerWithAST = new ISelectionListenerWithAST() { + public void selectionChanged(IEditorPart part, + ITextSelection selection) { // , + // CompilationUnit + // astRoot) + // { + updateOccurrenceAnnotations(selection);// , astRoot); + } + }; + SelectionListenerWithASTManager.getDefault().addListener(this, + fPostSelectionListenerWithAST); + if (getSelectionProvider() != null) { + fForcedMarkOccurrencesSelection = getSelectionProvider() + .getSelection(); + SelectionListenerWithASTManager.getDefault().forceSelectionChange( + this, (ITextSelection) fForcedMarkOccurrencesSelection); + } + + if (fOccurrencesFinderJobCanceler == null) { + fOccurrencesFinderJobCanceler = new OccurrencesFinderJobCanceler(); + fOccurrencesFinderJobCanceler.install(); + } + } + + protected void uninstallOccurrencesFinder() { + fMarkOccurrenceAnnotations = false; + + if (fOccurrencesFinderJob != null) { + fOccurrencesFinderJob.cancel(); + fOccurrencesFinderJob = null; + } + + if (fOccurrencesFinderJobCanceler != null) { + fOccurrencesFinderJobCanceler.uninstall(); + fOccurrencesFinderJobCanceler = null; + } + + if (fPostSelectionListenerWithAST != null) { + SelectionListenerWithASTManager.getDefault().removeListener(this, + fPostSelectionListenerWithAST); + fPostSelectionListenerWithAST = null; + } + + removeOccurrenceAnnotations(); + } + + protected boolean isMarkingOccurrences() { + return fMarkOccurrenceAnnotations; + } + + void removeOccurrenceAnnotations() { + fMarkOccurrenceModificationStamp = IDocumentExtension4.UNKNOWN_MODIFICATION_STAMP; + fMarkOccurrenceTargetRegion = null; + + IDocumentProvider documentProvider = getDocumentProvider(); + if (documentProvider == null) + return; + + IAnnotationModel annotationModel = documentProvider + .getAnnotationModel(getEditorInput()); + if (annotationModel == null || fOccurrenceAnnotations == null) + return; + + synchronized (getLockObject(annotationModel)) { + if (annotationModel instanceof IAnnotationModelExtension) { + ((IAnnotationModelExtension) annotationModel) + .replaceAnnotations(fOccurrenceAnnotations, null); + } else { + for (int i = 0, length = fOccurrenceAnnotations.length; i < length; i++) + annotationModel.removeAnnotation(fOccurrenceAnnotations[i]); + } + fOccurrenceAnnotations = null; + } + } } \ No newline at end of file