From eb9e44f43525e117e0377ccb02514822c48539b2 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Thu, 29 Sep 2016 19:10:16 +0300 Subject: [PATCH] EA-89180 - ISE: EditorView.offsetToVisualPosition --- .../openapi/editor/impl/CaretImpl.java | 1 - .../openapi/editor/impl/CaretModelImpl.java | 12 ++++++---- .../openapi/editor/impl/EditorImplTest.java | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java index 874685d1ac0a..49fae09f8d03 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java @@ -825,7 +825,6 @@ public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable { void afterDocumentChange(@NotNull final DocumentEventImpl event) { final DocumentEx document = myEditor.getDocument(); - if (document.isInBulkUpdate()) return; boolean performSoftWrapAdjustment = event.getNewLength() > 0 // We want to put caret just after the last added symbol // There is a possible case that the user removes text just before the soft wrap. We want to keep caret // on a visual line with soft wrap start then. diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java index 38e79c6f6b6c..ffb1e98d7fe7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java @@ -81,11 +81,13 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, isDocumentChanged = true; try { myIsInUpdate = false; - doWithCaretMerging(() -> { - for (CaretImpl caret : myCarets) { - caret.afterDocumentChange((DocumentEventImpl)e); - } - }); + if (!myEditor.getDocument().isInBulkUpdate()) { + doWithCaretMerging(() -> { + for (CaretImpl caret : myCarets) { + caret.afterDocumentChange((DocumentEventImpl)e); + } + }); + } } finally { isDocumentChanged = false; diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java index 0a0191ed796f..ea857bb068a3 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/EditorImplTest.java @@ -137,6 +137,29 @@ public class EditorImplTest extends AbstractEditorTest { checkResultByText("something\telse"); } + public void testCaretMergeDuringBulkModeDocumentUpdate() throws Exception { + initText("abcdefg\n" + + "abcdefg"); + new WriteCommandAction.Simple(getProject()) { + @Override + protected void run() throws Throwable { + DocumentEx document = (DocumentEx)myEditor.getDocument(); + document.setInBulkUpdate(true); + try { + // delete selected text + document.deleteString(1, 6); + document.deleteString(4, 9); + } + finally { + document.setInBulkUpdate(false); + } + } + }.execute().throwException(); + + checkResultByText("ag\n" + + "ag"); + } + public void testPositionCalculationForOneCharacterFolds() throws Exception { initText("something"); addCollapsedFoldRegion(1, 2, "...");