void (@NotNull LogicalPosition targetPosition) { List<CaretState> caretStates = new ArrayList<>(myCaretStateBeforeLastPress); if (myRectangularSelectionInProgress) { caretStates.addAll(EditorModificationUtil.calcBlockSelectionState(this, myLastMousePressedLocation, targetPosition)); } else { LogicalPosition selectionStart = myLastMousePressedLocation; LogicalPosition selectionEnd = targetPosition; if (getMouseSelectionState() != MOUSE_SELECTION_STATE_NONE) { int newCaretOffset = logicalPositionToOffset(targetPosition); if (newCaretOffset < mySavedSelectionStart) { selectionStart = offsetToLogicalPosition(mySavedSelectionEnd); if (getMouseSelectionState() == MOUSE_SELECTION_STATE_LINE_SELECTED) { targetPosition = selectionEnd = visualToLogicalPosition(new VisualPosition(offsetToVisualLine(newCaretOffset), 0)); } } else { selectionStart = offsetToLogicalPosition(mySavedSelectionStart); int selectionEndOffset = Math.max(newCaretOffset, mySavedSelectionEnd); if (getMouseSelectionState() == MOUSE_SELECTION_STATE_WORD_SELECTED) { targetPosition = selectionEnd = offsetToLogicalPosition(selectionEndOffset); } else if (getMouseSelectionState() == MOUSE_SELECTION_STATE_LINE_SELECTED) { targetPosition = selectionEnd = visualToLogicalPosition(new VisualPosition(offsetToVisualLine(selectionEndOffset) + 1, 0)); } } cancelAutoResetForMouseSelectionState(); } caretStates.add(new CaretState(targetPosition, selectionStart, selectionEnd)); } myCaretModel.setCaretsAndSelections(caretStates); }