summaryrefslogtreecommitdiff
path: root/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/CCProjectComponent.java
diff options
context:
space:
mode:
Diffstat (limited to 'python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/CCProjectComponent.java')
-rw-r--r--python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/CCProjectComponent.java141
1 files changed, 136 insertions, 5 deletions
diff --git a/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/CCProjectComponent.java b/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/CCProjectComponent.java
index 34de943d2ad0..8b524dbffd4b 100644
--- a/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/CCProjectComponent.java
+++ b/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/CCProjectComponent.java
@@ -1,22 +1,33 @@
package org.jetbrains.plugins.coursecreator;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ProjectComponent;
+import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.event.EditorFactoryEvent;
import com.intellij.openapi.editor.impl.EditorFactoryImpl;
-import com.intellij.openapi.fileEditor.FileEditor;
-import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.fileEditor.*;
import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.VirtualFileAdapter;
+import com.intellij.openapi.vfs.VirtualFileEvent;
+import com.intellij.openapi.vfs.VirtualFileManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.coursecreator.format.Course;
+import org.jetbrains.plugins.coursecreator.format.Lesson;
+import org.jetbrains.plugins.coursecreator.format.Task;
+import org.jetbrains.plugins.coursecreator.format.TaskFile;
+
+import java.io.IOException;
public class CCProjectComponent implements ProjectComponent {
+ private static final Logger LOG = Logger.getInstance(CCProjectComponent.class.getName());
private final Project myProject;
+ private FileDeletedListener myListener;
public CCProjectComponent(Project project) {
myProject = project;
@@ -37,15 +48,46 @@ public class CCProjectComponent implements ProjectComponent {
StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new Runnable() {
@Override
public void run() {
- Course course = CCProjectService.getInstance(myProject).getCourse();
+ final Course course = CCProjectService.getInstance(myProject).getCourse();
if (course != null) {
- EditorFactory.getInstance().addEditorFactoryListener(new CCEditorFactoryListener(), myProject);
+ myProject.getMessageBus().connect(myProject).subscribe(
+ FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() {
+ @Override
+ public void selectionChanged(@NotNull FileEditorManagerEvent event) {
+ final VirtualFile oldFile = event.getOldFile();
+ if (oldFile == null) {
+ return;
+ }
+ if (CCProjectService.getInstance(myProject).isTaskFile(oldFile)) {
+ FileEditorManager.getInstance(myProject).closeFile(oldFile);
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ oldFile.delete(myProject);
+ }
+ catch (IOException e) {
+ LOG.error(e);
+ }
+ }
+ });
+ }
+ }
+ });
+ myListener = new FileDeletedListener();
+ VirtualFileManager.getInstance().addVirtualFileListener(myListener);
+ final CCEditorFactoryListener editorFactoryListener = new CCEditorFactoryListener();
+ EditorFactory.getInstance().addEditorFactoryListener(editorFactoryListener, myProject);
VirtualFile[] files = FileEditorManager.getInstance(myProject).getOpenFiles();
for (VirtualFile file : files) {
+ if (CCProjectService.getInstance(myProject).isTaskFile(file)) {
+ FileEditorManager.getInstance(myProject).closeFile(file);
+ continue;
+ }
FileEditor fileEditor = FileEditorManager.getInstance(myProject).getSelectedEditor(file);
if (fileEditor instanceof PsiAwareTextEditorImpl) {
Editor editor = ((PsiAwareTextEditorImpl)fileEditor).getEditor();
- new CCEditorFactoryListener().editorCreated(new EditorFactoryEvent(new EditorFactoryImpl(ProjectManager.getInstance()), editor ));
+ editorFactoryListener.editorCreated(new EditorFactoryEvent(new EditorFactoryImpl(ProjectManager.getInstance()), editor));
}
}
}
@@ -54,5 +96,94 @@ public class CCProjectComponent implements ProjectComponent {
}
public void projectClosed() {
+ if (myListener != null) {
+ VirtualFileManager.getInstance().removeVirtualFileListener(myListener);
+ }
+ }
+
+ private class FileDeletedListener extends VirtualFileAdapter {
+
+ @Override
+ public void fileDeleted(@NotNull VirtualFileEvent event) {
+ if (myProject.isDisposed() || !myProject.isOpen()) {
+ return;
+ }
+ Course course = CCProjectService.getInstance(myProject).getCourse();
+ if (course == null) {
+ return;
+ }
+ VirtualFile removedFile = event.getFile();
+ if (removedFile.getName().contains(".answer")) {
+ deleteTaskFile(course, removedFile);
+ }
+ if (removedFile.getName().contains("task")) {
+ deleteTask(course, removedFile);
+ }
+ if (removedFile.getName().contains("lesson")) {
+ deleteLesson(course, removedFile);
+ }
+ }
+
+ private void deleteLesson(Course course, VirtualFile file) {
+ VirtualFile courseDir = file.getParent();
+ if (!courseDir.getName().equals(myProject.getName())) {
+ return;
+ }
+ Lesson lesson = course.getLesson(file.getName());
+ if (lesson != null) {
+ course.getLessons().remove(lesson);
+ course.getLessonsMap().remove(file.getName());
+ }
+ }
+
+ private void deleteTask(Course course, VirtualFile removedFile) {
+ VirtualFile lessonDir = removedFile.getParent();
+ if (lessonDir == null || !lessonDir.getName().contains("lesson")) {
+ return;
+ }
+ VirtualFile courseDir = lessonDir.getParent();
+ if (!courseDir.getName().equals(myProject.getName())) {
+ return;
+ }
+ Lesson lesson = course.getLesson(lessonDir.getName());
+ if (lesson == null) {
+ return;
+ }
+ Task task = lesson.getTask(removedFile.getName());
+ if (task == null) {
+ return;
+ }
+ lesson.getTaskList().remove(task);
+ lesson.getTasksMap().remove(removedFile.getName());
+ }
+
+ private void deleteTaskFile(Course course, VirtualFile removedFile) {
+ VirtualFile taskDir = removedFile.getParent();
+ if (taskDir == null || !taskDir.getName().contains("task")) {
+ return;
+ }
+ VirtualFile lessonDir = taskDir.getParent();
+ if (lessonDir == null || !lessonDir.getName().contains("lesson")) {
+ return;
+ }
+ VirtualFile courseDir = lessonDir.getParent();
+ if (!courseDir.getName().equals(myProject.getName())) {
+ return;
+ }
+ Lesson lesson = course.getLesson(lessonDir.getName());
+ if (lesson == null) {
+ return;
+ }
+ Task task = lesson.getTask(taskDir.getName());
+ if (task == null) {
+ return;
+ }
+ TaskFile taskFile = task.getTaskFile(removedFile.getName());
+ if (taskFile == null) {
+ return;
+ }
+ String name = CCProjectService.getRealTaskFileName(removedFile.getName());
+ task.getTaskFiles().remove(name);
+ }
}
}