Bug 522103 - Refactor usage of StyledText#getOffsetAtLocation(Point)

Mostly reverted to previous state to keep IAE handling that might is
needed by calls of other StyledText methods that throw IAE.

Change-Id: Iaed70b5845735b13c524379df5b31a0bbe595d29
Signed-off-by: Karsten Thoms <karsten.thoms@itemis.de>
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/JFaceTextUtil.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/JFaceTextUtil.java
index d03195a..32a6514 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/JFaceTextUtil.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/JFaceTextUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2016 IBM Corporation and others.
+ * Copyright (c) 2006, 2018 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -420,27 +420,33 @@
 	 * @since 3.5
 	 */
 	public static int getOffsetForCursorLocation(ITextViewer viewer) {
-		StyledText text= viewer.getTextWidget();
-		if (text == null || text.isDisposed())
-			return -1;
+		try {
+			StyledText text= viewer.getTextWidget();
+			if (text == null || text.isDisposed()) {
+				return -1;
+			}
 
-		Display display= text.getDisplay();
-		Point absolutePosition= display.getCursorLocation();
-		Point relativePosition= text.toControl(absolutePosition);
+			Display display= text.getDisplay();
+			Point absolutePosition= display.getCursorLocation();
+			Point relativePosition= text.toControl(absolutePosition);
 
-		int widgetOffset= text.getOffsetAtPoint(relativePosition);
-		if (widgetOffset == -1) {
+			int widgetOffset= text.getOffsetAtPoint(relativePosition);
+			if (widgetOffset == -1) {
+				return -1;
+			}
+			Point p= text.getLocationAtOffset(widgetOffset);
+			if (p.x > relativePosition.x) {
+				widgetOffset--;
+			}
+
+			if (viewer instanceof ITextViewerExtension5) {
+				ITextViewerExtension5 extension= (ITextViewerExtension5)viewer;
+				return extension.widgetOffset2ModelOffset(widgetOffset);
+			}
+
+			return widgetOffset + viewer.getVisibleRegion().getOffset();
+		} catch (IllegalArgumentException e) {
 			return -1;
 		}
-		Point p= text.getLocationAtOffset(widgetOffset);
-		if (p.x > relativePosition.x)
-			widgetOffset--;
-
-		if (viewer instanceof ITextViewerExtension5) {
-			ITextViewerExtension5 extension= (ITextViewerExtension5)viewer;
-			return extension.widgetOffset2ModelOffset(widgetOffset);
-		}
-
-		return widgetOffset + viewer.getVisibleRegion().getOffset();
 	}
 }
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java
index 9a3aa22..27a4978 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/TextViewerHoverManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * Copyright (c) 2000, 2018 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -259,21 +259,26 @@
 	 * @return the document offset corresponding to the given point
 	 */
 	private int computeOffsetAtLocation(int x, int y) {
-		StyledText styledText= fTextViewer.getTextWidget();
-		int widgetOffset= styledText.getOffsetAtPoint(new Point(x, y));
-		if (widgetOffset == -1) {
+		try {
+			StyledText styledText= fTextViewer.getTextWidget();
+			int widgetOffset= styledText.getOffsetAtPoint(new Point(x, y));
+			if (widgetOffset == -1) {
+				return -1;
+			}
+			Point p= styledText.getLocationAtOffset(widgetOffset);
+			if (p.x > x) {
+				widgetOffset--;
+			}
+
+			if (fTextViewer instanceof ITextViewerExtension5) {
+				ITextViewerExtension5 extension= (ITextViewerExtension5) fTextViewer;
+				return extension.widgetOffset2ModelOffset(widgetOffset);
+			}
+
+			return widgetOffset + fTextViewer._getVisibleRegionOffset();
+		} catch (IllegalArgumentException e) {
 			return -1;
 		}
-		Point p= styledText.getLocationAtOffset(widgetOffset);
-		if (p.x > x)
-			widgetOffset--;
-
-		if (fTextViewer instanceof ITextViewerExtension5) {
-			ITextViewerExtension5 extension= (ITextViewerExtension5) fTextViewer;
-			return extension.widgetOffset2ModelOffset(widgetOffset);
-		}
-
-		return widgetOffset + fTextViewer._getVisibleRegionOffset();
 	}
 
 	@Override
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/WhitespaceCharacterPainter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/WhitespaceCharacterPainter.java
index 06a2cee..37348b6 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/WhitespaceCharacterPainter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/WhitespaceCharacterPainter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2017 Wind River Systems, Inc., IBM Corporation and others.
+ * Copyright (c) 2006, 2018 Wind River Systems, Inc., IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -265,8 +265,7 @@
 				endOffset= fTextWidget.getOffsetAtPoint(new Point(x + w - 1, y)) + 1;
 				if (endOffset == -1) {
 					endOffset= lineEndOffset;
-				}
-				if (endOffset + 2 >= lineEndOffset) {
+				} else if (endOffset + 2 >= lineEndOffset) {
 					endOffset= lineEndOffset;
 				}
 			}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java
index 5aa667f..dbe7d09 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationPainter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
+ * Copyright (c) 2000, 2018 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -1455,35 +1455,46 @@
 			return new Region(vOffset, vLength);
 		}
 
