1 package com.jetbrains.edu.learning.projectView;
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;
19 import java.util.ArrayList;
20 import java.util.Collection;
22 public class StudyTreeStructureProvider implements TreeStructureProvider, DumbAware {
25 public Collection<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent,
26 @NotNull Collection<AbstractTreeNode> children,
27 ViewSettings settings) {
28 if (!needModify(parent)) {
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);
44 if (parent instanceof StudyDirectoryNode && node instanceof PsiFileNode) {
45 final PsiFileNode psiFileNode = (PsiFileNode)node;
46 final VirtualFile virtualFile = psiFileNode.getVirtualFile();
47 if (virtualFile == null) {
50 final TaskFile taskFile = StudyUtils.getTaskFile(project, virtualFile);
51 if (taskFile != null) {
54 final String parentName = parent.getName();
55 if (parentName != null) {
56 if (parentName.equals(EduNames.SANDBOX_DIR)) {
59 if (parentName.startsWith(EduNames.TASK)) {
60 addNonInvisibleFiles(nodes, node, project, virtualFile);
71 protected AbstractTreeNode createStudyDirectoryNode(ViewSettings settings, Project project, PsiDirectory nodeValue) {
72 return new StudyDirectoryNode(project, nodeValue, settings);
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) && !EduNames.TASK_HTML.equals(fileName)) {
88 protected boolean needModify(@NotNull final AbstractTreeNode parent) {
89 final Project project = parent.getProject();
90 if (project == null) {
93 final StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(project);
94 Course course = studyTaskManager.getCourse();
98 return EduNames.STUDY.equals(course.getCourseMode());
103 public Object getData(Collection<AbstractTreeNode> selected, String dataName) {