SelectionContainer (@NotNull final Editor editor, @NotNull final MyLineRange toMove) { final SelectionModel selectionModel = editor.getSelectionModel(); final PsiElement startToMove = toMove.myStartElement; final PsiElement endToMove = toMove.myEndElement; final int selectionStart = selectionModel.getSelectionStart(); final int selectionEnd = selectionModel.getSelectionEnd(); final TextRange range = startToMove.getTextRange(); final int column = editor.offsetToLogicalPosition(selectionStart).column; final int additionalSelection = range.getStartOffset() > selectionStart ? range.getStartOffset() - selectionStart : 0; if (startToMove == endToMove) return new SelectionContainer(selectionEnd - range.getStartOffset(), additionalSelection, column == 0); int len = range.getStartOffset() <= selectionStart ? range.getEndOffset() - selectionStart : startToMove.getTextLength(); PsiElement tmp = startToMove.getNextSibling(); while (tmp != endToMove && tmp != null) { if (!(tmp instanceof PsiWhiteSpace)) len += tmp.getTextLength(); tmp = tmp.getNextSibling(); } len = len + selectionEnd - endToMove.getTextOffset(); return new SelectionContainer(len, additionalSelection, column == 0); }