diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java index 321cd77fe74d..711b723141c9 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseLibrariesConfigurable.java @@ -46,6 +46,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; import java.util.*; public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurable { @@ -257,14 +258,23 @@ public abstract class BaseLibrariesConfigurable extends BaseStructureConfigurabl } public void removeLibrary(@NotNull LibraryProjectStructureElement element) { - getModelProvider().getModifiableModel().removeLibrary(element.getLibrary()); - myContext.getDaemonAnalyzer().removeElement(element); - final MyNode node = findNodeByObject(myRoot, element.getLibrary()); - if (node != null) { - removePaths(TreeUtil.getPathFromRoot(node)); - } + removeLibraries(Collections.singletonList(element)); } + public void removeLibraries(@NotNull List libraries) { + List pathsToRemove = new ArrayList(); + for (LibraryProjectStructureElement element : libraries) { + getModelProvider().getModifiableModel().removeLibrary(element.getLibrary()); + MyNode node = findNodeByObject(myRoot, element.getLibrary()); + if (node != null) { + pathsToRemove.add(TreeUtil.getPathFromRoot(node)); + } + } + myContext.getDaemonAnalyzer().removeElements(libraries); + removePaths(pathsToRemove.toArray(new TreePath[pathsToRemove.size()])); + } + + @Override protected boolean removeLibrary(final Library library) { final LibraryTable table = library.getTable(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java index 930cb514a80a..1fc3dbd66162 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/LibraryProjectStructureElement.java @@ -41,6 +41,7 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -148,7 +149,7 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { @Override public ProjectStructureProblemDescription createUnusedElementWarning() { - final List fixes = Arrays.asList(new AddLibraryToDependenciesFix(), new RemoveLibraryFix()); + final List fixes = Arrays.asList(new AddLibraryToDependenciesFix(), new RemoveLibraryFix(), new RemoveAllUnusedLibrariesFix()); return new ProjectStructureProblemDescription("Library '" + StringUtil.escapeXml(myLibrary.getName()) + "'" + " is not used", null, createPlace(), ProjectStructureProblemType.unused("unused-library"), ProjectStructureProblemDescription.ProblemLevel.PROJECT, fixes, false); @@ -225,4 +226,24 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { BaseLibrariesConfigurable.getInstance(myContext.getProject(), myLibrary.getTable().getTableLevel()).removeLibrary(LibraryProjectStructureElement.this); } } + + private class RemoveAllUnusedLibrariesFix extends ConfigurationErrorQuickFix { + private RemoveAllUnusedLibrariesFix() { + super("Remove All Unused Libraries"); + } + + @Override + public void performFix() { + BaseLibrariesConfigurable configurable = BaseLibrariesConfigurable.getInstance(myContext.getProject(), LibraryTablesRegistrar.PROJECT_LEVEL); + Library[] libraries = configurable.getModelProvider().getModifiableModel().getLibraries(); + List toRemove = new ArrayList(); + for (Library library : libraries) { + LibraryProjectStructureElement libraryElement = new LibraryProjectStructureElement(myContext, library); + if (myContext.getDaemonAnalyzer().getUsages(libraryElement).isEmpty()) { + toRemove.add(libraryElement); + } + } + configurable.removeLibraries(toRemove); + } + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java index 91183b9b5655..8b551b0f38f9 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureDaemonAnalyzer.java @@ -141,21 +141,28 @@ public class ProjectStructureDaemonAnalyzer implements Disposable { } public void removeElement(ProjectStructureElement element) { - myElementWithNotCalculatedUsages.remove(element); - myElementsToShowWarningIfUnused.remove(element); - myWarningsAboutUnused.remove(element); - myProblemHolders.remove(element); - final Collection usages = mySourceElement2Usages.removeAll(element); - if (usages != null) { - for (ProjectStructureElementUsage usage : usages) { - myProblemHolders.remove(usage.getContainingElement()); + removeElements(Collections.singletonList(element)); + } + + public void removeElements(@NotNull List elements) { + myElementWithNotCalculatedUsages.removeAll(elements); + myElementsToShowWarningIfUnused.removeAll(elements); + for (ProjectStructureElement element : elements) { + myWarningsAboutUnused.remove(element); + myProblemHolders.remove(element); + final Collection usages = mySourceElement2Usages.removeAll(element); + if (usages != null) { + for (ProjectStructureElementUsage usage : usages) { + myProblemHolders.remove(usage.getContainingElement()); + } } + removeUsagesInElement(element); + myDispatcher.getMulticaster().problemsChanged(element); } - removeUsagesInElement(element); - myDispatcher.getMulticaster().problemsChanged(element); reportUnusedElements(); } + private void reportUnusedElements() { if (!myElementWithNotCalculatedUsages.isEmpty()) return;