CaretData (@NotNull EditorEx editor) { Document document = editor.getDocument(); CaretModel caretModel = editor.getCaretModel(); int caretRowStart = caretModel.getVisualLineStart(); int caretRowEnd = caretModel.getVisualLineEnd(); if (caretRowEnd == document.getTextLength() && document.getLineCount() > 0 && caretRowEnd > document.getLineStartOffset(document.getLineCount() - 1)) { caretRowEnd++; } List<Caret> carets = editor.getCaretModel().getAllCarets(); int caretCount = carets.size(); int[] selectionStarts = new int[caretCount]; int[] selectionEnds = new int[caretCount]; for (int i = 0; i < caretCount; i++) { Caret caret = carets.get(i); selectionStarts[i] = caret.getSelectionStart(); selectionEnds[i] = caret.getSelectionEnd(); } return new CaretData(caretRowStart, caretRowEnd, selectionStarts, selectionEnds); }