do not show task description for subtasks in project view
[idea/community.git] / python / educational-core / student / src / com / jetbrains / edu / learning / projectView / StudyTreeStructureProvider.java
1 package com.jetbrains.edu.learning.projectView;
2
3 import com.intellij.ide.projectView.TreeStructureProvider;
4 import com.intellij.ide.projectView.ViewSettings;
5 import com.intellij.ide.projectView.impl.nodes.PsiFileNode;
6 import com.intellij.ide.util.treeView.AbstractTreeNode;
7 import com.intellij.openapi.project.DumbAware;
8 import com.intellij.openapi.project.Project;
9 import com.intellij.openapi.vfs.VirtualFile;
10 import com.intellij.psi.PsiDirectory;
11 import com.jetbrains.edu.learning.core.EduNames;
12 import com.jetbrains.edu.learning.courseFormat.Course;
13 import com.jetbrains.edu.learning.courseFormat.TaskFile;
14 import com.jetbrains.edu.learning.StudyTaskManager;
15 import com.jetbrains.edu.learning.StudyUtils;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
18
19 import java.util.ArrayList;
20 import java.util.Collection;
21
22 public class StudyTreeStructureProvider implements TreeStructureProvider, DumbAware {
23   @NotNull
24   @Override
25   public Collection<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent,
26                                              @NotNull Collection<AbstractTreeNode> children,
27                                              ViewSettings settings) {
28     if (!needModify(parent)) {
29       return children;
30     }
31     Collection<AbstractTreeNode> nodes = new ArrayList<>();
32     for (AbstractTreeNode node : children) {
33       final Project project = node.getProject();
34       if (project != null) {
35         if (node.getValue() instanceof PsiDirectory) {
36           final PsiDirectory nodeValue = (PsiDirectory)node.getValue();
37           final String name = nodeValue.getName();
38           if (!name.contains(EduNames.USER_TESTS) && !name.startsWith(".") && !"lib".equals(name)) {
39             AbstractTreeNode newNode = createStudyDirectoryNode(settings, project, nodeValue);
40             nodes.add(newNode);
41           }
42         }
43         else {
44           if (parent instanceof StudyDirectoryNode && node instanceof PsiFileNode) {
45             final PsiFileNode psiFileNode = (PsiFileNode)node;
46             final VirtualFile virtualFile = psiFileNode.getVirtualFile();
47             if (virtualFile == null) {
48               return nodes;
49             }
50             final TaskFile taskFile = StudyUtils.getTaskFile(project, virtualFile);
51             if (taskFile != null) {
52               nodes.add(node);
53               continue;
54             }
55             final String parentName = parent.getName();
56             if (parentName != null) {
57               if (parentName.equals(EduNames.SANDBOX_DIR)) {
58                 nodes.add(node);
59               }
60               if (parentName.startsWith(EduNames.TASK)) {
61                 addNonInvisibleFiles(nodes, node, project, virtualFile);
62               }
63             }
64           }
65         }
66       }
67     }
68     return nodes;
69   }
70
71   @NotNull
72   protected AbstractTreeNode createStudyDirectoryNode(ViewSettings settings, Project project, PsiDirectory nodeValue) {
73     return new StudyDirectoryNode(project, nodeValue, settings);
74   }
75
76   private static void addNonInvisibleFiles(@NotNull final Collection<AbstractTreeNode> nodes,
77                                            @NotNull final AbstractTreeNode node,
78                                            @NotNull final Project project,
79                                            @NotNull final VirtualFile virtualFile) {
80     if (!StudyTaskManager.getInstance(project).isInvisibleFile(virtualFile.getPath())) {
81       String fileName = virtualFile.getName();
82       if (!fileName.contains(EduNames.WINDOW_POSTFIX) && !fileName.contains(EduNames.WINDOWS_POSTFIX)
83           && !StudyUtils.isTestsFile(project, fileName) && !StudyUtils.isTaskDescriptionFile(fileName)) {
84         nodes.add(node);
85       }
86     }
87   }
88
89   protected boolean needModify(@NotNull final AbstractTreeNode parent) {
90     final Project project = parent.getProject();
91     if (project == null) {
92       return false;
93     }
94     final StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(project);
95     Course course = studyTaskManager.getCourse();
96     if (course == null) {
97       return false;
98     }
99     return EduNames.STUDY.equals(course.getCourseMode());
100   }
101
102   @Nullable
103   @Override
104   public Object getData(Collection<AbstractTreeNode> selected, String dataName) {
105     return null;
106   }
107 }