diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyAnswerPlaceholderExtendWordHandler.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyAnswerPlaceholderExtendWordHandler.java index 210a8e766f7e..a31b28d523ee 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyAnswerPlaceholderExtendWordHandler.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyAnswerPlaceholderExtendWordHandler.java @@ -5,6 +5,7 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; @@ -54,7 +55,7 @@ public class StudyAnswerPlaceholderExtendWordHandler implements ExtendWordSelect public List select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) { AnswerPlaceholder placeholder = getAnswerPlaceholder(e, cursorOffset); assert placeholder != null; - int startOffset = placeholder.getOffset(); - return Collections.singletonList(new TextRange(startOffset, startOffset + placeholder.getRealLength())); + final Pair offsets = StudyUtils.getPlaceholderOffsets(placeholder, editor.getDocument()); + return Collections.singletonList(new TextRange(offsets.getFirst(), offsets.getSecond())); } } diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java index 99d184d14744..7ff572b9922f 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyUtils.java @@ -31,6 +31,7 @@ import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.util.text.StringUtil; @@ -47,6 +48,7 @@ import com.intellij.psi.PsiFile; import com.intellij.ui.JBColor; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.content.Content; +import com.intellij.util.DocumentUtil; import com.intellij.util.ObjectUtils; import com.intellij.util.TimeoutUtil; import com.intellij.util.containers.ContainerUtil; @@ -831,4 +833,18 @@ public class StudyUtils { } return FileUtil.getRelativePath(taskDir.getPath(), file.getPath(), '/'); } + + public static Pair getPlaceholderOffsets(@NotNull final AnswerPlaceholder answerPlaceholder, + @NotNull final Document document) { + int startOffset = answerPlaceholder.getOffset(); + int delta = 0; + final int length = answerPlaceholder.getRealLength(); + int nonSpaceCharOffset = DocumentUtil.getFirstNonSpaceCharOffset(document, startOffset, startOffset + length); + if (nonSpaceCharOffset != startOffset) { + delta = startOffset - nonSpaceCharOffset; + startOffset = nonSpaceCharOffset; + } + final int endOffset = startOffset + length + delta; + return Pair.create(startOffset, endOffset); + } } diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/editor/StudyEditorFactoryListener.java b/python/educational-core/student/src/com/jetbrains/edu/learning/editor/StudyEditorFactoryListener.java index 288bc157b012..a3f625f045be 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/editor/StudyEditorFactoryListener.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/editor/StudyEditorFactoryListener.java @@ -10,6 +10,7 @@ import com.intellij.openapi.editor.event.EditorMouseAdapter; import com.intellij.openapi.editor.event.EditorMouseEvent; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowManager; @@ -46,8 +47,8 @@ public class StudyEditorFactoryListener implements EditorFactoryListener { if (answerPlaceholder == null || answerPlaceholder.getSelected()) { return; } - int startOffset = answerPlaceholder.getOffset(); - editor.getSelectionModel().setSelection(startOffset, startOffset + answerPlaceholder.getRealLength()); + final Pair offsets = StudyUtils.getPlaceholderOffsets(answerPlaceholder, editor.getDocument()); + editor.getSelectionModel().setSelection(offsets.getFirst(), offsets.getSecond()); answerPlaceholder.setSelected(true); } }