From 0e7ece86b6be27cc17f90ddcb183a56d17bf4fa4 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Fri, 15 Jul 2016 13:29:37 +0300 Subject: [PATCH] make sure 'normal' token order is always LTR (even if default bidi text direction is set to RTL) --- .../openapi/editor/impl/view/LineLayout.java | 4 ++++ .../openapi/editor/impl/EditorRtlTest.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+) 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 6475fff14b40..563d34246c42 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 @@ -162,6 +162,10 @@ abstract class LineLayout { } private static void addRuns(List runs, char[] text, int start, int end, int flags) { + if (!Bidi.requiresBidi(text, start, end)) { + addOrMergeRun(runs, new BidiRun((byte)0, start, end)); + return; + } int afterLastTabPosition = start; for (int i = start; i < end; i++) { if (text[i] == '\t') { diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorRtlTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorRtlTest.java index 51e68b780087..7dbfcc702db5 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorRtlTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorRtlTest.java @@ -19,6 +19,8 @@ import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.VisualPosition; +import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; +import com.intellij.openapi.editor.ex.BidiTextDirection; import com.intellij.testFramework.TestFileType; import java.awt.*; @@ -579,6 +581,19 @@ public class EditorRtlTest extends AbstractEditorTest { checkResult("RR"); assertTrue(myEditor.getCaretModel().getPrimaryCaret().isAtBidiRunBoundary()); } + + public void testTokenOrderIsAlwaysLtr() throws Exception { + BidiTextDirection savedValue = EditorSettingsExternalizable.getInstance().getBidiTextDirection(); + try { + EditorSettingsExternalizable.getInstance().setBidiTextDirection(BidiTextDirection.RTL); + prepare("R", TestFileType.XML); + right(); + checkResult("<a>R"); + } + finally { + EditorSettingsExternalizable.getInstance().setBidiTextDirection(savedValue); + } + } private void prepareText(String text) throws IOException { prepare(text, TestFileType.TEXT);