From 836e2020b507202021fe0aa9f77558f202712495 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 25 Nov 2009 09:35:55 +0300 Subject: [PATCH] IDEADEV-40609: If multiple libraries are missing from artifact, "Fix" should add all of them --- .../packaging/ui/ArtifactEditorContext.java | 4 ++ .../packaging/ui/ArtifactProblemsHolder.java | 2 +- .../artifacts/ArtifactEditorContextImpl.java | 6 +++ .../artifacts/ArtifactErrorPanel.java | 45 ++++++++++++++----- .../artifacts/ArtifactProblemDescription.java | 20 ++++----- .../artifacts/ArtifactProblemsHolderImpl.java | 6 ++- .../ArtifactValidationManagerImpl.java | 5 ++- ...ArtifactsStructureConfigurableContext.java | 4 ++ ...factsStructureConfigurableContextImpl.java | 8 ++++ .../ProjectStructureDaemonAnalyzer.java | 7 ++- 10 files changed, 79 insertions(+), 28 deletions(-) diff --git a/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactEditorContext.java b/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactEditorContext.java index a141702126f7..d5fe39d67bf4 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactEditorContext.java +++ b/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactEditorContext.java @@ -18,6 +18,7 @@ package com.intellij.packaging.ui; import com.intellij.facet.Facet; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.libraries.Library; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.artifacts.ArtifactType; @@ -45,6 +46,9 @@ public interface ArtifactEditorContext extends PackagingElementResolvingContext @Nullable ModifiableModuleModel getModifiableModuleModel(); + @NotNull + ModifiableRootModel getOrCreateModifiableRootModel(@NotNull Module module); + @Nullable ManifestFileConfiguration getManifestFile(CompositePackagingElement element, ArtifactType artifactType); diff --git a/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactProblemsHolder.java b/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactProblemsHolder.java index d0e6e2153d3f..be3d257a4ad9 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactProblemsHolder.java +++ b/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactProblemsHolder.java @@ -32,5 +32,5 @@ public interface ArtifactProblemsHolder { void registerError(@NotNull String message, @Nullable ArtifactProblemQuickFix quickFix); - void registerError(@NotNull String message, @Nullable List> pathToPlace, @Nullable ArtifactProblemQuickFix quickFix); + void registerError(@NotNull String message, @Nullable List> pathToPlace, ArtifactProblemQuickFix... quickFixes); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorContextImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorContextImpl.java index 746291a7169e..3b1de165c83b 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorContextImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorContextImpl.java @@ -19,6 +19,7 @@ import com.intellij.facet.Facet; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootModel; import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.impl.ModuleLibraryOrderEntryImpl; @@ -65,6 +66,11 @@ public class ArtifactEditorContextImpl implements ArtifactEditorContext { return myParent.getModifiableModuleModel(); } + @NotNull + public ModifiableRootModel getOrCreateModifiableRootModel(@NotNull Module module) { + return myParent.getOrCreateModifiableRootModel(module); + } + public ManifestFileConfiguration getManifestFile(CompositePackagingElement element, ArtifactType artifactType) { return myParent.getManifestFile(element, artifactType); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactErrorPanel.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactErrorPanel.java index 4bdac653f8c9..ffc5554a1188 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactErrorPanel.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactErrorPanel.java @@ -15,14 +15,18 @@ */ package com.intellij.openapi.roots.ui.configuration.artifacts; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.PopupStep; +import com.intellij.openapi.ui.popup.util.BaseListPopupStep; import com.intellij.openapi.util.IconLoader; import com.intellij.packaging.ui.ArtifactProblemQuickFix; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.List; /** * @author nik @@ -31,29 +35,50 @@ public class ArtifactErrorPanel { private JPanel myMainPanel; private JButton myFixButton; private JLabel myErrorLabel; - private ArtifactProblemQuickFix myCurrentQuickFix; + private List myCurrentQuickFixes; public ArtifactErrorPanel(final ArtifactEditorImpl artifactEditor) { myErrorLabel.setIcon(IconLoader.getIcon("/runConfigurations/configurationWarning.png")); myFixButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - if (myCurrentQuickFix != null) { - myCurrentQuickFix.performFix(artifactEditor); - artifactEditor.queueValidation(); + if (!myCurrentQuickFixes.isEmpty()) { + if (myCurrentQuickFixes.size() == 1) { + performFix(ContainerUtil.getFirstItem(myCurrentQuickFixes, null), artifactEditor); + } + else { + JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep(null, myCurrentQuickFixes) { + @NotNull + @Override + public String getTextFor(ArtifactProblemQuickFix value) { + return value.getActionName(); + } + + @Override + public PopupStep onChosen(ArtifactProblemQuickFix selectedValue, boolean finalChoice) { + performFix(selectedValue, artifactEditor); + return FINAL_CHOICE; + } + }).showUnderneathOf(myFixButton); + } } } }); clearError(); } - public void showError(@NotNull String message, @Nullable ArtifactProblemQuickFix quickFix) { + private static void performFix(ArtifactProblemQuickFix quickFix, ArtifactEditorImpl artifactEditor) { + quickFix.performFix(artifactEditor); + artifactEditor.queueValidation(); + } + + public void showError(@NotNull String message, @NotNull List quickFixes) { myErrorLabel.setVisible(true); myErrorLabel.setText("" + message + ""); myMainPanel.setVisible(true); - myCurrentQuickFix = quickFix; - myFixButton.setVisible(quickFix != null); - if (quickFix != null) { - myFixButton.setText(quickFix.getActionName()); + myCurrentQuickFixes = quickFixes; + myFixButton.setVisible(!quickFixes.isEmpty()); + if (!quickFixes.isEmpty()) { + myFixButton.setText(quickFixes.size() == 1 ? ContainerUtil.getFirstItem(quickFixes, null).getActionName() : "Fix"); } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemDescription.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemDescription.java index 2ccf2ee29ab5..8595333d1d6f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemDescription.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemDescription.java @@ -21,36 +21,32 @@ import com.intellij.packaging.ui.ArtifactProblemQuickFix; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; import java.util.List; /** * @author nik */ public class ArtifactProblemDescription extends ProjectStructureProblemDescription { - private ArtifactProblemQuickFix myQuickFix; + private List myQuickFixes; private List> myPathToPlace; public ArtifactProblemDescription(@NotNull String message, @NotNull Severity severity) { - super(message, severity); - } - - public ArtifactProblemDescription(@NotNull String message, @NotNull Severity severity, @Nullable ArtifactProblemQuickFix quickFix) { - super(message, severity); - myQuickFix = quickFix; + this(message, severity, null, Collections.emptyList()); } public ArtifactProblemDescription(@NotNull String message, @NotNull Severity severity, @Nullable List> pathToPlace, - @Nullable ArtifactProblemQuickFix quickFix) { + @NotNull List quickFixes) { super(message, severity); myPathToPlace = pathToPlace; - myQuickFix = quickFix; + myQuickFixes = quickFixes; } - @Nullable - public ArtifactProblemQuickFix getQuickFix() { - return myQuickFix; + @NotNull + public List getQuickFixes() { + return myQuickFixes; } @Nullable diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemsHolderImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemsHolderImpl.java index 809b5ee4961f..2673df78ddc6 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemsHolderImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProblemsHolderImpl.java @@ -24,6 +24,7 @@ import com.intellij.packaging.ui.ArtifactProblemQuickFix; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.List; /** @@ -37,7 +38,8 @@ public class ArtifactProblemsHolderImpl extends ArtifactProblemsHolderBase { myProblemsHolder = problemsHolder; } - public void registerError(@NotNull String message, @Nullable List> pathToPlace, @Nullable ArtifactProblemQuickFix quickFix) { - myProblemsHolder.registerProblem(new ArtifactProblemDescription(message, ProjectStructureProblemDescription.Severity.ERROR, pathToPlace, quickFix)); + public void registerError(@NotNull String message, @Nullable List> pathToPlace, @Nullable ArtifactProblemQuickFix... quickFixes) { + myProblemsHolder.registerProblem(new ArtifactProblemDescription(message, ProjectStructureProblemDescription.Severity.ERROR, pathToPlace, Arrays.asList( + quickFixes))); } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java index e4ae86d9c81e..5f023e4c2f7e 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java @@ -30,6 +30,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -78,9 +79,9 @@ public class ArtifactValidationManagerImpl implements Disposable { if (problemDescriptions != null) { for (ProjectStructureProblemDescription description : problemDescriptions) { final String message = description.getMessage(); - ArtifactProblemQuickFix quickFix = null; + List quickFix = Collections.emptyList(); if (description instanceof ArtifactProblemDescription) { - quickFix = ((ArtifactProblemDescription)description).getQuickFix(); + quickFix = ((ArtifactProblemDescription)description).getQuickFixes(); final List> pathToPlace = ((ArtifactProblemDescription)description).getPathToPlace(); if (pathToPlace != null) { myProblems.add(Pair.create(message, pathToPlace)); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContext.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContext.java index d2909c0d5ab6..3bb092504ef2 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContext.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContext.java @@ -16,6 +16,8 @@ package com.intellij.openapi.roots.ui.configuration.artifacts; import com.intellij.openapi.module.ModifiableModuleModel; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.artifacts.ModifiableArtifactModel; @@ -52,4 +54,6 @@ public interface ArtifactsStructureConfigurableContext extends PackagingElementR @NotNull ArtifactProjectStructureElement getOrCreateArtifactElement(@NotNull Artifact artifact); + + ModifiableRootModel getOrCreateModifiableRootModel(Module module); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java index 61e3a2448836..fbe1cebe332f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java @@ -18,8 +18,11 @@ package com.intellij.openapi.roots.ui.configuration.artifacts; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.module.ModifiableModuleModel; +import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ui.configuration.FacetsProvider; +import com.intellij.openapi.roots.ui.configuration.ModuleEditor; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureDaemonAnalyzerListener; @@ -229,4 +232,9 @@ public class ArtifactsStructureConfigurableContextImpl implements ArtifactsStruc } return element; } + + public ModifiableRootModel getOrCreateModifiableRootModel(Module module) { + final ModuleEditor editor = myContext.getModulesConfigurator().getEditor(module); + return editor.getModifiableRootModelProxy(); + } } 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 53aa63981541..bc34d1085614 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 @@ -245,7 +245,12 @@ public class ProjectStructureDaemonAnalyzer implements Disposable { } public void run() { - doUpdate(myElement, myCheck, myCollectUsages); + try { + doUpdate(myElement, myCheck, myCollectUsages); + } + catch (Throwable t) { + LOG.error(t); + } } } }