support for correct presentation of Class Nodes
[idea/community.git] / python / educational-core / course-creator / src / com / jetbrains / edu / coursecreator / projectView / CCTaskDirectoryNode.java
1 package com.jetbrains.edu.coursecreator.projectView;
2
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;
21
22 public class CCTaskDirectoryNode extends TaskDirectoryNode {
23   public CCTaskDirectoryNode(@NotNull Project project,
24                              PsiDirectory value,
25                              ViewSettings viewSettings,
26                              @NotNull Task task) {
27     super(project, value, viewSettings, task);
28   }
29
30   @Nullable
31   @Override
32   public AbstractTreeNode modifyChildNode(AbstractTreeNode childNode) {
33     AbstractTreeNode node = super.modifyChildNode(childNode);
34     if (node != null) {
35       return node;
36     }
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) {
43         return null;
44       }
45       if (StudyUtils.isTaskDescriptionFile(virtualFile.getName())) {
46         return null;
47       }
48       Course course = StudyTaskManager.getInstance(myProject).getCourse();
49       if (course == null) {
50         return null;
51       }
52       StudyLanguageManager manager = StudyUtils.getLanguageManager(course);
53       if (manager == null) {
54         return new CCStudentInvisibleFileNode(myProject, psiFile, myViewSettings);
55       }
56       if (!CCUtils.isTestsFile(myProject, virtualFile)) {
57         return new CCStudentInvisibleFileNode(myProject, psiFile, myViewSettings);
58       }
59       if (!myTask.hasSubtasks()) {
60         return new CCStudentInvisibleFileNode(myProject, psiFile, myViewSettings, getTestNodeName(manager, psiElement));
61       }
62       String testFileName = getTestNodeName(manager, psiElement);
63       return isActiveSubtaskTest(virtualFile) ? new CCStudentInvisibleFileNode(myProject, psiFile, myViewSettings, testFileName) : null;
64     }
65     return null;
66   }
67
68   @NotNull
69   private static String getTestNodeName(StudyLanguageManager manager, PsiElement psiElement) {
70     String defaultTestName = manager.getTestFileName();
71     if (psiElement instanceof PsiFile) {
72       return defaultTestName;
73     }
74     if (psiElement instanceof PsiNamedElement) {
75       String name = ((PsiNamedElement)psiElement).getName();
76       return name != null ? name : defaultTestName;
77     }
78     return defaultTestName;
79   }
80
81   private boolean isActiveSubtaskTest(VirtualFile virtualFile) {
82     if (!myTask.hasSubtasks()) {
83       return true;
84     }
85
86     boolean isSubtaskTestFile = virtualFile.getName().contains(EduNames.SUBTASK_MARKER);
87     if (myTask.getActiveSubtaskIndex() == 0) {
88       return !isSubtaskTestFile;
89     }
90     if (!isSubtaskTestFile) {
91       return false;
92     }
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();
97   }
98 }