1 package com.jetbrains.edu.coursecreator.actions;
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;
31 import java.util.Collections;
32 import java.util.List;
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;
38 public CCCreateTask() {
39 super(EduNames.TASK_TITLED, TITLE, InteractiveLearningIcons.Task);
43 private static void createFromTemplate(@NotNull final PsiDirectory taskDirectory,
44 @Nullable final FileTemplate template,
45 @Nullable IdeView view, boolean open) {
46 if (template == null) {
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);
63 protected PsiDirectory getParentDir(@NotNull Project project, @NotNull Course course, @NotNull PsiDirectory directory) {
64 if (isAddedAsLast(directory, project, course)) {
67 return directory.getParent();
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);
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());
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) {
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) {
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);
113 return taskDirectory.get();
117 protected int getSiblingsSize(@NotNull Course course, @Nullable StudyItem parentItem) {
118 if (parentItem instanceof Lesson) {
119 return ((Lesson)parentItem).getTaskList().size();
126 protected StudyItem getParentItem(@NotNull Course course, @NotNull PsiDirectory directory) {
127 Task task = (Task)getThresholdItem(course, directory);
129 return course.getLesson(directory.getName());
131 return task.getLesson();
136 protected StudyItem getThresholdItem(@NotNull Course course, @NotNull PsiDirectory sourceDirectory) {
137 return EduUtils.getTask(sourceDirectory, course);
141 protected boolean isAddedAsLast(@NotNull PsiDirectory sourceDirectory,
142 @NotNull Project project,
143 @NotNull Course course) {
144 return course.getLesson(sourceDirectory.getName()) != null;
148 protected List<? extends StudyItem> getSiblings(@NotNull Course course, @Nullable StudyItem parentItem) {
149 if (parentItem instanceof Lesson) {
150 return ((Lesson)parentItem).getTaskList();
152 return Collections.emptyList();
156 protected String getItemName() {
157 return EduNames.TASK;
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) {
167 task.setLesson(((Lesson)parentItem));