do not add task dirs to source roots
[idea/community.git] / python / educational / course-creator / src / com / jetbrains / edu / coursecreator / CCFileDeletedListener.java
1 package com.jetbrains.edu.coursecreator;
2
3 import com.intellij.openapi.application.ApplicationManager;
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.vfs.VirtualFile;
6 import com.intellij.openapi.vfs.VirtualFileAdapter;
7 import com.intellij.openapi.vfs.VirtualFileEvent;
8 import com.intellij.util.Function;
9 import com.jetbrains.edu.EduNames;
10 import com.jetbrains.edu.courseFormat.*;
11 import com.jetbrains.edu.coursecreator.actions.CCRunTestsAction;
12 import org.jetbrains.annotations.NotNull;
13
14 class CCFileDeletedListener extends VirtualFileAdapter {
15
16   private final Project myProject;
17
18   CCFileDeletedListener(@NotNull final Project project) {
19     myProject = project;
20   }
21
22   @Override
23   public void fileDeleted(@NotNull VirtualFileEvent event) {
24     if (myProject.isDisposed() || !myProject.isOpen()) {
25       return;
26     }
27     VirtualFile removedFile = event.getFile();
28     final TaskFile taskFile = CCProjectService.getInstance(myProject).getTaskFile(removedFile);
29     if (taskFile != null) {
30       deleteAnswerFile(removedFile, taskFile);
31       return;
32     }
33     Course course = CCProjectService.getInstance(myProject).getCourse();
34     if (course == null) {
35       return;
36     }
37     if (removedFile.getName().contains(EduNames.TASK)) {
38       deleteTask(course, removedFile, myProject);
39     }
40     if (removedFile.getName().contains(EduNames.LESSON)) {
41       deleteLesson(course, removedFile);
42     }
43   }
44
45   private void deleteLesson(@NotNull final Course course, @NotNull final VirtualFile removedLessonFile) {
46     Lesson removedLesson = course.getLesson(removedLessonFile.getName());
47     if (removedLesson == null) {
48       return;
49     }
50     VirtualFile courseDir = myProject.getBaseDir();
51     CCUtils.updateHigherElements(courseDir.getChildren(), new Function<VirtualFile, StudyOrderable>() {
52       @Override
53       public StudyOrderable fun(VirtualFile file) {
54         return course.getLesson(file.getName());
55       }
56     }, removedLesson.getIndex(), EduNames.LESSON, -1);
57     course.getLessons().remove(removedLesson);
58   }
59
60   private static void deleteTask(@NotNull final Course course, @NotNull final VirtualFile removedTask, @NotNull final Project project) {
61     VirtualFile lessonDir = removedTask.getParent();
62     if (lessonDir == null || !lessonDir.getName().contains(EduNames.LESSON)) {
63       return;
64     }
65     final Lesson lesson = course.getLesson(lessonDir.getName());
66     if (lesson == null) {
67       return;
68     }
69     Task task = lesson.getTask(removedTask.getName());
70     if (task == null) {
71       return;
72     }
73     CCUtils.updateHigherElements(lessonDir.getChildren(), new Function<VirtualFile, StudyOrderable>() {
74       @Override
75       public StudyOrderable fun(VirtualFile file) {
76         return lesson.getTask(file.getName());
77       }
78     }, task.getIndex(), EduNames.TASK, -1);
79     lesson.getTaskList().remove(task);
80   }
81
82   private void deleteAnswerFile(@NotNull final VirtualFile removedAnswerFile, TaskFile taskFile) {
83     ApplicationManager.getApplication().runWriteAction(new Runnable() {
84       @Override
85       public void run() {
86         VirtualFile taskDir = removedAnswerFile.getParent();
87         if (taskDir != null) {
88           CCRunTestsAction.clearTestEnvironment(taskDir, myProject);
89         }
90       }
91     });
92     String name = CCProjectService.getRealTaskFileName(removedAnswerFile.getName());
93     Task task = taskFile.getTask();
94     if (task == null) {
95       return;
96     }
97     task.getTaskFiles().remove(name);
98   }
99 }