4b1e88f8dd65c658abcc38528435adc8c12a5c30
[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             }
54             final String parentName = parent.getName();
55             if (parentName != null) {
56               if (parentName.equals(EduNames.SANDBOX_DIR)) {
57                 nodes.add(node);
58               }
59               if (parentName.startsWith(EduNames.TASK)) {
60                 addNonInvisibleFiles(nodes, node, project, virtualFile);
61               }
62             }
63           }
64         }
65       }
66     }
67     return nodes;
68   }
69
70   @NotNull
71   protected AbstractTreeNode createStudyDirectoryNode(ViewSettings settings, Project project, PsiDirectory nodeValue) {
72     return new StudyDirectoryNode(project, nodeValue, settings);
73   }
74
75   private static void addNonInvisibleFiles(@NotNull final Collection<AbstractTreeNode> nodes,
76                                            @NotNull final AbstractTreeNode node,
77                                            @NotNull final Project project,
78                                            @NotNull final VirtualFile virtualFile) {
79     if (!StudyTaskManager.getInstance(project).isInvisibleFile(virtualFile.getPath())) {
80       String fileName = virtualFile.getName();
81       if (!fileName.contains(EduNames.WINDOW_POSTFIX) && !fileName.contains(EduNames.WINDOWS_POSTFIX)
82           && !StudyUtils.isTestsFile(project, fileName) && !StudyUtils.isTaskDescriptionFile(fileName)) {
83         nodes.add(node);
84       }
85     }
86   }
87
88   protected boolean needModify(@NotNull final AbstractTreeNode parent) {
89     final Project project = parent.getProject();
90     if (project == null) {
91       return false;
92     }
93     final StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(project);
94     Course course = studyTaskManager.getCourse();
95     if (course == null) {
96       return false;
97     }
98     return EduNames.STUDY.equals(course.getCourseMode());
99   }
100
101   @Nullable
102   @Override
103   public Object getData(Collection<AbstractTreeNode> selected, String dataName) {
104     return null;
105   }
106 }