package com.jetbrains.edu.learning.editor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.event.EditorFactoryEvent; import com.intellij.openapi.editor.event.EditorFactoryListener; 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; import com.intellij.problems.WolfTheProblemSolver; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.core.EduDocumentListener; import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.TaskFile; import com.jetbrains.edu.learning.navigation.StudyNavigator; import com.jetbrains.edu.learning.ui.StudyToolWindowFactory; import org.jetbrains.annotations.NotNull; import java.awt.*; public class StudyEditorFactoryListener implements EditorFactoryListener { private static class WindowSelectionListener extends EditorMouseAdapter { private final TaskFile myTaskFile; WindowSelectionListener(@NotNull final TaskFile taskFile) { myTaskFile = taskFile; } @Override public void mouseClicked(EditorMouseEvent e) { final Editor editor = e.getEditor(); final Point point = e.getMouseEvent().getPoint(); final LogicalPosition pos = editor.xyToLogicalPosition(point); final AnswerPlaceholder answerPlaceholder = myTaskFile.getAnswerPlaceholder(editor.logicalPositionToOffset(pos)); if (answerPlaceholder == null || answerPlaceholder.getSelected()) { return; } final Pair<Integer, Integer> offsets = StudyUtils.getPlaceholderOffsets(answerPlaceholder, editor.getDocument()); editor.getSelectionModel().setSelection(offsets.getFirst(), offsets.getSecond()); answerPlaceholder.setSelected(true); } } @Override public void editorCreated(@NotNull final EditorFactoryEvent event) { final Editor editor = event.getEditor(); final Project project = editor.getProject(); if (project == null) { return; } final Document document = editor.getDocument(); final VirtualFile openedFile = FileDocumentManager.getInstance().getFile(document); if (openedFile != null) { final TaskFile taskFile = StudyUtils.getTaskFile(project, openedFile); if (taskFile != null) { WolfTheProblemSolver.getInstance(project).clearProblems(openedFile); final ToolWindow studyToolWindow = ToolWindowManager.getInstance(project).getToolWindow(StudyToolWindowFactory.STUDY_TOOL_WINDOW); if (studyToolWindow != null) { StudyUtils.updateToolWindows(project); studyToolWindow.show(null); } Course course = StudyTaskManager.getInstance(project).getCourse(); if (course == null) { return; } StudyEditor.addDocumentListener(document, new EduDocumentListener(taskFile, true)); if (!taskFile.getAnswerPlaceholders().isEmpty()) { StudyNavigator.navigateToFirstAnswerPlaceholder(editor, taskFile); boolean isStudyProject = EduNames.STUDY.equals(course.getCourseMode()); StudyUtils.drawAllAnswerPlaceholders(editor, taskFile); if (isStudyProject) { editor.addEditorMouseListener(new WindowSelectionListener(taskFile)); } } } } } @Override public void editorReleased(@NotNull EditorFactoryEvent event) { final Editor editor = event.getEditor(); final Document document = editor.getDocument(); StudyEditor.removeListener(document); editor.getMarkupModel().removeAllHighlighters(); editor.getSelectionModel().removeSelection(); } }