diff --git a/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java b/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java index 6cb56f58e58f..3ab8280d929a 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/EditorModificationUtil.java @@ -54,9 +54,7 @@ public class EditorModificationUtil { } selectionModel.removeSelection(); editor.getDocument().deleteString(selectionStart, selectionEnd); - if (editor.getCaretModel().getCurrentCaret() == editor.getCaretModel().getPrimaryCaret()) { - editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); - } + scrollToCaret(editor); } public static void deleteSelectedTextForAllCarets(@NotNull final Editor editor) { @@ -116,8 +114,8 @@ public class EditorModificationUtil { public static int insertStringAtCaret(Editor editor, @NotNull String s, boolean toProcessOverwriteMode, boolean toMoveCaret, int caretShift) { int result = insertStringAtCaretNoScrolling(editor, s, toProcessOverwriteMode, toMoveCaret, caretShift); - if (toMoveCaret && editor.getCaretModel().getCurrentCaret() == editor.getCaretModel().getPrimaryCaret()) { - editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); + if (toMoveCaret) { + scrollToCaret(editor); } return result; } @@ -475,4 +473,15 @@ public class EditorModificationUtil { CaretModel caretModel = editor.getCaretModel(); caretModel.moveToOffset(caretModel.getOffset() + caretShift); } + + /** + * This method is safe to run both in and out of {@link com.intellij.openapi.editor.CaretModel#runForEachCaret(CaretAction)} context. + * It scrolls to primary caret in both cases, and, in the former case, avoids performing excessive scrolling in case of large number + * of carets. + */ + public static void scrollToCaret(@NotNull Editor editor) { + if (editor.getCaretModel().getCurrentCaret() == editor.getCaretModel().getPrimaryCaret()) { + editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); + } + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/BackspaceAction.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/BackspaceAction.java index 8637ecee94be..bc60a3e7e890 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/BackspaceAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/BackspaceAction.java @@ -92,7 +92,7 @@ public class BackspaceAction extends EditorAction { editor.getCaretModel().moveCaretRelatively(columnShift, 0, false, false, true); } else { - scrollToCaret(editor); + EditorModificationUtil.scrollToCaret(editor); editor.getSelectionModel().removeSelection(); FoldRegion region = editor.getFoldingModel().getCollapsedRegionAtOffset(offset - 1); @@ -111,17 +111,11 @@ public class BackspaceAction extends EditorAction { int lineEnd = document.getLineEndOffset(lineNumber - 1) + separatorLength; document.deleteString(lineEnd - separatorLength, lineEnd); editor.getCaretModel().moveToOffset(lineEnd - separatorLength); - scrollToCaret(editor); + EditorModificationUtil.scrollToCaret(editor); editor.getSelectionModel().removeSelection(); // Do not group delete newline and other deletions. CommandProcessor commandProcessor = CommandProcessor.getInstance(); commandProcessor.setCurrentCommandGroupId(null); } } - - private static void scrollToCaret(Editor editor) { - if (editor.getCaretModel().getCurrentCaret() == editor.getCaretModel().getPrimaryCaret()) { - editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); - } - } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java index a10c2890e4c1..74a2bf9ca75b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/EditorActionUtil.java @@ -122,7 +122,6 @@ public class EditorActionUtil { editor.getCaretModel().moveCaretRelatively(columnShift, lineShift, withSelection, false, false); - //editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); VisualPosition caretPos = editor.getCaretModel().getVisualPosition(); Point caretLocation2 = editor.visualPositionToXY(caretPos); final boolean scrollToCaret = !(editor instanceof EditorImpl) || ((EditorImpl)editor).isScrollToCaret(); @@ -624,9 +623,7 @@ public class EditorActionUtil { } } caretModel.moveToOffset(newOffset); - if (editor.getCaretModel().getCurrentCaret() == editor.getCaretModel().getPrimaryCaret()) { - editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); - } + EditorModificationUtil.scrollToCaret(editor); setupSelection(editor, isWithSelection, selectionStart, blockSelectionStart); } @@ -698,9 +695,7 @@ public class EditorActionUtil { if (isWordOrLexemeStart(editor, newOffset, camel)) break; } editor.getCaretModel().moveToOffset(newOffset); - if (editor.getCaretModel().getCurrentCaret() == editor.getCaretModel().getPrimaryCaret()) { - editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); - } + EditorModificationUtil.scrollToCaret(editor); setupSelection(editor, isWithSelection, selectionStart, blockSelectionStart); }