// Copyright 2014 Pants project contributors (see CONTRIBUTORS.md). // Licensed under the Apache License, Version 2.0 (see LICENSE). package com.twitter.intellij.pants.projectview; import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.ModuleGroup; import com.intellij.ide.projectView.impl.nodes.AbstractProjectNode; import com.intellij.ide.projectView.impl.nodes.ExternalLibrariesNode; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.twitter.intellij.pants.PantsBundle; import com.twitter.intellij.pants.util.PantsUtil; import org.jetbrains.annotations.NotNull; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Optional; public class ProjectFilesViewProjectNode extends AbstractProjectNode { public ProjectFilesViewProjectNode(Project project, ViewSettings viewSettings) { super(project, project, viewSettings); } @Override protected AbstractTreeNode createModuleGroup(Module module) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { // should be never called throw new NoSuchMethodException(PantsBundle.message("pants.error.not.implemented")); } @Override protected AbstractTreeNode createModuleGroupNode(ModuleGroup moduleGroup) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { // should be never called throw new NoSuchMethodException(PantsBundle.message("pants.error.not.implemented")); } @NotNull @Override public Collection<? extends AbstractTreeNode> getChildren() { final Optional<VirtualFile> buildRoot = PantsUtil.findBuildRoot(myProject); final VirtualFile projectDir = buildRoot.orElse(myProject.getBaseDir()); if (projectDir == null) { LOG.warn(String.format("Couldn't find project directory for project '%s'", myProject.getName())); return Collections.emptyList(); } final AbstractTreeNode root = new VirtualFileTreeNode(myProject, projectDir, getSettings()); if (getSettings().isShowLibraryContents()) { return Arrays.asList( root, new ExternalLibrariesNode(getProject(), getSettings()) ); } return Collections.singletonList(root); } @Override public boolean contains(@NotNull VirtualFile file) { final Optional<VirtualFile> projectBuildRoot = PantsUtil.findBuildRoot(myProject.getBaseDir()); return super.contains(file) || (projectBuildRoot.isPresent() && VfsUtil.isAncestor(projectBuildRoot.get(), file, true)); } }