blob: 91bc7e36398716ce904ee4686b251694dcf2121b [file] [log] [blame]
package com.intellij.coverage.view;
import com.intellij.ide.commander.AbstractListBuilder;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.ide.util.treeView.AbstractTreeStructure;
import com.intellij.ide.util.treeView.AlphaComparator;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.vcs.FileStatusListener;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.TableUtil;
import com.intellij.ui.table.JBTable;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* User: anna
* Date: 1/2/12
*/
public class CoverageViewBuilder extends AbstractListBuilder {
private final JBTable myTable;
private final FileStatusListener myFileStatusListener;
private CoverageViewExtension myCoverageViewExtension;
CoverageViewBuilder(final Project project,
final JList list,
final Model model,
final AbstractTreeStructure treeStructure, final JBTable table) {
super(project, list, model, treeStructure, AlphaComparator.INSTANCE, false);
myTable = table;
ProgressManager.getInstance().run(new Task.Backgroundable(project, "Building coverage report...") {
@Override
public void run(@NotNull ProgressIndicator indicator) {
buildRoot();
}
@Override
public void onSuccess() {
ensureSelectionExist();
updateParentTitle();
}
});
myFileStatusListener = new FileStatusListener() {
@Override
public void fileStatusesChanged() {
table.repaint();
}
@Override
public void fileStatusChanged(@NotNull VirtualFile virtualFile) {
table.repaint();
}
};
myCoverageViewExtension = ((CoverageViewTreeStructure)myTreeStructure).myData
.getCoverageEngine().createCoverageViewExtension(myProject, ((CoverageViewTreeStructure)myTreeStructure).myData,
((CoverageViewTreeStructure)myTreeStructure).myStateBean);
FileStatusManager.getInstance(myProject).addFileStatusListener(myFileStatusListener);
}
@Override
public void dispose() {
FileStatusManager.getInstance(myProject).removeFileStatusListener(myFileStatusListener);
super.dispose();
}
@Override
protected boolean shouldEnterSingleTopLevelElement(Object rootChild) {
return false;
}
@Override
protected boolean shouldAddTopElement() {
return false;
}
@Override
protected boolean nodeIsAcceptableForElement(AbstractTreeNode node, Object element) {
return Comparing.equal(node.getValue(), element);
}
@Override
protected List<AbstractTreeNode> getAllAcceptableNodes(Object[] childElements, VirtualFile file) {
ArrayList<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
for (Object childElement1 : childElements) {
CoverageListNode childElement = (CoverageListNode)childElement1;
if (childElement.contains(file)) result.add(childElement);
}
return result;
}
@Override
protected void updateParentTitle() {
if (myParentTitle == null) return;
final Object rootElement = myTreeStructure.getRootElement();
AbstractTreeNode node = getParentNode();
if (node == null) {
node = (AbstractTreeNode)rootElement;
}
if (node instanceof CoverageListRootNode) {
myParentTitle.setText(myCoverageViewExtension.getSummaryForRootNode(node));
}
else {
myParentTitle.setText(myCoverageViewExtension.getSummaryForNode(node));
}
}
@Override
public Object getSelectedValue() {
final int row = myTable.getSelectedRow();
if (row == -1) return null;
return myModel.getElementAt(myTable.convertRowIndexToModel(row));
}
@Override
protected void ensureSelectionExist() {
TableUtil.ensureSelectionExists(myTable);
}
@Override
protected void selectItem(int i) {
TableUtil.selectRows(myTable, new int[]{myTable.convertRowIndexToView(i)});
TableUtil.scrollSelectionToVisible(myTable);
}
public boolean canSelect(VirtualFile file) {
return myCoverageViewExtension.canSelectInCoverageView(file);
}
public void select(Object object) {
selectElement(myCoverageViewExtension.getElementToSelect(object), myCoverageViewExtension.getVirtualFile(object));
}
}