blob: feecdc8aeb146f6eca564a9615d9f0a63848e046 [file] [log] [blame]
package com.intellij.coverage.view;
import com.intellij.codeInsight.navigation.NavigationUtil;
import com.intellij.coverage.CoverageSuitesBundle;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtilCore;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collection;
/**
* User: anna
* Date: 1/2/12
*/
public class CoverageListNode extends AbstractTreeNode {
protected CoverageSuitesBundle myBundle;
protected CoverageViewManager.StateBean myStateBean;
private final FileStatusManager myFileStatusManager;
public CoverageListNode(Project project,
final PsiNamedElement classOrPackage,
CoverageSuitesBundle bundle,
CoverageViewManager.StateBean stateBean) {
super(project, classOrPackage);
myName = ApplicationManager.getApplication().runReadAction(new Computable<String>() {
@Override
public String compute() {
return classOrPackage.getName();
}
});
myBundle = bundle;
myStateBean = stateBean;
myFileStatusManager = FileStatusManager.getInstance(myProject);
}
@NotNull
@Override
public Collection<? extends AbstractTreeNode> getChildren() {
final Object[] children = CoverageViewTreeStructure.getChildren(this, myBundle, myStateBean);
return (Collection<CoverageListNode>)Arrays.asList((CoverageListNode[])children);
}
@Override
protected void update(final PresentationData presentation) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
final Object value = getValue();
if (value instanceof PsiNamedElement) {
if (value instanceof PsiQualifiedNamedElement &&
(myStateBean.myFlattenPackages && ((PsiNamedElement)value).getContainingFile() == null ||
getParent() instanceof CoverageListRootNode)) {
presentation.setPresentableText(((PsiQualifiedNamedElement)value).getQualifiedName());
}
else {
presentation.setPresentableText(((PsiNamedElement)value).getName());
}
presentation.setIcon(((PsiElement)value).getIcon(0));
}
}
});
}
@Override
public FileStatus getFileStatus() {
final PsiFile containingFile = ApplicationManager.getApplication().runReadAction(new Computable<PsiFile>() {
@Nullable
@Override
public PsiFile compute() {
Object value = getValue();
if (value instanceof PsiElement && ((PsiElement)value).isValid()) {
return ((PsiElement)value).getContainingFile();
}
return null;
}
});
return containingFile != null ? myFileStatusManager.getStatus(containingFile.getVirtualFile()) : super.getFileStatus();
}
@Override
public boolean canNavigate() {
final Object value = getValue();
return value instanceof PsiElement && ((PsiElement)value).isValid() && ((PsiElement)value).getContainingFile() != null;
}
@Override
public boolean canNavigateToSource() {
return canNavigate();
}
@Override
public void navigate(boolean requestFocus) {
if (canNavigate()) {
final PsiNamedElement value = (PsiNamedElement)getValue();
if (requestFocus) {
NavigationUtil.activateFileWithPsiElement(value, true);
}
else if (value instanceof NavigationItem) {
((NavigationItem)value).navigate(requestFocus);
}
}
}
@Override
public int getWeight() {
return ApplicationManager.getApplication().runReadAction(new Computable<Integer>() {
@Override
public Integer compute() {
//todo weighted
final Object value = getValue();
if (value instanceof PsiElement && ((PsiElement)value).getContainingFile() != null) return 40;
return 30;
}
});
}
public boolean contains(VirtualFile file) {
final Object value = getValue();
if (value instanceof PsiElement) {
final boolean equalContainingFile = Comparing.equal(PsiUtilCore.getVirtualFile((PsiElement)value), file);
if (equalContainingFile) return true;
}
if (value instanceof PsiDirectory) {
return contains(file, (PsiDirectory)value);
}
else if (value instanceof PsiDirectoryContainer) {
final PsiDirectory[] directories = ((PsiDirectoryContainer)value).getDirectories();
for (PsiDirectory directory : directories) {
if (contains(file, directory)) return true;
}
}
return false;
}
private boolean contains(VirtualFile file, PsiDirectory value) {
if (myStateBean.myFlattenPackages) {
return Comparing.equal(((PsiDirectory)value).getVirtualFile(), file.getParent());
}
if (VfsUtilCore.isAncestor(((PsiDirectory)value).getVirtualFile(), file, false)) {
return true;
}
return false;
}
}