1 package com.jetbrains.edu.coursecreator.projectView;
3 import com.intellij.ide.projectView.ViewSettings;
4 import com.intellij.ide.projectView.impl.nodes.PsiFileNode;
5 import com.intellij.ide.util.treeView.AbstractTreeNode;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.openapi.util.io.FileUtilRt;
8 import com.intellij.openapi.vfs.VirtualFile;
9 import com.intellij.psi.PsiDirectory;
10 import com.intellij.psi.PsiFile;
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.StudyTreeStructureProvider;
19 import org.jetbrains.annotations.NotNull;
21 import java.util.Collection;
23 public class CCTreeStructureProvider extends StudyTreeStructureProvider {
26 public Collection<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent,
27 @NotNull Collection<AbstractTreeNode> children,
28 ViewSettings settings) {
29 if (!needModify(parent)) {
32 Collection<AbstractTreeNode> modifiedChildren = super.modify(parent, children, settings);
34 for (AbstractTreeNode node : children) {
35 Project project = node.getProject();
36 if (project == null) {
39 if (node.getValue() instanceof PsiDirectory) {
40 String name = ((PsiDirectory)node.getValue()).getName();
41 if ("zip".equals(FileUtilRt.getExtension(name))) {
42 modifiedChildren.add(node);
46 if (node instanceof PsiFileNode) {
47 PsiFileNode fileNode = (PsiFileNode)node;
48 VirtualFile virtualFile = fileNode.getVirtualFile();
49 if (virtualFile == null) {
52 if (StudyUtils.getTaskFile(project, virtualFile) != null || StudyUtils.isTaskDescriptionFile(virtualFile.getName())) {
55 PsiFile psiFile = ((PsiFileNode)node).getValue();
56 boolean handled = handleTests(project, virtualFile, psiFile, modifiedChildren, settings);
58 modifiedChildren.add(new CCStudentInvisibleFileNode(project, psiFile, settings));
62 return modifiedChildren;
65 protected boolean needModify(@NotNull final AbstractTreeNode parent) {
66 Project project = parent.getProject();
67 if (project == null) {
70 return CCUtils.isCourseCreator(project);
73 private static boolean handleTests(Project project,
74 VirtualFile virtualFile,
76 Collection<AbstractTreeNode> modifiedChildren,
77 ViewSettings settings) {
78 Course course = StudyTaskManager.getInstance(project).getCourse();
82 if (!CCUtils.isTestsFile(project, virtualFile)) {
85 VirtualFile taskDir = StudyUtils.getTaskDir(virtualFile);
86 if (taskDir == null) {
89 Task task = StudyUtils.getTask(project, taskDir);
93 if (isActiveSubtaskTest(task, virtualFile)) {
94 StudyLanguageManager manager = StudyUtils.getLanguageManager(course);
95 String testsFileName = manager != null ? manager.getTestFileName() : psiFile.getName();
96 modifiedChildren.add(new CCStudentInvisibleFileNode(project, psiFile, settings,
102 private static boolean isActiveSubtaskTest(Task task, VirtualFile virtualFile) {
103 if (!task.hasSubtasks()) {
107 boolean isSubtaskTestFile = virtualFile.getName().contains(EduNames.SUBTASK_MARKER);
108 if (task.getActiveSubtaskIndex() == 0) {
109 return !isSubtaskTestFile;
111 if (!isSubtaskTestFile) {
114 String nameWithoutExtension = virtualFile.getNameWithoutExtension();
115 int stepMarkerStart = nameWithoutExtension.indexOf(EduNames.SUBTASK_MARKER);
116 int stepIndex = Integer.valueOf(nameWithoutExtension.substring(EduNames.SUBTASK_MARKER.length() + stepMarkerStart));
117 return stepIndex == task.getActiveSubtaskIndex();