0ac9fe8321916d04750fda689c0307e1293ef26f
[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 import java.io.File;
18
19 public class CCVirtualFileListener extends VirtualFileAdapter {
20
21   @Override
22   public void fileCreated(@NotNull VirtualFileEvent event) {
23     VirtualFile createdFile = event.getFile();
24     Project project = ProjectUtil.guessProjectForFile(createdFile);
25     if (project == null) {
26       return;
27     }
28     Course course = StudyTaskManager.getInstance(project).getCourse();
29     if (course == null || !CCUtils.isCourseCreator(project)) {
30       return;
31     }
32     TaskFile taskFile = StudyUtils.getTaskFile(project, createdFile);
33     if (taskFile != null) {
34       return;
35     }
36
37     String name = createdFile.getName();
38
39     CCLanguageManager manager = CCUtils.getStudyLanguageManager(course);
40     if (manager != null && manager.doNotPackFile(new File(createdFile.getPath()))) {
41       return;
42     }
43
44     if (CCUtils.isTestsFile(project, createdFile)
45         || StudyUtils.isTaskDescriptionFile(name)
46         || name.contains(EduNames.WINDOW_POSTFIX)
47         || name.contains(EduNames.WINDOWS_POSTFIX)
48         || name.contains(EduNames.ANSWERS_POSTFIX)) {
49       return;
50     }
51
52     VirtualFile taskVF = createdFile.getParent();
53     if (taskVF == null) {
54       return;
55     }
56     Task task = StudyUtils.getTask(project, taskVF);
57     if (task == null) {
58       return;
59     }
60
61     CCUtils.createResourceFile(createdFile, course, taskVF);
62
63     task.addTaskFile(name, 1);
64   }
65
66   @Override
67   public void fileDeleted(@NotNull VirtualFileEvent event) {
68     VirtualFile removedFile = event.getFile();
69     String path = removedFile.getPath();
70     if (path.contains(CCUtils.GENERATED_FILES_FOLDER)) {
71       return;
72     }
73
74     Project project = ProjectUtil.guessProjectForFile(removedFile);
75     if (project == null) {
76       return;
77     }
78     Course course = StudyTaskManager.getInstance(project).getCourse();
79     if (course == null || path.contains(course.getCourseDirectory())) {
80       return;
81     }
82     final TaskFile taskFile = StudyUtils.getTaskFile(project, removedFile);
83     if (taskFile != null) {
84       deleteTaskFile(removedFile, taskFile);
85       return;
86     }
87     if (removedFile.getName().contains(EduNames.TASK)) {
88       deleteTask(course, removedFile);
89     }
90     if (removedFile.getName().contains(EduNames.LESSON)) {
91       deleteLesson(course, removedFile, project);
92     }
93   }
94
95   private static void deleteLesson(@NotNull final Course course, @NotNull final VirtualFile removedLessonFile, Project project) {
96     Lesson removedLesson = course.getLesson(removedLessonFile.getName());
97     if (removedLesson == null) {
98       return;
99     }
100     VirtualFile courseDir = project.getBaseDir();
101     CCUtils.updateHigherElements(courseDir.getChildren(), file -> course.getLesson(file.getName()), removedLesson.getIndex(), EduNames.LESSON, -1);
102     course.getLessons().remove(removedLesson);
103   }
104
105   private static void deleteTask(@NotNull final Course course, @NotNull final VirtualFile removedTask) {
106     VirtualFile lessonDir = removedTask.getParent();
107     if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
108       return;
109     }
110     final Lesson lesson = course.getLesson(lessonDir.getName());
111     if (lesson == null) {
112       return;
113     }
114     Task task = lesson.getTask(removedTask.getName());
115     if (task == null) {
116       return;
117     }
118     CCUtils.updateHigherElements(lessonDir.getChildren(), file -> lesson.getTask(file.getName()), task.getIndex(), EduNames.TASK, -1);
119     lesson.getTaskList().remove(task);
120   }
121
122   private static void deleteTaskFile(@NotNull final VirtualFile removedTaskFile, TaskFile taskFile) {
123     Task task = taskFile.getTask();
124     if (task == null) {
125       return;
126     }
127     //TODO: remove from steps as well
128     task.getTaskFiles().remove(removedTaskFile.getName());
129   }
130 }