IDEA-57693
authorAlexey Kudravtsev <cdr@intellij.com>
Thu, 19 Aug 2010 07:34:50 +0000 (11:34 +0400)
committerAlexey Kudravtsev <cdr@intellij.com>
Thu, 19 Aug 2010 07:50:28 +0000 (11:50 +0400)
platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java

index d6e0d4b1be3ca509eb6d5a08c0cf2af3305e79d1..53d4bc087fe9049d601e59746ddca2278fa97fc4 100644 (file)
  */
 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;
@@ -45,7 +45,7 @@ import java.awt.*;
 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();
@@ -57,6 +57,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener {
   private int myVisualLineEnd;
   private TextAttributes myTextAttributes;
   private boolean myIsInUpdate;
+  private RangeMarker savedBeforeBulkCaretMarker;
 
   public CaretModelImpl(EditorImpl editor) {
     myEditor = editor;
@@ -67,6 +68,29 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener {
     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) {
@@ -518,6 +542,11 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener {
     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.
    */
index c1470204dc3f1e70dd4bff8aac090a4b59a35156..df4d6018850933504719b07dce5bd28d38ec1c34 100644 (file)
@@ -540,6 +540,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
     myPlainFontMetrics = null;
     myScrollingModel.dispose();
     myGutterComponent.dispose();
+    Disposer.dispose(myCaretModel);
     clearCaretThread();
     //myFoldingModel.dispose(); TODO range marker tree
   }