fbbe0d95fc67dc980058cd1d80db91c5341df17f
[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.fileTemplates.FileTemplate;
5 import com.intellij.ide.fileTemplates.FileTemplateManager;
6 import com.intellij.ide.fileTemplates.FileTemplateUtil;
7 import com.intellij.ide.util.DirectoryUtil;
8 import com.intellij.ide.util.EditorHelper;
9 import com.intellij.openapi.application.ApplicationManager;
10 import com.intellij.openapi.diagnostic.Logger;
11 import com.intellij.openapi.project.Project;
12 import com.intellij.openapi.util.Ref;
13 import com.intellij.openapi.vfs.VirtualFile;
14 import com.intellij.psi.PsiDirectory;
15 import com.intellij.psi.PsiElement;
16 import com.intellij.util.Function;
17 import com.jetbrains.edu.coursecreator.CCLanguageManager;
18 import com.jetbrains.edu.coursecreator.CCUtils;
19 import com.jetbrains.edu.coursecreator.settings.CCSettings;
20 import com.jetbrains.edu.learning.StudyUtils;
21 import com.jetbrains.edu.learning.core.EduNames;
22 import com.jetbrains.edu.learning.core.EduUtils;
23 import com.jetbrains.edu.learning.courseFormat.Course;
24 import com.jetbrains.edu.learning.courseFormat.Lesson;
25 import com.jetbrains.edu.learning.courseFormat.StudyItem;
26 import com.jetbrains.edu.learning.courseFormat.Task;
27 import icons.InteractiveLearningIcons;
28 import org.jetbrains.annotations.NotNull;
29 import org.jetbrains.annotations.Nullable;
30
31 import java.util.Collections;
32 import java.util.List;
33
34 public class CCCreateTask extends CCCreateStudyItemActionBase {
35   private static final Logger LOG = Logger.getInstance(CCCreateTask.class.getName());
36   public static final String TITLE = "Create New " + EduNames.TASK_TITLED;
37
38   public CCCreateTask() {
39     super(EduNames.TASK_TITLED, TITLE, InteractiveLearningIcons.Task);
40   }
41
42
43   private static void createFromTemplate(@NotNull final PsiDirectory taskDirectory,
44                                          @Nullable final FileTemplate template,
45                                          @Nullable IdeView view, boolean open) {
46     if (template == null) {
47       return;
48     }
49     try {
50       final PsiElement file = FileTemplateUtil.createFromTemplate(template, template.getName(), null, taskDirectory);
51       if (view != null && open) {
52         EditorHelper.openInEditor(file, false);
53         view.selectElement(file);
54       }
55     }
56     catch (Exception e) {
57       LOG.error(e);
58     }
59   }
60
61   @Nullable
62   @Override
63   protected PsiDirectory getParentDir(@NotNull Project project, @NotNull Course course, @NotNull PsiDirectory directory) {
64     if (isAddedAsLast(directory, project, course)) {
65       return directory;
66     }
67     return directory.getParent();
68   }
69
70   @Override
71   protected void addItem(@NotNull Course course, @NotNull StudyItem item) {
72     if (item instanceof Task) {
73       Task task = (Task)item;
74       task.getLesson().addTask(task);
75     }
76   }
77
78   @Override
79   protected Function<VirtualFile, ? extends StudyItem> getStudyOrderable(@NotNull final StudyItem item) {
80     return (Function<VirtualFile, StudyItem>)file -> {
81       if (item instanceof Task) {
82         return ((Task)item).getLesson().getTask(file.getName());
83       }
84       return null;
85     };
86   }
87
88   @Override
89   @Nullable
90   protected PsiDirectory createItemDir(@NotNull final Project project, @NotNull final StudyItem item,
91                                      @Nullable final IdeView view, @NotNull final PsiDirectory parentDirectory,
92                                      @NotNull final Course course) {
93
94     final Ref<PsiDirectory> taskDirectory = new Ref<>();
95     ApplicationManager.getApplication().runWriteAction(() -> {
96       String taskDirName = EduNames.TASK + item.getIndex();
97       taskDirectory.set(DirectoryUtil.createSubdirectories(taskDirName, parentDirectory, "\\/"));
98       if (taskDirectory.get() != null) {
99         CCLanguageManager manager = CCUtils.getStudyLanguageManager(course);
100         if (manager == null) {
101           return;
102         }
103         createFromTemplate(taskDirectory.get(), manager.getTestsTemplate(project), view, false);
104         createFromTemplate(taskDirectory.get(), FileTemplateManager.getInstance(project)
105           .getInternalTemplate(StudyUtils.getTaskDescriptionFileName(CCSettings.getInstance().useHtmlAsDefaultTaskFormat())), view, false);
106         String defaultExtension = manager.getDefaultTaskFileExtension();
107         if (defaultExtension != null) {
108           FileTemplate taskFileTemplate = manager.getTaskFileTemplateForExtension(project, defaultExtension);
109           createFromTemplate(taskDirectory.get(), taskFileTemplate, view, true);
110         }
111       }
112     });
113     return taskDirectory.get();
114   }
115
116   @Override
117   protected int getSiblingsSize(@NotNull Course course, @Nullable StudyItem parentItem) {
118     if (parentItem instanceof Lesson) {
119       return ((Lesson)parentItem).getTaskList().size();
120     }
121     return 0;
122   }
123
124   @Nullable
125   @Override
126   protected StudyItem getParentItem(@NotNull Course course, @NotNull PsiDirectory directory) {
127     Task task = (Task)getThresholdItem(course, directory);
128     if (task == null) {
129       return course.getLesson(directory.getName());
130     }
131     return task.getLesson();
132   }
133
134   @Nullable
135   @Override
136   protected StudyItem getThresholdItem(@NotNull Course course, @NotNull PsiDirectory sourceDirectory) {
137     return EduUtils.getTask(sourceDirectory, course);
138   }
139
140   @Override
141   protected boolean isAddedAsLast(@NotNull PsiDirectory sourceDirectory,
142                                   @NotNull Project project,
143                                   @NotNull Course course) {
144     return course.getLesson(sourceDirectory.getName()) != null;
145   }
146
147   @Override
148   protected List<? extends StudyItem> getSiblings(@NotNull Course course, @Nullable StudyItem parentItem) {
149     if (parentItem instanceof Lesson) {
150       return ((Lesson)parentItem).getTaskList();
151     }
152     return Collections.emptyList();
153   }
154
155   @Override
156   protected String getItemName() {
157     return EduNames.TASK;
158   }
159
160   @Override
161   protected StudyItem createAndInitItem(@NotNull Course course, @Nullable StudyItem parentItem, String name, int index) {
162     final Task task = new Task(name);
163     task.setIndex(index);
164     if (parentItem == null) {
165       return null;
166     }
167     task.setLesson(((Lesson)parentItem));
168     return task;
169   }
170 }