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