don't perform coordinate conversions in EditorSizeManager when soft wrap model is...
authorDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Fri, 6 Nov 2015 19:46:28 +0000 (22:46 +0300)
committerDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Fri, 6 Nov 2015 19:53:28 +0000 (22:53 +0300)
fixes EA-75267 - AIOOBE: TIntArrayList.insert

platform/core-impl/src/com/intellij/openapi/editor/impl/EditorDocumentPriorities.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java

index 157231cbbb362a86a417e28b6c73eb1851872c07..677da409294c240d82033ab3f7dd813a7333e94e 100644 (file)
@@ -35,9 +35,9 @@ public class EditorDocumentPriorities {
   public static final int FOLD_MODEL = 60;
   public static final int LOGICAL_POSITION_CACHE = 65;
   public static final int EDITOR_TEXT_LAYOUT_CACHE = 70;
-  public static final int EDITOR_TEXT_WIDTH_CACHE = 75;
   public static final int LEXER_EDITOR = 80;
   public static final int SOFT_WRAP_MODEL = 100;
+  public static final int EDITOR_TEXT_WIDTH_CACHE = 110;
   public static final int CARET_MODEL = 120;
   public static final int SELECTION_MODEL = 140;
   public static final int EDITOR_DOCUMENT_ADAPTER = 160;
index 7b5f21a3ddf899fdcd481579337b3ac19da7eac8..556dd39d4481302e11e3f3e8fe4b88d25303216f 100644 (file)
@@ -1832,6 +1832,10 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
   }
 
   private void bulkUpdateStarted() {
+    if (myUseNewRendering) {
+      myView.getPreferredSize(); // make sure size is calculated (in case it will be required while bulk mode is active)
+    }
+    
     saveCaretRelativePosition();
 
     myCaretModel.onBulkDocumentUpdateStarted();
index b9ce1d8684f938438226498c4b6fdd8da225d922..e41b3efc46a379f3b8b2b633a3f9a3b4de001762 100644 (file)
@@ -58,6 +58,11 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
   private int myMaxLineWithExtensionWidth;
   private int myWidestLineWithExtension;
   
+  private int myDocumentChangeStartOffset;
+  private int myDocumentChangeEndOffset;
+  private int myFoldingChangeStartOffset = Integer.MAX_VALUE;
+  private int myFoldingChangeEndOffset = Integer.MIN_VALUE;
+  
   private final List<TextRange> myDeferredRanges = new ArrayList<TextRange>();
   
   private final SoftWrapAwareDocumentParsingListenerAdapter mySoftWrapChangeListener = new SoftWrapAwareDocumentParsingListenerAdapter() {
@@ -88,31 +93,34 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
 
   @Override
   public void beforeDocumentChange(DocumentEvent event) {
+    if (myDocument.isInBulkUpdate()) return;
+    myDocumentChangeStartOffset = event.getOffset();
+    myDocumentChangeEndOffset = event.getOffset() + event.getNewLength();
   }
 
   @Override
   public void documentChanged(DocumentEvent event) {
-    invalidateRange(event.getOffset(), event.getOffset() + event.getNewLength());
+    if (myDocument.isInBulkUpdate()) return;
+    doInvalidateRange(myDocumentChangeStartOffset, myDocumentChangeEndOffset);
   }
   
-  private int foldingChangeStartOffset = Integer.MAX_VALUE;
-  private int foldingChangeEndOffset = Integer.MIN_VALUE;
-  
   @Override
   public void onFoldRegionStateChange(@NotNull FoldRegion region) {
+    if (myDocument.isInBulkUpdate()) return;
     if (region.isValid()) {
-      foldingChangeStartOffset = Math.min(foldingChangeStartOffset, region.getStartOffset());
-      foldingChangeEndOffset = Math.max(foldingChangeEndOffset, region.getEndOffset());
+      myFoldingChangeStartOffset = Math.min(myFoldingChangeStartOffset, region.getStartOffset());
+      myFoldingChangeEndOffset = Math.max(myFoldingChangeEndOffset, region.getEndOffset());
     }
   }
 
   @Override
   public void onFoldProcessingEnd() {
-    if (foldingChangeStartOffset <= foldingChangeEndOffset) {
-      invalidateRange(foldingChangeStartOffset, foldingChangeEndOffset);
+    if (myDocument.isInBulkUpdate()) return;
+    if (myFoldingChangeStartOffset <= myFoldingChangeEndOffset) {
+      doInvalidateRange(myFoldingChangeStartOffset, myFoldingChangeEndOffset);
     }
-    foldingChangeStartOffset = Integer.MAX_VALUE;
-    foldingChangeEndOffset = Integer.MIN_VALUE;
+    myFoldingChangeStartOffset = Integer.MAX_VALUE;
+    myFoldingChangeEndOffset = Integer.MIN_VALUE;
 
     for (TextRange range : myDeferredRanges) {
       onTextLayoutPerformed(range.getStartOffset(), range.getEndOffset());
@@ -121,7 +129,21 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
   }
 
   private void onSoftWrapRecalculationEnd(IncrementalCacheUpdateEvent event) {
-    invalidateRange(event.getStartOffset(), event.getActualEndOffset());
+    if (myDocument.isInBulkUpdate()) return;
+    boolean invalidate = true;
+    if (myEditor.getFoldingModel().isInBatchFoldingOperation()) {
+      myFoldingChangeStartOffset = Math.min(myFoldingChangeStartOffset, event.getStartOffset());
+      myFoldingChangeEndOffset = Math.max(myFoldingChangeEndOffset, event.getActualEndOffset());
+      invalidate = false;
+    }
+    if (myDocument.isInEventsHandling()) {
+      myDocumentChangeStartOffset = Math.min(myDocumentChangeStartOffset, event.getStartOffset());
+      myDocumentChangeEndOffset = Math.max(myDocumentChangeEndOffset, event.getActualEndOffset());
+      invalidate = false;
+    }
+    if (invalidate) {
+      doInvalidateRange(event.getStartOffset(), event.getActualEndOffset());
+    }
   }
 
   Dimension getPreferredSize() {
@@ -149,6 +171,7 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
 
   private int getPreferredWidth() {
     if (myWidthInPixels < 0) {
+      assert !myDocument.isInBulkUpdate();
       myWidthInPixels = calculatePreferredWidth();
     }
     validateMaxLineWithExtension();
@@ -193,10 +216,22 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
   }
 
   void reset() {
-    invalidateRange(0, myDocument.getTextLength());
+    assert !myDocument.isInBulkUpdate();
+    doInvalidateRange(0, myDocument.getTextLength());
   }
 
   void invalidateRange(int startOffset, int endOffset) {
+    if (myDocument.isInBulkUpdate()) return;
+    if (myDocument.isInEventsHandling()) {
+      myDocumentChangeStartOffset = Math.min(myDocumentChangeStartOffset, startOffset);
+      myDocumentChangeEndOffset = Math.max(myDocumentChangeEndOffset, endOffset);
+    }
+    else {
+      doInvalidateRange(startOffset, endOffset);
+    }
+  }
+  
+  private void doInvalidateRange(int startOffset, int endOffset) {
     myWidthInPixels = -1;
     int startVisualLine = myView.offsetToVisualLine(startOffset, false);
     int endVisualLine = myView.offsetToVisualLine(endOffset, true);
@@ -223,6 +258,7 @@ class EditorSizeManager implements PrioritizedDocumentListener, Disposable, Fold
   }
 
   void textLayoutPerformed(int startOffset, int endOffset) {
+    if (myDocument.isInBulkUpdate()) return;
     if (myEditor.getFoldingModel().isInBatchFoldingOperation()) {
       myDeferredRanges.add(new TextRange(startOffset, endOffset));
     }