Avoid O(caretCount^2) time on typing with multiple carets

(for IDEA-135620)
This commit is contained in:
Dmitry Batrak
2016-10-24 14:55:04 +03:00
parent 8d59699704
commit 8833d3b6fb
2 changed files with 12 additions and 6 deletions
@@ -538,6 +538,10 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
myCaretListeners.getMulticaster().caretRemoved(new CaretEvent(myEditor, caret, caret.getLogicalPosition(), caret.getLogicalPosition()));
}
public boolean isIteratingOverCarets() {
return myCurrentCaret != null;
}
@NotNull
@Override
public String dumpState() {
@@ -24,6 +24,7 @@ import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.ex.DocumentEx;
import com.intellij.openapi.editor.ex.FoldingListener;
import com.intellij.openapi.editor.ex.PrioritizedDocumentListener;
import com.intellij.openapi.editor.impl.CaretModelImpl;
import com.intellij.openapi.editor.impl.EditorDocumentPriorities;
import com.intellij.openapi.editor.impl.EditorImpl;
import com.intellij.openapi.editor.impl.softwrap.SoftWrapDrawingType;
@@ -42,6 +43,7 @@ import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;
/**
* Calculates width (in pixels) of editor contents.
@@ -170,12 +172,12 @@ class EditorSizeManager extends InlayModel.SimpleAdapter implements PrioritizedD
int widthWithoutCaret = getPreferredWidth();
int width = widthWithoutCaret;
if (!myDocument.isInBulkUpdate()) {
for (Caret caret : myEditor.getCaretModel().getAllCarets()) {
if (caret.isUpToDate()) {
int caretX = myView.visualPositionToXY(caret.getVisualPosition()).x;
width = Math.max(caretX, width);
}
}
CaretModelImpl caretModel = myEditor.getCaretModel();
int caretMaxX = (caretModel.isIteratingOverCarets() ? Stream.of(caretModel.getCurrentCaret()) : caretModel.getAllCarets().stream())
.filter(Caret::isUpToDate)
.mapToInt(c -> myView.visualPositionToXY(c.getVisualPosition()).x)
.max().orElse(0);
width = Math.max(width, caretMaxX);
}
if (shouldRespectAdditionalColumns(widthWithoutCaret)) {
width += myEditor.getSettings().getAdditionalColumnsCount() * myView.getPlainSpaceWidth();