diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/GeneralProjectSettingsElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/GeneralProjectSettingsElement.java index 9a3329acd672..3ef8baac3448 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/GeneralProjectSettingsElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/GeneralProjectSettingsElement.java @@ -18,22 +18,23 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.compiler.ModuleCompilerUtil; import com.intellij.compiler.ModuleSourceSet; import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.module.UnloadedModuleDescription; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootModel; +import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Chunk; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; /** * @author nik @@ -123,6 +124,30 @@ public class GeneralProjectSettingsElement extends ProjectStructureElement { @Override public List getUsagesInElement() { + Collection unloadedModules = ModuleManager.getInstance(myContext.getProject()).getUnloadedModuleDescriptions(); + if (!unloadedModules.isEmpty()) { + MultiMap dependenciesInUnloadedModules = new MultiMap<>(); + for (UnloadedModuleDescription unloaded : unloadedModules) { + for (String moduleName : unloaded.getDependencyModuleNames()) { + Module depModule = myContext.getModulesConfigurator().getModuleModel().findModuleByName(moduleName); + if (depModule != null) { + dependenciesInUnloadedModules.putValue(depModule, unloaded); + } + } + } + + List usages = new ArrayList<>(); + for (Map.Entry> entry : dependenciesInUnloadedModules.entrySet()) { + usages.add(new UsagesInUnloadedModules(myContext, this, new ModuleProjectStructureElement(myContext, entry.getKey()), + entry.getValue())); + } + + //currently we don't store dependencies on project libraries from unloaded modules in the model, so suppose that all the project libraries are used + for (Library library : myContext.getProjectLibrariesProvider().getModifiableModel().getLibraries()) { + usages.add(new UsagesInUnloadedModules(myContext, this, new LibraryProjectStructureElement(myContext, library), unloadedModules)); + } + return usages; + } return Collections.emptyList(); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/UsagesInUnloadedModules.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/UsagesInUnloadedModules.java new file mode 100644 index 000000000000..9a522dd0a5aa --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/UsagesInUnloadedModules.java @@ -0,0 +1,93 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.module.UnloadedModuleDescription; +import com.intellij.openapi.roots.ui.configuration.GeneralProjectSettingsElement; +import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; +import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; +import com.intellij.ui.navigation.Place; +import com.intellij.util.ObjectUtils; +import com.intellij.util.containers.ContainerUtil; + +import javax.swing.*; +import java.util.Collection; + +/** + * @author nik + */ +public class UsagesInUnloadedModules extends ProjectStructureElementUsage { + private final StructureConfigurableContext myContext; + private final GeneralProjectSettingsElement myContainingElement; + private final ProjectStructureElement mySourceElement; + private final String myPresentableName; + + public UsagesInUnloadedModules(StructureConfigurableContext context, GeneralProjectSettingsElement element, + ProjectStructureElement sourceElement, Collection unloadedModules) { + myContext = context; + myContainingElement = element; + mySourceElement = sourceElement; + myPresentableName = + unloadedModules.size() > 1 ? unloadedModules.size() + " Unloaded Modules" + : "Unloaded Module '" + ObjectUtils.notNull(ContainerUtil.getFirstItem(unloadedModules)).getName() + "'"; + } + + @Override + public ProjectStructureElement getSourceElement() { + return mySourceElement; + } + + @Override + public ProjectStructureElement getContainingElement() { + return myContainingElement; + } + + @Override + public String getPresentableName() { + return myPresentableName; + } + + @Override + public PlaceInProjectStructure getPlace() { + Place configurablePlace = ProjectStructureConfigurable.getInstance(myContext.getProject()).createProjectConfigurablePlace(); + return new PlaceInProjectStructureBase(myContext.getProject(), configurablePlace, myContainingElement); + } + + @Override + public void removeSourceElement() { + } + + @Override + public void replaceElement(ProjectStructureElement newElement) { + + } + + @Override + public Icon getIcon() { + return AllIcons.Modules.UnloadedModule; + } + + @Override + public int hashCode() { + return 0; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof UsagesInUnloadedModules; + } +}