scopes: project pattern cleanup

This commit is contained in:
anna
2011-07-21 17:20:59 +04:00
parent b311e265a9
commit f11bcf7c84
3 changed files with 94 additions and 83 deletions
@@ -132,7 +132,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di
public void fileStatusChanged(@NotNull VirtualFile virtualFile) {
final PsiFile file = PsiManager.getInstance(myProject).findFile(virtualFile);
if (file != null) {
final PackageDependenciesNode node = myBuilder.getFileParentNode(file);
final PackageDependenciesNode node = myBuilder.getFileParentNode(virtualFile);
final PackageDependenciesNode[] nodes = FileTreeModelBuilder.findNodeForPsiElement(node, file);
if (nodes != null) {
for (PackageDependenciesNode dependenciesNode : nodes) {
@@ -517,7 +517,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di
queueUpdate(new Runnable() {
public void run() {
if (file.isValid()) {
collapseExpand(myBuilder.getFileParentNode(file));
collapseExpand(myBuilder.getFileParentNode(file.getVirtualFile()));
}
}
}, false);
@@ -580,7 +580,7 @@ public class ScopeTreeViewPanel extends JPanel implements JDOMExternalizable, Di
final PackageSet packageSet = scope.getValue();
if (packageSet == null) return; //invalid scope selected
if (packageSet.contains(file, NamedScopesHolder.getHolder(myProject, scope.getName(), myDependencyValidationManager))) {
reload(myBuilder.getFileParentNode(file));
reload(myBuilder.getFileParentNode(file.getVirtualFile()));
}
else {
reload(myBuilder.removeNode(file, file.getParent()));
@@ -25,6 +25,7 @@ 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.psi.search.scope.packageSet.FilePatternPackageSet;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.Nullable;
@@ -36,42 +37,42 @@ import java.util.Set;
public class DirectoryNode extends PackageDependenciesNode {
private final String myDirName;
private final PsiDirectory myDirectory;
private PsiDirectory myDirectory;
private DirectoryNode myCompactedDirNode;
private DirectoryNode myWrapper;
private boolean myCompactPackages = true;
private String myFQName = null;
private VirtualFile myVDirectory;
//private static final Logger LOG = Logger.getInstance("#com.intellij.packageDependencies.ui.DirectoryNode");
public DirectoryNode(PsiDirectory aDirectory, boolean compactPackages, boolean showFQName) {
super(aDirectory.getProject());
myDirectory = aDirectory;
VirtualFile directory = myDirectory.getVirtualFile();
final ProjectFileIndex index = ProjectRootManager.getInstance(myDirectory.getProject()).getFileIndex();
public DirectoryNode(VirtualFile aDirectory, Project project, boolean compactPackages, boolean showFQName) {
super(project);
myVDirectory = aDirectory;
final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
String dirName = aDirectory.getName();
if (showFQName) {
final VirtualFile contentRoot = index.getContentRootForFile(directory);
final VirtualFile contentRoot = index.getContentRootForFile(myVDirectory);
if (contentRoot != null) {
if (directory == contentRoot) {
if (myVDirectory == contentRoot) {
myFQName = dirName;
}
else {
final VirtualFile sourceRoot = index.getSourceRootForFile(directory);
if (directory == sourceRoot) {
final VirtualFile sourceRoot = index.getSourceRootForFile(myVDirectory);
if (myVDirectory == sourceRoot) {
myFQName = dirName;
}
else if (sourceRoot != null) {
myFQName = VfsUtil.getRelativePath(directory, sourceRoot, '/');
myFQName = VfsUtil.getRelativePath(myVDirectory, sourceRoot, '/');
}
else {
myFQName = VfsUtil.getRelativePath(directory, contentRoot, '/');
myFQName = VfsUtil.getRelativePath(myVDirectory, contentRoot, '/');
}
}
}
else {
myFQName = FilePatternPackageSet.getLibRelativePath(directory, index);
myFQName = FilePatternPackageSet.getLibRelativePath(myVDirectory, index);
}
dirName = myFQName;
}
@@ -99,18 +100,17 @@ public class DirectoryNode extends PackageDependenciesNode {
}
public String getDirName() {
if (myDirectory == null || !myDirectory.isValid()) return "";
if (myVDirectory == null || !myVDirectory.isValid()) return "";
if (myCompactPackages && myCompactedDirNode != null) {
return myDirectory.getName() + "/" + myCompactedDirNode.getDirName();
return myVDirectory.getName() + "/" + myCompactedDirNode.getDirName();
}
return myDirName;
}
public String getFQName() {
final StringBuffer buf = new StringBuffer();
final Project project = myDirectory.getProject();
final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
VirtualFile directory = myDirectory.getVirtualFile();
final ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex();
VirtualFile directory = myVDirectory;
VirtualFile contentRoot = index.getContentRootForFile(directory);
if (directory == contentRoot) {
return "";
@@ -126,6 +126,14 @@ public class DirectoryNode extends PackageDependenciesNode {
}
public PsiElement getPsiElement() {
return getPsiDirectory();
}
@Nullable
private PsiDirectory getPsiDirectory() {
if (myDirectory == null) {
myDirectory = PsiManager.getInstance(myProject).findDirectory(myVDirectory);
}
return myDirectory;
}
@@ -136,7 +144,7 @@ public class DirectoryNode extends PackageDependenciesNode {
assert dirNode != null;
}
return dirNode.myDirectory;
return dirNode.getPsiDirectory();
}
public int getWeight() {
@@ -194,7 +202,7 @@ public class DirectoryNode extends PackageDependenciesNode {
public boolean isValid() {
return myDirectory != null && myDirectory.isValid();
return myVDirectory != null && myVDirectory.isValid();
}
public boolean canNavigate() {
@@ -203,8 +211,8 @@ public class DirectoryNode extends PackageDependenciesNode {
@Override
public String getComment() {
if (myDirectory != null && myDirectory.isValid()) {
return ProjectViewDirectoryHelper.getInstance(myDirectory.getProject()).getLocationString(myDirectory);
if (myVDirectory != null && myVDirectory.isValid()) {
return ProjectViewDirectoryHelper.getInstance(myProject).getLocationString(getPsiDirectory());
}
return super.getComment();
}
@@ -213,10 +221,14 @@ public class DirectoryNode extends PackageDependenciesNode {
public boolean canSelectInLeftTree(final Map<PsiFile, Set<PsiFile>> deps) {
Set<PsiFile> files = deps.keySet();
for (PsiFile file : files) {
if (file.getContainingDirectory() == myDirectory) {
if (file.getContainingDirectory() == getPsiDirectory()) {
return true;
}
}
return false;
}
public VirtualFile getDirectory() {
return myVDirectory;
}
}
@@ -33,7 +33,6 @@ 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.containers.HashSet;
import com.intellij.util.ui.tree.TreeUtil;
import org.jetbrains.annotations.NotNull;
@@ -48,8 +47,8 @@ import java.util.Set;
public class FileTreeModelBuilder {
private static final Key<Integer> FILE_COUNT = Key.create("FILE_COUNT");
public static final String SCANNING_PACKAGES_MESSAGE = AnalysisScopeBundle.message("package.dependencies.build.progress.text");
private final ProjectFileIndex myFileIndex;
private final PsiManager myPsiManager;
private final Project myProject;
private static final Logger LOG = Logger.getInstance("com.intellij.packageDependencies.ui.TreeModelBuilder");
@@ -62,7 +61,7 @@ public class FileTreeModelBuilder {
private final Marker myMarker;
private final boolean myAddUnmarkedFiles;
private final PackageDependenciesNode myRoot;
private final Map<PsiDirectory,DirectoryNode> myModuleDirNodes = new HashMap<PsiDirectory, DirectoryNode>();
private final Map<VirtualFile,DirectoryNode> myModuleDirNodes = new HashMap<VirtualFile, DirectoryNode>();
private final Map<Module, ModuleNode> myModuleNodes = new HashMap<Module, ModuleNode>();
private final Map<String, ModuleGroupNode> myModuleGroupNodes = new HashMap<String, ModuleGroupNode>();
private int myScannedFileCount = 0;
@@ -81,7 +80,6 @@ public class FileTreeModelBuilder {
myAddUnmarkedFiles = !settings.UI_FILTER_LEGALS;
myRoot = new RootNode(myProject);
myFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
myPsiManager = PsiManager.getInstance(project);
}
@@ -123,17 +121,16 @@ public class FileTreeModelBuilder {
}
public TreeModel build(final Project project, final boolean showProgress, final boolean sortByType) {
Runnable buildingRunnable = new Runnable() {
final Runnable buildingRunnable = new Runnable() {
public void run() {
countFiles(project);
final PsiManager psiManager = PsiManager.getInstance(project);
myFileIndex.iterateContent(new ContentIterator() {
PackageDependenciesNode lastParent = null;
public boolean processFile(VirtualFile fileOrDir) {
if (!fileOrDir.isDirectory()) {
final PsiFile psiFile = psiManager.findFile(fileOrDir);
if (psiFile != null) {
buildFileNode(psiFile);
}
lastParent = buildFileNode(fileOrDir, lastParent);
} else {
lastParent = null;
}
return true;
}
@@ -142,7 +139,8 @@ public class FileTreeModelBuilder {
};
if (showProgress) {
ProgressManager.getInstance().runProcessWithProgressSynchronously(buildingRunnable, AnalysisScopeBundle.message("package.dependencies.build.process.title"), true, project);
ProgressManager.getInstance().runProcessWithProgressSynchronously(buildingRunnable, AnalysisScopeBundle
.message("package.dependencies.build.process.title"), true, project);
}
else {
buildingRunnable.run();
@@ -156,9 +154,18 @@ public class FileTreeModelBuilder {
myTotalFileCount++;
ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
if (indicator != null) {
indicator.setText(AnalysisScopeBundle.message("package.dependencies.build.progress.text"));
indicator.setIndeterminate(true);
update(file, indicator, true, 0);
}
}
private static void update(VirtualFile file, ProgressIndicator indicator, boolean indeterminate, double fraction) {
if (indicator instanceof PanelProgressIndicator) {
((PanelProgressIndicator)indicator).update(SCANNING_PACKAGES_MESSAGE, indeterminate, fraction);
} else {
indicator.setText(SCANNING_PACKAGES_MESSAGE);
indicator.setIndeterminate(indeterminate);
indicator.setText2(file.getPresentableUrl());
indicator.setFraction(fraction);
}
}
@@ -171,14 +178,15 @@ public class FileTreeModelBuilder {
public void run() {
for (final PsiFile file : files) {
if (file != null) {
buildFileNode(file);
buildFileNode(file.getVirtualFile(), null);
}
}
}
};
if (showProgress) {
ProgressManager.getInstance().runProcessWithProgressSynchronously(buildingRunnable, AnalysisScopeBundle.message("package.dependencies.build.process.title"), false, myProject);
ProgressManager.getInstance().runProcessWithProgressSynchronously(buildingRunnable, AnalysisScopeBundle
.message("package.dependencies.build.process.title"), false, myProject);
}
else {
buildingRunnable.run();
@@ -188,57 +196,51 @@ public class FileTreeModelBuilder {
return new TreeModel(myRoot, myTotalFileCount, myMarkedFileCount);
}
private void buildFileNode(PsiFile file) {
private PackageDependenciesNode buildFileNode(VirtualFile file, PackageDependenciesNode lastParent) {
ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
if (file == null || !file.isValid()) return;
final VirtualFile virtualFile = file.getVirtualFile();
if (file == null || !file.isValid()) return null;
if (indicator != null) {
indicator.setIndeterminate(false);
indicator.setText(AnalysisScopeBundle.message("package.dependencies.build.progress.text"));
if (virtualFile != null) {
indicator.setText2(virtualFile.getPresentableUrl());
}
indicator.setFraction(((double)myScannedFileCount++) / myTotalFileCount);
update(file, indicator, false, ((double)myScannedFileCount++) / myTotalFileCount);
}
boolean isMarked = myMarker != null && myMarker.isMarked(virtualFile);
boolean isMarked = myMarker != null && myMarker.isMarked(file);
if (isMarked) myMarkedFileCount++;
if (isMarked || myAddUnmarkedFiles) {
PackageDependenciesNode dirNode = getFileParentNode(file);
PackageDependenciesNode dirNode = !myCompactEmptyMiddlePackages && lastParent != null ? lastParent : getFileParentNode(file);
if (myShowFiles) {
FileNode fileNode = new FileNode(virtualFile, myProject, isMarked);
FileNode fileNode = new FileNode(file, myProject, isMarked);
dirNode.add(fileNode);
}
else {
dirNode.addFile(virtualFile, isMarked);
dirNode.addFile(file, isMarked);
}
return dirNode;
}
return null;
}
public @NotNull PackageDependenciesNode getFileParentNode(PsiFile file) {
VirtualFile vFile = file.getVirtualFile();
LOG.assertTrue(vFile != null);
final VirtualFile containingDirectory = vFile.getParent();
LOG.assertTrue(containingDirectory != null, "physical: " + file.isPhysical() + ", " + file.getViewProvider().isPhysical() + ", " + file.getClass().getName());
return getModuleDirNode(file.getContainingDirectory(), myFileIndex.getModuleForFile(vFile), null);
public @NotNull PackageDependenciesNode getFileParentNode(VirtualFile file) {
LOG.assertTrue(file != null);
final VirtualFile containingDirectory = file.getParent();
return getModuleDirNode(containingDirectory, myFileIndex.getModuleForFile(file), null);
}
@Nullable
public DefaultMutableTreeNode removeNode(final PsiElement element, PsiDirectory parent) {
Module module = myFileIndex.getModuleForFile(parent.getVirtualFile());
final VirtualFile parentVirtualFile = parent.getVirtualFile();
Module module = myFileIndex.getModuleForFile(parentVirtualFile);
if (element instanceof PsiDirectory && myFlattenPackages) {
final PackageDependenciesNode moduleNode = getModuleNode(module);
final PsiDirectory psiDirectory = (PsiDirectory)element;
final VirtualFile virtualFile = psiDirectory.getVirtualFile();
final PackageDependenciesNode dirNode =
getModuleDirNode(psiDirectory, myFileIndex.getModuleForFile(virtualFile), null);
getModuleDirNode(virtualFile, myFileIndex.getModuleForFile(virtualFile), null);
dirNode.removeFromParent();
return moduleNode;
}
DefaultMutableTreeNode dirNode = getModuleDirNode(parent, module, null);
DefaultMutableTreeNode dirNode = getModuleDirNode(parentVirtualFile, module, null);
if (dirNode == null) return null;
final PackageDependenciesNode[] classOrDirNodes = findNodeForPsiElement((PackageDependenciesNode)dirNode, element);
if (classOrDirNodes != null){
@@ -255,7 +257,7 @@ public class FileTreeModelBuilder {
node.removeFromParent();
if (node instanceof DirectoryNode) {
while (node != null) { //clear all compacted links
myModuleDirNodes.put((PsiDirectory)((DirectoryNode)node).getPsiElement(), null);
myModuleDirNodes.put(((DirectoryNode)node).getDirectory(), null);
node = ((DirectoryNode)node).getCompactedDirNode();
}
} else if (node instanceof ModuleNode) {
@@ -286,7 +288,7 @@ public class FileTreeModelBuilder {
final VirtualFile vFile = file.getVirtualFile();
LOG.assertTrue(vFile != null);
PsiDirectory dirToReload = file.getContainingDirectory();
VirtualFile dirToReload = vFile.getParent();
PackageDependenciesNode rootToReload = myModuleDirNodes.get(dirToReload);
if (rootToReload == null && myFlattenPackages) {
final Module module = myFileIndex.getModuleForFile(vFile);
@@ -297,19 +299,19 @@ public class FileTreeModelBuilder {
}
} else {
while (rootToReload == null && dirToReload != null){
dirToReload = dirToReload.getParentDirectory();
dirToReload = dirToReload.getParent();
rootToReload = myModuleDirNodes.get(dirToReload);
}
}
PackageDependenciesNode dirNode = getFileParentNode(file);
PackageDependenciesNode dirNode = getFileParentNode(vFile);
dirNode.add(new FileNode(vFile, myProject, isMarked));
return rootToReload;
}
@Nullable
public PackageDependenciesNode findNode(PsiFile file, final PsiElement psiElement) {
PackageDependenciesNode parent = getFileParentNode(file);
PackageDependenciesNode parent = getFileParentNode(file.getVirtualFile());
PackageDependenciesNode[] nodes = findNodeForPsiElement(parent, file);
if (nodes == null || nodes.length == 0) {
return null;
@@ -349,12 +351,12 @@ public class FileTreeModelBuilder {
return result.isEmpty() ? null : result.toArray(new PackageDependenciesNode[result.size()]);
}
private PackageDependenciesNode getModuleDirNode(PsiDirectory psiDirectory, Module module, DirectoryNode childNode) {
if (psiDirectory == null) {
private PackageDependenciesNode getModuleDirNode(VirtualFile virtualFile, Module module, DirectoryNode childNode) {
if (virtualFile == null) {
return getModuleNode(module);
}
PackageDependenciesNode directoryNode = myModuleDirNodes.get(psiDirectory);
PackageDependenciesNode directoryNode = myModuleDirNodes.get(virtualFile);
if (directoryNode != null) {
if (myCompactEmptyMiddlePackages) {
DirectoryNode nestedNode = ((DirectoryNode)directoryNode).getCompactedDirNode();
@@ -384,26 +386,23 @@ public class FileTreeModelBuilder {
return directoryNode;
}
final VirtualFile virtualFile = psiDirectory.getVirtualFile();
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
final VirtualFile sourceRoot = fileIndex.getSourceRootForFile(virtualFile);
final VirtualFile contentRoot = fileIndex.getContentRootForFile(virtualFile);
directoryNode = new DirectoryNode(psiDirectory, myCompactEmptyMiddlePackages, myFlattenPackages);
myModuleDirNodes.put(psiDirectory, (DirectoryNode)directoryNode);
directoryNode = new DirectoryNode(virtualFile, myProject, myCompactEmptyMiddlePackages, myFlattenPackages);
myModuleDirNodes.put(virtualFile, (DirectoryNode)directoryNode);
final PsiDirectory directory = psiDirectory.getParentDirectory();
final VirtualFile directory = virtualFile.getParent();
if (!myFlattenPackages && directory != null) {
if (myCompactEmptyMiddlePackages && sourceRoot != virtualFile && contentRoot != virtualFile) {//compact
((DirectoryNode)directoryNode).setCompactedDirNode(childNode);
}
final VirtualFile parentDir = directory.getVirtualFile();
if (fileIndex.getModuleForFile(parentDir) == module) {
if (fileIndex.getModuleForFile(directory) == module) {
DirectoryNode parentDirectoryNode = myModuleDirNodes.get(directory);
if (parentDirectoryNode != null
|| !myCompactEmptyMiddlePackages
|| parentDir == sourceRoot || parentDir == contentRoot) {
|| directory == sourceRoot || directory == contentRoot) {
getModuleDirNode(directory, module, (DirectoryNode)directoryNode).add(directoryNode);
}
else {
@@ -418,11 +417,11 @@ public class FileTreeModelBuilder {
if (contentRoot == virtualFile) {
getModuleNode(module).add(directoryNode);
} else {
final PsiDirectory root;
final VirtualFile root;
if (sourceRoot != virtualFile && sourceRoot != null) {
root = myPsiManager.findDirectory(sourceRoot);
root = sourceRoot;
} else if (contentRoot != null) {
root = myPsiManager.findDirectory(contentRoot);
root = contentRoot;
} else {
root = null;
}