extracted method to use in language plugins
[idea/community.git] / python / educational-core / course-creator / src / com / jetbrains / edu / coursecreator / actions / CCCreateTask.java
1 package com.jetbrains.edu.coursecreator.actions;
2
3 import com.intellij.ide.IdeView;
4 import com.intellij.ide.util.DirectoryUtil;
5 import com.intellij.openapi.application.ApplicationManager;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.openapi.util.Ref;
8 import com.intellij.openapi.vfs.VirtualFile;
9 import com.intellij.psi.PsiDirectory;
10 import com.intellij.util.Function;
11 import com.jetbrains.edu.coursecreator.CCUtils;
12 import com.jetbrains.edu.learning.core.EduNames;
13 import com.jetbrains.edu.learning.core.EduUtils;
14 import com.jetbrains.edu.learning.courseFormat.Course;
15 import com.jetbrains.edu.learning.courseFormat.Lesson;
16 import com.jetbrains.edu.learning.courseFormat.StudyItem;
17 import com.jetbrains.edu.learning.courseFormat.Task;
18 import icons.InteractiveLearningIcons;
19 import org.jetbrains.annotations.NotNull;
20 import org.jetbrains.annotations.Nullable;
21
22 import java.util.Collections;
23 import java.util.List;
24
25 public class CCCreateTask extends CCCreateStudyItemActionBase {
26   public static final String TITLE = "Create New " + EduNames.TASK_TITLED;
27
28   public CCCreateTask() {
29     super(EduNames.TASK_TITLED, TITLE, InteractiveLearningIcons.Task);
30   }
31
32
33
34
35   @Nullable
36   @Override
37   protected PsiDirectory getParentDir(@NotNull Project project, @NotNull Course course, @NotNull PsiDirectory directory) {
38     if (isAddedAsLast(directory, project, course)) {
39       return directory;
40     }
41     return directory.getParent();
42   }
43
44   @Override
45   protected void addItem(@NotNull Course course, @NotNull StudyItem item) {
46     if (item instanceof Task) {
47       Task task = (Task)item;
48       task.getLesson().addTask(task);
49     }
50   }
51
52   @Override
53   protected Function<VirtualFile, ? extends StudyItem> getStudyOrderable(@NotNull final StudyItem item) {
54     return (Function<VirtualFile, StudyItem>)file -> {
55       if (item instanceof Task) {
56         return ((Task)item).getLesson().getTask(file.getName());
57       }
58       return null;
59     };
60   }
61
62   @Override
63   @Nullable
64   protected PsiDirectory createItemDir(@NotNull final Project project, @NotNull final StudyItem item,
65                                      @Nullable final IdeView view, @NotNull final PsiDirectory parentDirectory,
66                                      @NotNull final Course course) {
67
68     final Ref<PsiDirectory> taskDirectory = new Ref<>();
69     ApplicationManager.getApplication().runWriteAction(() -> {
70       String taskDirName = EduNames.TASK + item.getIndex();
71       taskDirectory.set(DirectoryUtil.createSubdirectories(taskDirName, parentDirectory, "\\/"));
72       if (taskDirectory.get() != null) {
73         CCUtils.createTaskContent(project, view, course, taskDirectory.get());
74       }
75     });
76     return taskDirectory.get();
77   }
78
79   @Override
80   protected int getSiblingsSize(@NotNull Course course, @Nullable StudyItem parentItem) {
81     if (parentItem instanceof Lesson) {
82       return ((Lesson)parentItem).getTaskList().size();
83     }
84     return 0;
85   }
86
87   @Nullable
88   @Override
89   protected StudyItem getParentItem(@NotNull Course course, @NotNull PsiDirectory directory) {
90     Task task = (Task)getThresholdItem(course, directory);
91     if (task == null) {
92       return course.getLesson(directory.getName());
93     }
94     return task.getLesson();
95   }
96
97   @Nullable
98   @Override
99   protected StudyItem getThresholdItem(@NotNull Course course, @NotNull PsiDirectory sourceDirectory) {
100     return EduUtils.getTask(sourceDirectory, course);
101   }
102
103   @Override
104   protected boolean isAddedAsLast(@NotNull PsiDirectory sourceDirectory,
105                                   @NotNull Project project,
106                                   @NotNull Course course) {
107     return course.getLesson(sourceDirectory.getName()) != null;
108   }
109
110   @Override
111   protected List<? extends StudyItem> getSiblings(@NotNull Course course, @Nullable StudyItem parentItem) {
112     if (parentItem instanceof Lesson) {
113       return ((Lesson)parentItem).getTaskList();
114     }
115     return Collections.emptyList();
116   }
117
118   @Override
119   protected String getItemName() {
120     return EduNames.TASK;
121   }
122
123   @Override
124   protected StudyItem createAndInitItem(@NotNull Course course, @Nullable StudyItem parentItem, String name, int index) {
125     final Task task = new Task(name);
126     task.setIndex(index);
127     if (parentItem == null) {
128       return null;
129     }
130     task.setLesson(((Lesson)parentItem));
131     return task;
132   }
133 }