blob: a04d33c4b1c27c9254fac540cb24a1b80bc200cc [file] [log] [blame]
package com.intellij.coverage.view;
import com.intellij.coverage.CoverageAnnotator;
import com.intellij.coverage.CoverageSuitesBundle;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.util.ui.ColumnInfo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* User: anna
* Date: 1/9/12
*/
public class DirectoryCoverageViewExtension extends CoverageViewExtension {
private final CoverageAnnotator myAnnotator;
public DirectoryCoverageViewExtension(Project project,
CoverageAnnotator annotator,
CoverageSuitesBundle suitesBundle,
CoverageViewManager.StateBean stateBean) {
super(project, suitesBundle, stateBean);
myAnnotator = annotator;
}
@Override
public ColumnInfo[] createColumnInfos() {
return new ColumnInfo[]{new ElementColumnInfo(), new PercentageCoverageColumnInfo(1, "Statistics, %", mySuitesBundle, myStateBean)};
}
@Override
public String getSummaryForNode(AbstractTreeNode node) {
return "Coverage Summary for \'" + node.toString() + "\': " +
myAnnotator.getDirCoverageInformationString((PsiDirectory)node.getValue(), mySuitesBundle,
myCoverageDataManager);
}
@Override
public String getSummaryForRootNode(AbstractTreeNode childNode) {
final Object value = childNode.getValue();
String coverageInformationString = myAnnotator.getDirCoverageInformationString(((PsiDirectory)value), mySuitesBundle,
myCoverageDataManager);
return "Coverage Summary: " + coverageInformationString;
}
@Override
public String getPercentage(int columnIdx, AbstractTreeNode node) {
final Object value = node.getValue();
if (value instanceof PsiFile) {
return myAnnotator.getFileCoverageInformationString((PsiFile)value, mySuitesBundle, myCoverageDataManager);
}
return value != null ? myAnnotator.getDirCoverageInformationString((PsiDirectory)value, mySuitesBundle, myCoverageDataManager) : null;
}
@Override
public PsiElement getParentElement(PsiElement element) {
final PsiFile containingFile = element.getContainingFile();
if (containingFile != null) {
return containingFile.getContainingDirectory();
}
return null;
}
@Override
public AbstractTreeNode createRootNode() {
final VirtualFile baseDir = myProject.getBaseDir();
return new CoverageListRootNode(myProject, PsiManager.getInstance(myProject).findDirectory(baseDir), mySuitesBundle, myStateBean);
}
@Override
public List<AbstractTreeNode> getChildrenNodes(AbstractTreeNode node) {
List<AbstractTreeNode> children = new ArrayList<AbstractTreeNode>();
if (node instanceof CoverageListNode) {
final Object val = node.getValue();
if (val instanceof PsiFile) return Collections.emptyList();
final PsiDirectory psiDirectory = (PsiDirectory)val;
final PsiDirectory[] subdirectories = ApplicationManager.getApplication().runReadAction(new Computable<PsiDirectory[]>() {
@Override
public PsiDirectory[] compute() {
return psiDirectory.getSubdirectories();
}
});
for (PsiDirectory subdirectory : subdirectories) {
children.add(new CoverageListNode(myProject, subdirectory, mySuitesBundle, myStateBean));
}
final PsiFile[] psiFiles = ApplicationManager.getApplication().runReadAction(new Computable<PsiFile[]>() {
@Override
public PsiFile[] compute() {
return psiDirectory.getFiles();
}
});
for (PsiFile psiFile : psiFiles) {
children.add(new CoverageListNode(myProject, psiFile, mySuitesBundle, myStateBean));
}
for (AbstractTreeNode childNode : children) {
childNode.setParent(node);
}
}
return children;
}
}