*/
package com.intellij.openapi.editor.impl;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.event.CaretEvent;
import com.intellij.openapi.editor.event.CaretListener;
import com.intellij.openapi.editor.event.DocumentEvent;
-import com.intellij.openapi.editor.ex.DocumentEx;
-import com.intellij.openapi.editor.ex.EditorGutterComponentEx;
-import com.intellij.openapi.editor.ex.PrioritizedDocumentListener;
+import com.intellij.openapi.editor.ex.*;
import com.intellij.openapi.editor.ex.util.EditorUtil;
import com.intellij.openapi.editor.impl.event.DocumentEventImpl;
import com.intellij.openapi.editor.impl.softwrap.SoftWrapHelper;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
-public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener {
+public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, Disposable {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.impl.CaretModelImpl");
private final EditorImpl myEditor;
private final CopyOnWriteArrayList<CaretListener> myCaretListeners = ContainerUtil.createEmptyCOWList();
private int myVisualLineEnd;
private TextAttributes myTextAttributes;
private boolean myIsInUpdate;
+ private RangeMarker savedBeforeBulkCaretMarker;
public CaretModelImpl(EditorImpl editor) {
myEditor = editor;
myVisualLineStart = 0;
Document doc = editor.getDocument();
myVisualLineEnd = doc.getLineCount() > 1 ? doc.getLineStartOffset(1) : doc.getLineCount() == 0 ? 0 : doc.getLineEndOffset(0);
+ DocumentBulkUpdateListener bulkUpdateListener = new DocumentBulkUpdateListener() {
+ @Override
+ public void updateStarted(Document doc) {
+ if (doc != myEditor.getDocument()) return;
+ savedBeforeBulkCaretMarker = doc.createRangeMarker(myOffset, myOffset);
+ }
+ @Override
+ public void updateFinished(Document doc) {
+ if (doc != myEditor.getDocument()) return;
+ if (savedBeforeBulkCaretMarker != null && savedBeforeBulkCaretMarker.isValid()) {
+ moveToOffset(savedBeforeBulkCaretMarker.getStartOffset());
+ }
+ releaseBulkCaretMarker((DocumentEx)doc);
+ }
+ };
+ ApplicationManager.getApplication().getMessageBus().connect(this).subscribe(DocumentBulkUpdateListener.TOPIC, bulkUpdateListener);
+ }
+
+ private void releaseBulkCaretMarker(DocumentEx doc) {
+ if (savedBeforeBulkCaretMarker != null) {
+ doc.removeRangeMarker((RangeMarkerEx)savedBeforeBulkCaretMarker);
+ savedBeforeBulkCaretMarker = null;
+ }
}
public void moveToVisualPosition(VisualPosition pos) {
return new VerticalInfo(y, height);
}
+ @Override
+ public void dispose() {
+ releaseBulkCaretMarker((DocumentEx)myEditor.getDocument());
+ }
+
/**
* Encapsulates information about target vertical range info - its <code>'y'</code> coordinate and height in pixels.
*/