IDEA-168452 Backspace does not change cursor position

handle bulk mode correctly (it's not possible to read caret position in bulk mode)
This commit is contained in:
Dmitry Batrak
2017-02-20 16:42:25 +03:00
parent 754000e2b9
commit de9ed4b2f8
@@ -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) {