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 7174cd533ff7..bc8db2ba70a0 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 @@ -4591,7 +4591,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi private void setCursorPosition() { final List caretPoints = new ArrayList(); for (Caret caret : getCaretModel().getAllCarets()) { - boolean isRtl = myUseNewRendering && myView.isRtlLocation(caret.getOffset()); + boolean isRtl = myUseNewRendering && myView.isRtlLocation(caret.getOffset(), caret.getLogicalPosition().leansForward); VisualPosition caretPosition = caret.getVisualPosition(); Point pos1 = visualPositionToXY(caretPosition); Point pos2 = visualPositionToXY(new VisualPosition(caretPosition.line, Math.max(0, caretPosition.column + (isRtl ? -1 : 1)))); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorView.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorView.java index 8ccaf69dceb8..79f44decbb5b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorView.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorView.java @@ -260,11 +260,12 @@ public class EditorView implements Disposable { myTextLayoutCache.resetToDocumentSize(); } - public boolean isRtlLocation(int offset) { + public boolean isRtlLocation(int offset, boolean leanForward) { + assertIsDispatchThread(); if (myDocument.getTextLength() == 0) return false; int line = myDocument.getLineNumber(offset); LineLayout layout = getLineLayout(line); - return layout.isRtlLocation(offset - myDocument.getLineStartOffset(line)); + return layout.isRtlLocation(offset - myDocument.getLineStartOffset(line), leanForward); } @NotNull diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/LineLayout.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/LineLayout.java index 1affb497a748..7260caae957b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/LineLayout.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/LineLayout.java @@ -204,9 +204,10 @@ class LineLayout { return myBidiRunsInLogicalOrder.length == 0 || myBidiRunsInLogicalOrder.length == 1 && !myBidiRunsInLogicalOrder[0].isRtl(); } - boolean isRtlLocation(int offset) { + boolean isRtlLocation(int offset, boolean leanForward) { + if (offset == 0 && !leanForward) return false; for (BidiRun run : myBidiRunsInLogicalOrder) { - if (offset < run.endOffset) return run.isRtl(); + if (offset < run.endOffset || offset == run.endOffset && !leanForward) return run.isRtl(); } return false; }