blob: 7565d76b3acff2686adccf0a039fb6418b8496b8 [file] [log] [blame]
package com.jetbrains.python.edu;
import com.intellij.openapi.application.ApplicationManager;
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.vfs.VirtualFile;
import com.jetbrains.python.edu.course.StudyStatus;
import com.jetbrains.python.edu.course.TaskFile;
import com.jetbrains.python.edu.course.TaskWindow;
import com.jetbrains.python.edu.editor.StudyEditor;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
class StudyEditorFactoryListener implements EditorFactoryListener {
/**
* draws selected task window if there is one located in mouse position
*/
private static class WindowSelectionListener extends EditorMouseAdapter {
private final TaskFile myTaskFile;
WindowSelectionListener(TaskFile taskFile) {
myTaskFile = taskFile;
}
@Override
public void mouseClicked(EditorMouseEvent e) {
Editor editor = e.getEditor();
Point point = e.getMouseEvent().getPoint();
LogicalPosition pos = editor.xyToLogicalPosition(point);
TaskWindow taskWindow = myTaskFile.getTaskWindow(editor.getDocument(), pos);
if (taskWindow != null) {
myTaskFile.setSelectedTaskWindow(taskWindow);
taskWindow.draw(editor, taskWindow.getStatus() != StudyStatus.Solved, true);
}
else {
myTaskFile.drawAllWindows(editor);
}
}
}
@Override
public void editorCreated(@NotNull final EditorFactoryEvent event) {
final Editor editor = event.getEditor();
final Project project = editor.getProject();
if (project == null) {
return;
}
ApplicationManager.getApplication().invokeLater(
new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
Document document = editor.getDocument();
VirtualFile openedFile = FileDocumentManager.getInstance().getFile(document);
if (openedFile != null) {
StudyTaskManager taskManager = StudyTaskManager.getInstance(project);
TaskFile taskFile = taskManager.getTaskFile(openedFile);
if (taskFile != null) {
taskFile.navigateToFirstTaskWindow(editor);
editor.addEditorMouseListener(new WindowSelectionListener(taskFile));
StudyDocumentListener listener = new StudyDocumentListener(taskFile);
StudyEditor.addDocumentListener(document, listener);
document.addDocumentListener(listener);
taskFile.drawAllWindows(editor);
}
}
}
});
}
}
);
}
@Override
public void editorReleased(@NotNull EditorFactoryEvent event) {
Editor editor = event.getEditor();
Document document = editor.getDocument();
StudyDocumentListener listener = StudyEditor.getListener(document);
if (listener != null) {
document.removeDocumentListener(listener);
StudyEditor.removeListener(document);
}
editor.getMarkupModel().removeAllHighlighters();
editor.getSelectionModel().removeSelection();
}
}