1 package com.jetbrains.edu.coursecreator.projectView;
3 import com.intellij.ide.projectView.ViewSettings;
4 import com.intellij.ide.util.treeView.AbstractTreeNode;
5 import com.intellij.openapi.project.Project;
6 import com.intellij.openapi.vfs.VirtualFile;
7 import com.intellij.psi.PsiDirectory;
8 import com.intellij.psi.PsiElement;
9 import com.intellij.psi.PsiFile;
10 import com.intellij.psi.PsiNamedElement;
11 import com.jetbrains.edu.coursecreator.CCUtils;
12 import com.jetbrains.edu.learning.StudyLanguageManager;
13 import com.jetbrains.edu.learning.StudyTaskManager;
14 import com.jetbrains.edu.learning.StudyUtils;
15 import com.jetbrains.edu.learning.core.EduNames;
16 import com.jetbrains.edu.learning.courseFormat.Course;
17 import com.jetbrains.edu.learning.courseFormat.Task;
18 import com.jetbrains.edu.learning.projectView.TaskDirectoryNode;
19 import org.jetbrains.annotations.NotNull;
20 import org.jetbrains.annotations.Nullable;
22 public class CCTaskDirectoryNode extends TaskDirectoryNode {
23 public CCTaskDirectoryNode(@NotNull Project project,
25 ViewSettings viewSettings,
27 super(project, value, viewSettings, task);
32 public AbstractTreeNode modifyChildNode(AbstractTreeNode childNode) {
33 AbstractTreeNode node = super.modifyChildNode(childNode);
37 Object value = childNode.getValue();
38 if (value instanceof PsiElement) {
39 PsiElement psiElement = (PsiElement) value;
40 PsiFile psiFile = psiElement.getContainingFile();
41 VirtualFile virtualFile = psiFile.getVirtualFile();
42 if (virtualFile == null) {
45 if (StudyUtils.isTaskDescriptionFile(virtualFile.getName())) {
48 Course course = StudyTaskManager.getInstance(myProject).getCourse();
52 StudyLanguageManager manager = StudyUtils.getLanguageManager(course);
53 if (manager == null) {
54 return new CCStudentInvisibleFileNode(myProject, psiFile, myViewSettings);
56 if (!CCUtils.isTestsFile(myProject, virtualFile)) {
57 return new CCStudentInvisibleFileNode(myProject, psiFile, myViewSettings);
59 if (!myTask.hasSubtasks()) {
60 return new CCStudentInvisibleFileNode(myProject, psiFile, myViewSettings, getTestNodeName(manager, psiElement));
62 String testFileName = getTestNodeName(manager, psiElement);
63 return isActiveSubtaskTest(virtualFile) ? new CCStudentInvisibleFileNode(myProject, psiFile, myViewSettings, testFileName) : null;
69 private static String getTestNodeName(StudyLanguageManager manager, PsiElement psiElement) {
70 String defaultTestName = manager.getTestFileName();
71 if (psiElement instanceof PsiFile) {
72 return defaultTestName;
74 if (psiElement instanceof PsiNamedElement) {
75 String name = ((PsiNamedElement)psiElement).getName();
76 return name != null ? name : defaultTestName;
78 return defaultTestName;
81 private boolean isActiveSubtaskTest(VirtualFile virtualFile) {
82 if (!myTask.hasSubtasks()) {
86 boolean isSubtaskTestFile = virtualFile.getName().contains(EduNames.SUBTASK_MARKER);
87 if (myTask.getActiveSubtaskIndex() == 0) {
88 return !isSubtaskTestFile;
90 if (!isSubtaskTestFile) {
93 String nameWithoutExtension = virtualFile.getNameWithoutExtension();
94 int stepMarkerStart = nameWithoutExtension.indexOf(EduNames.SUBTASK_MARKER);
95 int stepIndex = Integer.valueOf(nameWithoutExtension.substring(EduNames.SUBTASK_MARKER.length() + stepMarkerStart));
96 return stepIndex == myTask.getActiveSubtaskIndex();