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();