From e5187ca2be1241e48d5432e309b8d94ea770e110 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 16 May 2017 12:29:32 +0300 Subject: [PATCH] introduce default offsetToXY/offsetToPoint2D methods in Editor interface (with more effective implementation in EditorImpl) --- .../com/intellij/openapi/editor/Editor.java | 36 +++++++++++++++++++ .../openapi/editor/impl/EditorImpl.java | 14 ++++++-- .../openapi/editor/impl/ImmediatePainter.java | 2 +- .../openapi/editor/impl/AbstractRtlTest.java | 4 +-- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java index 43e82dbb9bdc..da846e50b988 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java @@ -284,6 +284,42 @@ public interface Editor extends UserDataHolder { @NotNull VisualPosition xyToVisualPosition(@NotNull Point2D p); + /** + * @since 2017.2 + */ + @NotNull + default Point offsetToXY(int offset) { + return offsetToXY(offset, false, false); + } + + /** + * @see #offsetToVisualPosition(int, boolean, boolean) + * @since 2017.2 + */ + @NotNull + default Point offsetToXY(int offset, boolean leanForward, boolean beforeSoftWrap) { + VisualPosition visualPosition = offsetToVisualPosition(offset, leanForward, beforeSoftWrap); + return visualPositionToXY(visualPosition); + } + + /** + * @since 2017.2 + */ + @NotNull + default Point2D offsetToPoint2D(int offset) { + return offsetToPoint2D(offset, false, false); + } + + /** + * @see #offsetToVisualPosition(int, boolean, boolean) + * @since 2017.2 + */ + @NotNull + default Point2D offsetToPoint2D(int offset, boolean leanForward, boolean beforeSoftWrap) { + VisualPosition visualPosition = offsetToVisualPosition(offset, leanForward, beforeSoftWrap); + return visualPositionToPoint2D(visualPosition); + } + /** * Adds a listener for receiving notifications about mouse clicks in the editor and * the mouse entering/exiting the editor. diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index f975e004b82d..f846111dedbb 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -1250,11 +1250,19 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi return myView.xyToVisualPosition(p); } + @Override @NotNull - Point2D offsetToXY(int offset, boolean leanTowardsLargerOffsets) { - return myView.offsetToXY(offset, leanTowardsLargerOffsets, false); + public Point2D offsetToPoint2D(int offset, boolean leanTowardsLargerOffsets, boolean beforeSoftWrap) { + return myView.offsetToXY(offset, leanTowardsLargerOffsets, beforeSoftWrap); } - + + @Override + @NotNull + public Point offsetToXY(int offset, boolean leanForward, boolean beforeSoftWrap) { + Point2D point2D = offsetToPoint2D(offset, leanForward, beforeSoftWrap); + return new Point((int)point2D.getX(), (int)point2D.getY()); + } + @Override @NotNull public VisualPosition offsetToVisualPosition(int offset) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ImmediatePainter.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ImmediatePainter.java index a27f3c658e4d..fe634099a9a5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ImmediatePainter.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ImmediatePainter.java @@ -144,7 +144,7 @@ class ImmediatePainter { final Font font1 = EditorUtil.fontForChar(c1, attributes1.getFontType(), editor).getFont(); final Font font2 = EditorUtil.fontForChar(c1, attributes2.getFontType(), editor).getFont(); - final Point2D p2 = editor.offsetToXY(offset, false); + final Point2D p2 = editor.offsetToPoint2D(offset); float p2x = (float)p2.getX(); int p2y = (int)p2.getY(); int width1i = (int)(p2x) - (int)(p2x - width1); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/AbstractRtlTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/AbstractRtlTest.java index c7fd18e21954..54df8119f3f7 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/AbstractRtlTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/AbstractRtlTest.java @@ -65,8 +65,8 @@ public abstract class AbstractRtlTest extends AbstractEditorTest { visualPositionTowardsLargerOffsets, myEditor.offsetToVisualPosition(offset, true, false)); assertEquals("Wrong afterOffset->visualLine calculation", visualPositionTowardsLargerOffsets.line, ((EditorImpl)myEditor).offsetToVisualLine(offset)); - assertEquals("Wrong beforeOffset->xy calculation", xyTowardsSmallerOffsets, ((EditorImpl)myEditor).offsetToXY(offset, false)); - assertEquals("Wrong afterOffset->xy calculation", xyTowardsLargerOffsets, ((EditorImpl)myEditor).offsetToXY(offset, true)); + assertEquals("Wrong beforeOffset->xy calculation", xyTowardsSmallerOffsets, myEditor.offsetToXY(offset, false, false)); + assertEquals("Wrong afterOffset->xy calculation", xyTowardsLargerOffsets, myEditor.offsetToXY(offset, true, false)); } protected static void checkLPConversions(int logicalColumn, int offset,