[Bug 536622] [genericeditor] Improve performance of default highlight
when cursor move a lot

Change-Id: I9ea187023a27c0d2d64ba780a14ea4a91f5686fe
Signed-off-by: angelozerr <angelo.zerr@gmail.com>
diff --git a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/DefaultWordHighlightStrategy.java b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/DefaultWordHighlightStrategy.java
index e5822ac..d082b57 100644
--- a/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/DefaultWordHighlightStrategy.java
+++ b/org.eclipse.ui.genericeditor/src/org/eclipse/ui/internal/genericeditor/DefaultWordHighlightStrategy.java
@@ -25,6 +25,7 @@
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.ISynchronizable;
+import org.eclipse.jface.text.ITextSelection;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.ITextViewerExtension5;
 import org.eclipse.jface.text.Position;
@@ -35,9 +36,10 @@
 import org.eclipse.jface.text.source.IAnnotationModel;
 import org.eclipse.jface.text.source.IAnnotationModelExtension;
 import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.custom.CaretEvent;
-import org.eclipse.swt.custom.CaretListener;
 
 /**
  *
@@ -52,7 +54,7 @@
  *
  */
 public class DefaultWordHighlightStrategy
-		implements IReconcilingStrategy, IReconcilingStrategyExtension, CaretListener, IPreferenceChangeListener {
+		implements IReconcilingStrategy, IReconcilingStrategyExtension, IPreferenceChangeListener {
 
 	private static final String ANNOTATION_TYPE = "org.eclipse.ui.genericeditor.text"; //$NON-NLS-1$
 
@@ -67,14 +69,20 @@
 
 	private Annotation[] fOccurrenceAnnotations = null;
 
-	private void applyHighlights(int offset) {
+	private ISelectionChangedListener editorSelectionChangedListener = event -> applyHighlights(event.getSelection());
+
+	private void applyHighlights(ISelection selection) {
+		if (!(selection instanceof ITextSelection)) {
+			return;
+		}
+		ITextSelection textSelection = (ITextSelection) selection;
 		if (sourceViewer == null || !enabled) {
 			removeOccurrenceAnnotations();
 			return;
 		}
 
 		String text = document.get();
-		offset = ((ITextViewerExtension5) sourceViewer).widgetOffset2ModelOffset(offset);
+		int offset = ((ITextViewerExtension5) sourceViewer).widgetOffset2ModelOffset(textSelection.getOffset());
 
 		String word = findCurrentWord(text, offset);
 		if (word == null) {
@@ -143,12 +151,14 @@
 		preferences.addPreferenceChangeListener(this);
 		this.enabled = preferences.getBoolean(ToggleHighlight.TOGGLE_HIGHLIGHT_PREFERENCE, true);
 		this.sourceViewer = (ISourceViewer) viewer;
-		this.sourceViewer.getTextWidget().addCaretListener(this);
+		((IPostSelectionProvider) sourceViewer.getSelectionProvider())
+				.addPostSelectionChangedListener(editorSelectionChangedListener);
 	}
 
 	public void uninstall() {
 		if (sourceViewer != null) {
-			sourceViewer.getTextWidget().removeCaretListener(this);
+			((IPostSelectionProvider) sourceViewer.getSelectionProvider())
+					.removePostSelectionChangedListener(editorSelectionChangedListener);
 		}
 		IEclipsePreferences preferences = InstanceScope.INSTANCE.getNode(GenericEditorPlugin.BUNDLE_ID);
 		preferences.removePreferenceChangeListener(this);
@@ -167,16 +177,11 @@
 	}
 
 	@Override
-	public void caretMoved(CaretEvent event) {
-		applyHighlights(event.caretOffset);
-	}
-
-	@Override
 	public void initialReconcile() {
 		if (sourceViewer != null) {
 			sourceViewer.getTextWidget().getDisplay().asyncExec(() -> {
 				if (sourceViewer != null && sourceViewer.getTextWidget() != null) {
-					applyHighlights(sourceViewer.getTextWidget().getCaretOffset());
+					applyHighlights(sourceViewer.getSelectionProvider().getSelection());
 				}
 			});
 		}