diff --git a/source/com/intellij/analysis/AnalysisScope.java b/source/com/intellij/analysis/AnalysisScope.java index 3b77a2acf563..540042799ab7 100644 --- a/source/com/intellij/analysis/AnalysisScope.java +++ b/source/com/intellij/analysis/AnalysisScope.java @@ -11,18 +11,17 @@ package com.intellij.analysis; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.module.impl.ModuleUtil; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.roots.*; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VfsUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.util.ArrayUtil; import java.io.File; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; public class AnalysisScope { private static final Logger LOG = Logger.getInstance("#com.intellij.analysis.AnalysisScope"); @@ -33,9 +32,11 @@ public class AnalysisScope { public static final int MODULE = 4; public static final int PACKAGE = 5; public static final int INVALID = 6; + public static final int MODULES = 7; private final Project myProject; private PsiFileFilter myFilter; + private final List myModules; private final Module myModule; private final PsiElement myElement; private final int myType; @@ -62,6 +63,7 @@ public class AnalysisScope { myProject = project; myFilter = filter; myElement = null; + myModules = null; myModule = null; myType = PROJECT; } @@ -70,13 +72,25 @@ public class AnalysisScope { myFilter = filter; myProject = null; myElement = null; + myModules = null; myModule = module; myType = MODULE; } + public AnalysisScope(final Module[] modules, final PsiFileFilter filter) { + myFilter = filter; + myModules = Arrays.asList(modules); + myModule = null; + myFilter = filter; + myProject = null; + myElement = null; + myType = MODULES; + } + public AnalysisScope(PsiDirectory psiDirectory, PsiFileFilter filter) { myFilter = filter; myProject = null; + myModules = null; myModule = null; myElement = psiDirectory; if (psiDirectory.getPackage() != null) { @@ -91,6 +105,7 @@ public class AnalysisScope { myFilter = filter; myProject = null; myModule = null; + myModules = null; myElement = psiPackage; myType = PACKAGE; } @@ -100,6 +115,7 @@ public class AnalysisScope { myProject = null; myElement = psiFile; myModule = null; + myModules = null; myType = FILE; } @@ -140,7 +156,7 @@ public class AnalysisScope { myFilesSet = new HashSet(); myElement.accept(createFileSearcher()); } - else if (myType == PROJECT || myType == MODULE || myType == PACKAGE) { + else if (myType == PROJECT || myType == MODULES || myType == MODULE || myType == PACKAGE) { myFilesSet = new HashSet(); accept(createFileSearcher()); } @@ -182,6 +198,8 @@ public class AnalysisScope { } else if (myType == MODULE) { modules.add(myModule); + } else if (myType == MODULES){ + modules.addAll(myModules); } if (modules.isEmpty()) { @@ -246,6 +264,22 @@ public class AnalysisScope { } }); } + else if (myModules != null) { + for (Iterator iterator = myModules.iterator(); iterator.hasNext();) { + final Module module = iterator.next(); + final FileIndex moduleFileIndex = ModuleRootManager.getInstance(module).getFileIndex(); + moduleFileIndex.iterateContent(new ContentIterator() { + public boolean processFile(VirtualFile fileOrDir) { + if (moduleFileIndex.isContentJavaSourceFile(fileOrDir)) { + PsiFile psiFile = PsiManager.getInstance(module.getProject()).findFile(fileOrDir); + LOG.assertTrue(psiFile != null); + psiFile.accept(visitor); + } + return true; + } + }); + } + } else if (myElement instanceof PsiPackage) { PsiPackage pack = (PsiPackage)myElement; PsiDirectory[] dirs = pack.getDirectories(GlobalSearchScope.projectScope(myElement.getProject())); @@ -259,7 +293,7 @@ public class AnalysisScope { } public boolean isValid() { - if (myProject != null || myModule != null) return true; + if (myProject != null || myModule != null || myModules != null) return true; return myElement.isValid(); } @@ -271,6 +305,14 @@ public class AnalysisScope { switch (myType) { case MODULE: return "Module " + pathToName(myModule.getModuleFilePath()); + case MODULES: + String displayName = "Module" + (myModules.size() > 1 ? "s " : " "); + for (Iterator iterator = myModules.iterator(); iterator.hasNext();) { + Module module = iterator.next(); + displayName += pathToName(module.getModuleFilePath()) + ", "; + } + displayName = displayName.substring(0, displayName.length() - 2); + return displayName; case PROJECT: return "Project " + pathToName(myProject.getProjectFilePath()); case FILE: diff --git a/source/com/intellij/analysis/BaseAnalysisAction.java b/source/com/intellij/analysis/BaseAnalysisAction.java index c91daa29866f..a2dd9e9aaaa3 100644 --- a/source/com/intellij/analysis/BaseAnalysisAction.java +++ b/source/com/intellij/analysis/BaseAnalysisAction.java @@ -95,6 +95,10 @@ public abstract class BaseAnalysisAction extends AnAction { return new AnalysisScope(moduleContext, myFileFilter); } + Module [] modulesArray = (Module[])dataContext.getData(DataConstantsEx.MODULE_CONTEXT_ARRAY); + if (modulesArray != null) { + return new AnalysisScope(modulesArray, myFileFilter); + } PsiFile psiFile = (PsiFile)dataContext.getData(DataConstants.PSI_FILE); if (psiFile != null) { return psiFile instanceof PsiJavaFile ? new AnalysisScope(psiFile, myFileFilter) : null; diff --git a/source/com/intellij/packageDependencies/DependencyValidationManager.java b/source/com/intellij/packageDependencies/DependencyValidationManager.java index 864ed24b8cb5..4365a53196bb 100644 --- a/source/com/intellij/packageDependencies/DependencyValidationManager.java +++ b/source/com/intellij/packageDependencies/DependencyValidationManager.java @@ -9,7 +9,6 @@ import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowId; import com.intellij.openapi.wm.ToolWindowManager; -import com.intellij.packageDependencies.ui.DependenciesPanel; import com.intellij.peer.PeerFactory; import com.intellij.psi.PsiFile; import com.intellij.psi.search.scope.packageSet.NamedScope; diff --git a/source/com/intellij/packageDependencies/ui/FileNode.java b/source/com/intellij/packageDependencies/ui/FileNode.java index eecc31adb281..572d5a515027 100644 --- a/source/com/intellij/packageDependencies/ui/FileNode.java +++ b/source/com/intellij/packageDependencies/ui/FileNode.java @@ -51,6 +51,10 @@ public class FileNode extends PackageDependenciesNode { return 4; } + public int getContainingFiles() { + return 1; + } + public PsiElement getPsiElement() { return myFile; } diff --git a/source/com/intellij/packageDependencies/ui/GeneralGroupNode.java b/source/com/intellij/packageDependencies/ui/GeneralGroupNode.java index 968dc229d853..8f307608df22 100644 --- a/source/com/intellij/packageDependencies/ui/GeneralGroupNode.java +++ b/source/com/intellij/packageDependencies/ui/GeneralGroupNode.java @@ -30,7 +30,7 @@ public class GeneralGroupNode extends PackageDependenciesNode { } public String toString() { - return myName; + return myName + getPresentableFilesCount(); } public int getWeight() { diff --git a/source/com/intellij/packageDependencies/ui/LibraryNode.java b/source/com/intellij/packageDependencies/ui/LibraryNode.java index e4571cb85ab8..066e9ab7eb35 100644 --- a/source/com/intellij/packageDependencies/ui/LibraryNode.java +++ b/source/com/intellij/packageDependencies/ui/LibraryNode.java @@ -30,7 +30,7 @@ public class LibraryNode extends PackageDependenciesNode { } public String toString() { - return myLibraryOrJdk.getPresentableName(); + return myLibraryOrJdk.getPresentableName() + getPresentableFilesCount(); } public int getWeight() { diff --git a/source/com/intellij/packageDependencies/ui/ModuleNode.java b/source/com/intellij/packageDependencies/ui/ModuleNode.java index 81f0e68edd92..0093ffae4131 100644 --- a/source/com/intellij/packageDependencies/ui/ModuleNode.java +++ b/source/com/intellij/packageDependencies/ui/ModuleNode.java @@ -34,7 +34,7 @@ public class ModuleNode extends PackageDependenciesNode { } public String toString() { - return myModule == null ? "" : myModule.getName(); + return myModule == null ? "" : myModule.getName() + getPresentableFilesCount(); } public String getModuleName() { diff --git a/source/com/intellij/packageDependencies/ui/PackageDependenciesNode.java b/source/com/intellij/packageDependencies/ui/PackageDependenciesNode.java index a5fdcf7fe513..fe397ef36fc1 100644 --- a/source/com/intellij/packageDependencies/ui/PackageDependenciesNode.java +++ b/source/com/intellij/packageDependencies/ui/PackageDependenciesNode.java @@ -55,6 +55,19 @@ public class PackageDependenciesNode extends DefaultMutableTreeNode implements N return null; } + public int getContainingFiles(){ + int result = 0; + for (int i = 0; i < getChildCount(); i++) { + result += ((PackageDependenciesNode)getChildAt(i)).getContainingFiles(); + } + return result; + } + + protected String getPresentableFilesCount(){ + final int filesCount = getContainingFiles(); + return filesCount > 0 ? " (" + filesCount + (filesCount > 1 ? " entries" : " entry") + ")" : ""; + } + public void add(MutableTreeNode newChild) { super.add(newChild); boolean hasUnmarked = ((PackageDependenciesNode)newChild).hasUnmarked(); diff --git a/source/com/intellij/packageDependencies/ui/PackageNode.java b/source/com/intellij/packageDependencies/ui/PackageNode.java index 8b9b5483845c..9b4b51e502e7 100644 --- a/source/com/intellij/packageDependencies/ui/PackageNode.java +++ b/source/com/intellij/packageDependencies/ui/PackageNode.java @@ -40,7 +40,7 @@ public class PackageNode extends PackageDependenciesNode { } public String toString() { - return myPackageName; + return myPackageName + getPresentableFilesCount(); } public String getPackageQName() {