6fd47eaece843929f99930fc5d1f6f4867cc6f04
[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.TaskFile;
13 import com.jetbrains.edu.learning.StudyTaskManager;
14 import com.jetbrains.edu.learning.StudyUtils;
15 import org.jetbrains.annotations.NotNull;
16 import org.jetbrains.annotations.Nullable;
17
18 import java.util.ArrayList;
19 import java.util.Collection;
20
21 public class StudyTreeStructureProvider implements TreeStructureProvider, DumbAware {
22   @NotNull
23   @Override
24   public Collection<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent,
25                                              @NotNull Collection<AbstractTreeNode> children,
26                                              ViewSettings settings) {
27     if (!isCourseBasedProject(parent)) {
28       return children;
29     }
30     Collection<AbstractTreeNode> nodes = new ArrayList<>();
31     for (AbstractTreeNode node : children) {
32       final Project project = node.getProject();
33       if (project != null) {
34         if (node.getValue() instanceof PsiDirectory) {
35           final PsiDirectory nodeValue = (PsiDirectory)node.getValue();
36           final String name = nodeValue.getName();
37           if (!name.contains(EduNames.USER_TESTS) && !name.startsWith(".") && !"lib".equals(name)) {
38             AbstractTreeNode newNode = createStudyDirectoryNode(settings, project, nodeValue);
39             nodes.add(newNode);
40           }
41         }
42         else {
43           if (parent instanceof StudyDirectoryNode && node instanceof PsiFileNode) {
44             final PsiFileNode psiFileNode = (PsiFileNode)node;
45             final VirtualFile virtualFile = psiFileNode.getVirtualFile();
46             if (virtualFile == null) {
47               return nodes;
48             }
49             final TaskFile taskFile = StudyUtils.getTaskFile(project, virtualFile);
50             if (taskFile != null) {
51               nodes.add(node);
52             }
53             final String parentName = parent.getName();
54             if (parentName != null) {
55               if (parentName.equals(EduNames.SANDBOX_DIR)) {
56                 nodes.add(node);
57               }
58               if (parentName.startsWith(EduNames.TASK)) {
59                 addNonInvisibleFiles(nodes, node, project, virtualFile);
60               }
61             }
62           }
63         }
64       }
65     }
66     return nodes;
67   }
68
69   @NotNull
70   protected AbstractTreeNode createStudyDirectoryNode(ViewSettings settings, Project project, PsiDirectory nodeValue) {
71     return new StudyDirectoryNode(project, nodeValue, settings);
72   }
73
74   private static void addNonInvisibleFiles(@NotNull final Collection<AbstractTreeNode> nodes,
75                                            @NotNull final AbstractTreeNode node,
76                                            @NotNull final Project project,
77                                            @NotNull final VirtualFile virtualFile) {
78     if (!StudyTaskManager.getInstance(project).isInvisibleFile(virtualFile.getPath())) {
79       String fileName = virtualFile.getName();
80       if (!fileName.contains(EduNames.WINDOW_POSTFIX) && !fileName.contains(EduNames.WINDOWS_POSTFIX)
81           && !StudyUtils.isTestsFile(project, fileName) && !EduNames.TASK_HTML.equals(fileName) && !fileName.contains(".answer")) {
82         nodes.add(node);
83       }
84     }
85   }
86
87   protected boolean isCourseBasedProject(@NotNull final AbstractTreeNode parent) {
88     final Project project = parent.getProject();
89     if (project != null) {
90       final StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(project);
91       if (studyTaskManager.getCourse() == null) {
92         return false;
93       }
94     }
95     return true;
96   }
97
98   @Nullable
99   @Override
100   public Object getData(Collection<AbstractTreeNode> selected, String dataName) {
101     return null;
102   }
103 }