955e29d5bf0e22f5e0807a7e5fc45a6a22bb0867
[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             }
58           }
59         }
60       }
61     }
62     return nodes;
63   }
64
65   protected boolean isCourseBasedProject(@NotNull final AbstractTreeNode parent) {
66     final Project project = parent.getProject();
67     if (project != null) {
68       final StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(project);
69       if (studyTaskManager.getCourse() == null) {
70         return false;
71       }
72     }
73     return true;
74   }
75
76   @Nullable
77   @Override
78   public Object getData(Collection<AbstractTreeNode> selected, String dataName) {
79     return null;
80   }
81 }