From de9ed4b2f88b2362fe67c2773d53aef2b5e218ed Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Mon, 20 Feb 2017 16:40:54 +0300 Subject: [PATCH] IDEA-168452 Backspace does not change cursor position handle bulk mode correctly (it's not possible to read caret position in bulk mode) --- .../openapi/wm/impl/status/PositionPanel.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/PositionPanel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/PositionPanel.java index 70cca110ea70..fdaacb9ac186 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/PositionPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/PositionPanel.java @@ -16,9 +16,12 @@ package com.intellij.openapi.wm.impl.status; import com.intellij.ide.util.GotoLineNumberDialog; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.event.*; +import com.intellij.openapi.editor.ex.DocumentBulkUpdateListener; +import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.fileEditor.FileEditorManagerEvent; import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory; import com.intellij.openapi.project.Project; @@ -27,6 +30,7 @@ import com.intellij.openapi.wm.StatusBarWidget; import com.intellij.ui.UIBundle; import com.intellij.util.Alarm; import com.intellij.util.Consumer; +import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -34,7 +38,8 @@ import java.awt.*; import java.awt.event.MouseEvent; public class PositionPanel extends EditorBasedWidget - implements StatusBarWidget.Multiframe, StatusBarWidget.TextPresentation, CaretListener, SelectionListener, DocumentListener { + implements StatusBarWidget.Multiframe, StatusBarWidget.TextPresentation, + CaretListener, SelectionListener, DocumentListener, DocumentBulkUpdateListener { private static final int CHAR_COUNT_SYNC_LIMIT = 500_000; private static final String CHAR_COUNT_UNKNOWN = "..."; @@ -111,6 +116,8 @@ public class PositionPanel extends EditorBasedWidget multicaster.addCaretListener(this, this); multicaster.addSelectionListener(this, this); multicaster.addDocumentListener(this, this); + MessageBusConnection connection = ApplicationManager.getApplication().getMessageBus().connect(this); + connection.subscribe(DocumentBulkUpdateListener.TOPIC, this); } @Override @@ -140,6 +147,19 @@ public class PositionPanel extends EditorBasedWidget @Override public void documentChanged(DocumentEvent event) { Document document = event.getDocument(); + if (document instanceof DocumentEx && ((DocumentEx)document).isInBulkUpdate()) return; + onDocumentUpdate(document); + } + + @Override + public void updateStarted(@NotNull Document doc) {} + + @Override + public void updateFinished(@NotNull Document doc) { + onDocumentUpdate(doc); + } + + private void onDocumentUpdate(Document document) { Editor[] editors = EditorFactory.getInstance().getEditors(document); Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); for (Editor editor : editors) {