36b36d02e09674a524569fadc31db11aed8e181f
[idea/community.git] / python / educational-core / course-creator / src / com / jetbrains / edu / coursecreator / CCVirtualFileListener.java
1 package com.jetbrains.edu.coursecreator;
2
3 import com.intellij.openapi.project.Project;
4 import com.intellij.openapi.project.ProjectUtil;
5 import com.intellij.openapi.vfs.VirtualFile;
6 import com.intellij.openapi.vfs.VirtualFileAdapter;
7 import com.intellij.openapi.vfs.VirtualFileEvent;
8 import com.jetbrains.edu.learning.StudyTaskManager;
9 import com.jetbrains.edu.learning.StudyUtils;
10 import com.jetbrains.edu.learning.core.EduNames;
11 import com.jetbrains.edu.learning.courseFormat.Course;
12 import com.jetbrains.edu.learning.courseFormat.Lesson;
13 import com.jetbrains.edu.learning.courseFormat.Task;
14 import com.jetbrains.edu.learning.courseFormat.TaskFile;
15 import org.jetbrains.annotations.NotNull;
16
17 public class CCVirtualFileListener extends VirtualFileAdapter {
18
19   @Override
20   public void fileCreated(@NotNull VirtualFileEvent event) {
21     VirtualFile createdFile = event.getFile();
22     Project project = ProjectUtil.guessProjectForFile(createdFile);
23     if (project == null) {
24       return;
25     }
26     Course course = StudyTaskManager.getInstance(project).getCourse();
27     if (course == null || !CCUtils.isCourseCreator(project)) {
28       return;
29     }
30     TaskFile taskFile = StudyUtils.getTaskFile(project, createdFile);
31     if (taskFile != null) {
32       return;
33     }
34
35     String name = createdFile.getName();
36     if (CCUtils.isTestsFile(project, createdFile)
37         || StudyUtils.isTaskDescriptionFile(name)
38         || name.contains(EduNames.WINDOW_POSTFIX)
39         || name.contains(EduNames.WINDOWS_POSTFIX)
40         || name.contains(EduNames.ANSWERS_POSTFIX)) {
41       return;
42     }
43
44     VirtualFile taskVF = createdFile.getParent();
45     if (taskVF == null) {
46       return;
47     }
48     Task task = StudyUtils.getTask(project, taskVF);
49     if (task == null) {
50       return;
51     }
52
53     CCUtils.createResourceFile(createdFile, course, taskVF);
54
55     task.addTaskFile(name, 1);
56   }
57
58   @Override
59   public void fileDeleted(@NotNull VirtualFileEvent event) {
60     VirtualFile removedFile = event.getFile();
61     if (removedFile.getPath().contains(CCUtils.GENERATED_FILES_FOLDER)) {
62       return;
63     }
64
65     Project project = ProjectUtil.guessProjectForFile(removedFile);
66     if (project == null) {
67       return;
68     }
69     Course course = StudyTaskManager.getInstance(project).getCourse();
70     if (course == null) {
71       return;
72     }
73     final TaskFile taskFile = StudyUtils.getTaskFile(project, removedFile);
74     if (taskFile != null) {
75       deleteTaskFile(removedFile, taskFile);
76       return;
77     }
78     if (removedFile.getName().contains(EduNames.TASK)) {
79       deleteTask(course, removedFile);
80     }
81     if (removedFile.getName().contains(EduNames.LESSON)) {
82       deleteLesson(course, removedFile, project);
83     }
84   }
85
86   private static void deleteLesson(@NotNull final Course course, @NotNull final VirtualFile removedLessonFile, Project project) {
87     Lesson removedLesson = course.getLesson(removedLessonFile.getName());
88     if (removedLesson == null) {
89       return;
90     }
91     VirtualFile courseDir = project.getBaseDir();
92     CCUtils.updateHigherElements(courseDir.getChildren(), file -> course.getLesson(file.getName()), removedLesson.getIndex(), EduNames.LESSON, -1);
93     course.getLessons().remove(removedLesson);
94   }
95
96   private static void deleteTask(@NotNull final Course course, @NotNull final VirtualFile removedTask) {
97     VirtualFile lessonDir = removedTask.getParent();
98     if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
99       return;
100     }
101     final Lesson lesson = course.getLesson(lessonDir.getName());
102     if (lesson == null) {
103       return;
104     }
105     Task task = lesson.getTask(removedTask.getName());
106     if (task == null) {
107       return;
108     }
109     CCUtils.updateHigherElements(lessonDir.getChildren(), file -> lesson.getTask(file.getName()), task.getIndex(), EduNames.TASK, -1);
110     lesson.getTaskList().remove(task);
111   }
112
113   private static void deleteTaskFile(@NotNull final VirtualFile removedTaskFile, TaskFile taskFile) {
114     Task task = taskFile.getTask();
115     if (task == null) {
116       return;
117     }
118     task.getTaskFiles().remove(removedTaskFile.getName());
119   }
120 }