-		int widgetOffset;
+		int widgetOffset= -1;
 		int widgetClippingStartOffset= fTextWidget.getOffsetAtPoint(new Point(0, event.y));
 		if (widgetClippingStartOffset != -1) {
-			int firstWidgetLine= fTextWidget.getLineAtOffset(widgetClippingStartOffset);
-			widgetOffset= fTextWidget.getOffsetAtLine(firstWidgetLine);
-		} else {
+			try {
+				int firstWidgetLine= fTextWidget.getLineAtOffset(widgetClippingStartOffset);
+				widgetOffset= fTextWidget.getOffsetAtLine(firstWidgetLine);
+			} catch (IllegalArgumentException ex) {
+				/* ignore; keep widgetOffset at -1 */
+			}
+		}
+		if (widgetOffset == -1) {
 			try {
 				int firstVisibleLine= JFaceTextUtil.getPartialTopIndex(fTextWidget);
 				widgetOffset= fTextWidget.getOffsetAtLine(firstVisibleLine);
-			} catch (IllegalArgumentException ex2) { // above try code might fail too
+			} catch (IllegalArgumentException ex) { // above try code might fail
 				widgetOffset= 0;
 			}
 		}
 
-		int widgetEndOffset;
+		int widgetEndOffset= -1;
 		int widgetClippingEndOffset= fTextWidget.getOffsetAtPoint(new Point(0, event.y + event.height));
 		if (widgetClippingEndOffset != -1) {
-			int lastWidgetLine= fTextWidget.getLineAtOffset(widgetClippingEndOffset);
-			widgetEndOffset= fTextWidget.getOffsetAtLine(lastWidgetLine + 1);
-		} else {
+			try {
+				int lastWidgetLine= fTextWidget.getLineAtOffset(widgetClippingEndOffset);
+				widgetEndOffset= fTextWidget.getOffsetAtLine(lastWidgetLine + 1);
+			} catch (IllegalArgumentException ex1) {
+				/* ignore; keep widgetEndOffset at -1 */
+			}
+		}
+		if (widgetEndOffset == -1) {
 			// happens if the editor is not "full", e.g. the last line of the document is visible in the editor
 			try {
 				int lastVisibleLine= JFaceTextUtil.getPartialBottomIndex(fTextWidget);
-				if (lastVisibleLine == fTextWidget.getLineCount() - 1)
+				if (lastVisibleLine == fTextWidget.getLineCount() - 1) {
 					// last line
 					widgetEndOffset= fTextWidget.getCharCount();
-				else
+				} else {
 					widgetEndOffset= fTextWidget.getOffsetAtLine(lastVisibleLine + 1) - 1;
-			} catch (IllegalArgumentException ex2) { // above try code might fail too
+				}
+			} catch (IllegalArgumentException ex) { // above try code might fail too
 				widgetEndOffset= fTextWidget.getCharCount();
 			}
 		}
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
index 965f311..e57e427 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2018 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -1899,23 +1899,26 @@
 			StyledText styledText= textViewer.getTextWidget();
 			IDocument document= textViewer.getDocument();
 
-			if (document == null)
-				return -1;
-
 			int widgetOffset = styledText.getOffsetAtPoint(new Point(x, y));
-			if (widgetOffset == -1) {
+			if (document == null || widgetOffset == -1) {
 				return -1;
 			}
-			Point p = styledText.getLocationAtOffset(widgetOffset);
-			if (p.x > x)
-				widgetOffset--;
 
-			if (textViewer instanceof ITextViewerExtension5) {
-				ITextViewerExtension5 extension = (ITextViewerExtension5) textViewer;
-				return extension.widgetOffset2ModelOffset(widgetOffset);
+			try {
+				Point p= styledText.getLocationAtOffset(widgetOffset);
+				if (p.x > x) {
+					widgetOffset--;
+				}
+
+				if (textViewer instanceof ITextViewerExtension5) {
+					ITextViewerExtension5 extension= (ITextViewerExtension5) textViewer;
+					return extension.widgetOffset2ModelOffset(widgetOffset);
+				}
+				IRegion visibleRegion= textViewer.getVisibleRegion();
+				return widgetOffset + visibleRegion.getOffset();
+			} catch (IllegalArgumentException e) {
+				return -1;
 			}
-			IRegion visibleRegion = textViewer.getVisibleRegion();
-			return widgetOffset + visibleRegion.getOffset();
 		}
 	}
 
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/AbstractTemplatesPage.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/AbstractTemplatesPage.java
index d0e0a2a..c4bc44f 100644
--- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/AbstractTemplatesPage.java
+++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/templates/AbstractTemplatesPage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2012 Dakshinamurthy Karra, IBM Corporation and others.
+ * Copyright (c) 2007, 2018 Dakshinamurthy Karra, IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -1571,15 +1571,16 @@
 		int widgetCaret= fViewer.getTextWidget().getCaretOffset();
 		if (fViewer instanceof ITextViewerExtension5) {
 			ITextViewerExtension5 ext= (ITextViewerExtension5) fViewer;
-			try {
-				return ext.widgetOffset2ModelOffset(textWidget.getOffsetAtPoint(point));
-			} catch (IllegalArgumentException e) {
+			int widgetOffset = textWidget.getOffsetAtPoint(point);
+			int offset = widgetOffset != -1 ? ext.widgetOffset2ModelOffset(textWidget.getOffsetAtPoint(point)) : -1;
+			if (offset == -1) {
 				int docLineIndex= ext.widgetLine2ModelLine(textWidget.getLineIndex(point.y));
 				String lineDelimiter= document.getLineDelimiter(docLineIndex);
 				int delimLength= lineDelimiter == null ? 0 : lineDelimiter.length();
 				return document.getLineOffset(docLineIndex) + document.getLineLength(docLineIndex)
 						- delimLength;
 			}
+			return offset;
 		}
 		IRegion visible= fViewer.getVisibleRegion();
 		return widgetCaret + visible.getOffset();