EDU-407 Files created by user code are invisible
[idea/community.git] / python / educational / interactive-learning / 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.EduNames;
12 import com.jetbrains.edu.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<AbstractTreeNode>();
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           if (!nodeValue.getName().contains(EduNames.USER_TESTS) && !nodeValue.getName().startsWith(".")) {
37             StudyDirectoryNode newNode = new StudyDirectoryNode(project, nodeValue, settings);
38             nodes.add(newNode);
39           }
40         }
41         else {
42           if (parent instanceof StudyDirectoryNode && node instanceof PsiFileNode) {
43             final PsiFileNode psiFileNode = (PsiFileNode)node;
44             final VirtualFile virtualFile = psiFileNode.getVirtualFile();
45             if (virtualFile == null) {
46               return nodes;
47             }
48             final TaskFile taskFile = StudyUtils.getTaskFile(project, virtualFile);
49             if (taskFile != null) {
50               nodes.add(node);
51             }
52             final String parentName = parent.getName();
53             if (parentName != null) {
54               if (parentName.equals(EduNames.SANDBOX_DIR)) {
55                 nodes.add(node);
56               }
57               if (parentName.startsWith(EduNames.TASK)) {
58                 addNonInvisibleFiles(nodes, node, project, virtualFile);
59               }
60             }
61           }
62         }
63       }
64     }
65     return nodes;
66   }
67
68   private static void addNonInvisibleFiles(@NotNull final Collection<AbstractTreeNode> nodes,
69                                            @NotNull final AbstractTreeNode node,
70                                            @NotNull final Project project,
71                                            @NotNull final VirtualFile virtualFile) {
72     if (!StudyTaskManager.getInstance(project).isInvisibleFile(virtualFile.getPath())) {
73       String fileName = virtualFile.getName();
74       if (!fileName.contains(EduNames.WINDOW_POSTFIX) && !fileName.contains(EduNames.WINDOWS_POSTFIX)) {
75         nodes.add(node);
76       }
77     }
78   }
79
80   protected boolean isCourseBasedProject(@NotNull final AbstractTreeNode parent) {
81     final Project project = parent.getProject();
82     if (project != null) {
83       final StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(project);
84       if (studyTaskManager.getCourse() == null) {
85         return false;
86       }
87     }
88     return true;
89   }
90
91   @Nullable
92   @Override
93   public Object getData(Collection<AbstractTreeNode> selected, String dataName) {
94     return null;
95   }
96 }