From 4bbbde4a04e8c0443bd27bfc2ba33877a0a41d9d Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 30 Sep 2011 13:42:46 +0400 Subject: [PATCH] project structure dialog: persisting ignored errors --- .../impl/ui/ArtifactProblemsHolderBase.java | 5 +- .../packaging/ui/ArtifactProblemsHolder.java | 10 +-- .../ui/configuration/ConfigurationError.java | 4 +- .../GeneralProjectSettingsElement.java | 42 ++++++++++- .../ui/configuration/ProjectConfigurable.java | 4 +- .../artifacts/ArtifactProblemDescription.java | 8 ++- .../artifacts/ArtifactProblemsHolderImpl.java | 25 ++++--- .../ArtifactProjectStructureElement.java | 18 +++-- .../artifacts/PlaceInArtifact.java | 16 +++++ .../artifacts/nodes/PackagingElementNode.java | 4 +- .../BaseStructureConfigurable.java | 4 +- .../daemon/FacetProjectStructureElement.java | 16 +++-- .../LibraryProjectStructureElement.java | 69 ++++++++++++------- .../daemon/ModuleProjectStructureElement.java | 31 +++++---- .../daemon/PlaceInModuleClasspath.java | 24 +++++-- .../daemon/PlaceInProjectStructure.java | 7 ++ .../daemon/PlaceInProjectStructureBase.java | 15 +++- .../daemon/ProjectConfigurationProblem.java | 24 ++++++- .../daemon/ProjectConfigurationProblems.java | 2 +- .../daemon/ProjectStructureElement.java | 9 +++ .../ProjectStructureProblemDescription.java | 20 ++++-- .../daemon/ProjectStructureProblemType.java | 51 ++++++++++++++ .../ProjectStructureProblemsHolder.java | 5 +- .../ProjectStructureProblemsHolderImpl.java | 20 +++--- .../ProjectStructureProblemsSettings.java | 32 +++++++++ .../ProjectStructureProblemsSettingsImpl.java | 66 ++++++++++++++++++ .../daemon/SdkProjectStructureElement.java | 15 ++-- .../daemon/UsageInModuleClasspath.java | 2 +- .../src/messages/ProjectBundle.properties | 6 +- resources/src/META-INF/IdeaPlugin.xml | 2 + 30 files changed, 439 insertions(+), 117 deletions(-) create mode 100644 java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemType.java create mode 100644 java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsSettings.java create mode 100644 java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsSettingsImpl.java diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/ui/ArtifactProblemsHolderBase.java b/java/compiler/impl/src/com/intellij/packaging/impl/ui/ArtifactProblemsHolderBase.java index 6825a8c9c95d..c14e2a854044 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/ui/ArtifactProblemsHolderBase.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/ui/ArtifactProblemsHolderBase.java @@ -29,11 +29,12 @@ public abstract class ArtifactProblemsHolderBase implements ArtifactProblemsHold myContext = context; } + @NotNull public PackagingElementResolvingContext getContext() { return myContext; } - public void registerError(@NotNull String message) { - registerError(message, null); + public void registerError(@NotNull String message, @NotNull String problemTypeId) { + registerError(message, problemTypeId, null); } } 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 71ad4f0b369b..abe822909ece 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactProblemsHolder.java +++ b/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactProblemsHolder.java @@ -26,12 +26,14 @@ import java.util.List; * @author nik */ public interface ArtifactProblemsHolder { - + @NotNull PackagingElementResolvingContext getContext(); - void registerError(@NotNull String message); + void registerError(@NotNull String message, @NotNull String problemTypeId); - void registerError(@NotNull String message, @Nullable List> pathToPlace, @NotNull ArtifactProblemQuickFix... quickFixes); + void registerError(@NotNull String message, @NotNull String problemTypeId, @Nullable List> pathToPlace, + @NotNull ArtifactProblemQuickFix... quickFixes); - void registerWarning(@NotNull String message, @Nullable List> pathToPlace, @NotNull ArtifactProblemQuickFix... quickFixes); + void registerWarning(@NotNull String message, @NotNull String problemTypeId, @Nullable List> pathToPlace, + @NotNull ArtifactProblemQuickFix... quickFixes); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationError.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationError.java index 66a8de47a85a..c0ffe7a36a11 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationError.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationError.java @@ -23,8 +23,8 @@ import javax.swing.*; * User: spLeaner */ public abstract class ConfigurationError implements Comparable { - protected String myPlainTextTitle; - protected String myDescription; + private final String myPlainTextTitle; + private final String myDescription; private boolean myIgnored; protected ConfigurationError(final String plainTextTitle, final String description) { 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 f617e748f080..3b5f30ab9c48 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 @@ -39,6 +39,11 @@ public class GeneralProjectSettingsElement extends ProjectStructureElement { super(context); } + @Override + public String getPresentableName() { + return "Project"; + } + @Override public void check(ProjectStructureProblemsHolder problemsHolder) { final Graph> graph = ModuleCompilerUtil.toChunkGraph(myContext.getModulesConfigurator().createGraphGenerator()); @@ -59,10 +64,20 @@ public class GeneralProjectSettingsElement extends ProjectStructureElement { if (count > 0) { @NonNls final String leftBrace = ""; @NonNls final String rightBrace = ""; - final String warningMessage = leftBrace + ProjectBundle.message("module.circular.dependency.warning", cycles, count) + rightBrace; + final String fullDescription = leftBrace + ProjectBundle.message("module.circular.dependency.warning", cycles, count) + rightBrace; final Project project = myContext.getProject(); - final PlaceInProjectStructureBase place = new PlaceInProjectStructureBase(project, ProjectStructureConfigurable.getInstance(project).createModulesPlace()); - problemsHolder.registerWarning("Circular dependencies", warningMessage, place, null); + for (Chunk chunk : chunks) { + final Set nodes = chunk.getNodes(); + if (nodes.size() > 1) { + final PlaceInProjectStructureBase place = new PlaceInProjectStructureBase(project, ProjectStructureConfigurable.getInstance(project).createModulesPlace(), this); + StringBuilder names = new StringBuilder(); + for (ModifiableRootModel model : nodes) { + if (names.length() > 0) names.append(", "); + names.append(model.getModule().getName()); + } + problemsHolder.registerProblem(new CircularDependencyProblemDescription("Circular dependency between modules " + names, fullDescription, place)); + } + } } } @@ -76,6 +91,11 @@ public class GeneralProjectSettingsElement extends ProjectStructureElement { return false; } + @Override + public String getId() { + return "project:general"; + } + @Override public boolean equals(Object obj) { return obj instanceof GeneralProjectSettingsElement; @@ -85,4 +105,20 @@ public class GeneralProjectSettingsElement extends ProjectStructureElement { public int hashCode() { return 0; } + + public static class CircularDependencyProblemDescription extends ProjectStructureProblemDescription { + @NotNull private final String myFullDescription; + + public CircularDependencyProblemDescription(@NotNull String message, + @NotNull String fullDescription, + @NotNull PlaceInProjectStructure place) { + super(message, null, place, Collections.emptyList(), ProjectStructureProblemType.warning("module-circular-dependency")); + myFullDescription = fullDescription; + } + + @NotNull + public String getFullDescription() { + return myFullDescription; + } + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectConfigurable.java index b1aa213d4d7c..cad59b15428d 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectConfigurable.java @@ -120,9 +120,9 @@ public class ProjectConfigurable extends ProjectStructureElementConfigurable> myPathToPlace; - public ArtifactProblemDescription(@NotNull String message, @NotNull Severity severity, @Nullable List> pathToPlace, - @NotNull PlaceInArtifact place, final List quickFixList) { - super(message, null, severity, place, quickFixList); + public ArtifactProblemDescription(@NotNull String message, @NotNull ProjectStructureProblemType problemType, + @Nullable List> pathToPlace, @NotNull PlaceInArtifact place, + final List quickFixList) { + super(message, null, place, quickFixList, problemType); myPathToPlace = pathToPlace; } 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 a9753945e350..6b24b966af97 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 @@ -16,7 +16,7 @@ package com.intellij.openapi.roots.ui.configuration.artifacts; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ConfigurationErrorQuickFix; -import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemDescription; +import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemType; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemsHolder; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.elements.PackagingElement; @@ -47,12 +47,21 @@ public class ArtifactProblemsHolderImpl extends ArtifactProblemsHolderBase { myProblemsHolder = problemsHolder; } - public void registerError(@NotNull String message, @Nullable List> pathToPlace, @NotNull ArtifactProblemQuickFix... quickFixes) { - registerProblem(message, pathToPlace, ProjectStructureProblemDescription.Severity.ERROR, quickFixes); + public void registerError(@NotNull String message, + @NotNull String problemTypeId, + @Nullable List> pathToPlace, + @NotNull ArtifactProblemQuickFix... quickFixes) { + registerProblem(message, pathToPlace, ProjectStructureProblemType.error(problemTypeId), quickFixes); + } + + public void registerWarning(@NotNull String message, + @NotNull String problemTypeId, @Nullable List> pathToPlace, + @NotNull ArtifactProblemQuickFix... quickFixes) { + registerProblem(message, pathToPlace, ProjectStructureProblemType.warning(problemTypeId), quickFixes); } private void registerProblem(@NotNull String message, @Nullable List> pathToPlace, - final ProjectStructureProblemDescription.Severity severity, @NotNull ArtifactProblemQuickFix... quickFixes) { + final ProjectStructureProblemType problemType, @NotNull ArtifactProblemQuickFix... quickFixes) { String parentPath; PackagingElement element; if (pathToPlace != null && !pathToPlace.isEmpty()) { @@ -65,13 +74,7 @@ public class ArtifactProblemsHolderImpl extends ArtifactProblemsHolderBase { } final Artifact artifact = myContext.getArtifactModel().getArtifactByOriginal(myOriginalArtifact); final PlaceInArtifact place = new PlaceInArtifact(artifact, myContext, parentPath, element); - myProblemsHolder.registerProblem(new ArtifactProblemDescription(message, severity, pathToPlace, place, convertQuickFixes(quickFixes))); - } - - public void registerWarning(@NotNull String message, - @Nullable List> pathToPlace, - @NotNull ArtifactProblemQuickFix... quickFixes) { - registerProblem(message, pathToPlace, ProjectStructureProblemDescription.Severity.WARNING, quickFixes); + myProblemsHolder.registerProblem(new ArtifactProblemDescription(message, problemType, pathToPlace, place, convertQuickFixes(quickFixes))); } private List convertQuickFixes(ArtifactProblemQuickFix[] quickFixes) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProjectStructureElement.java index 9c1643282e08..0005bfc3d0cc 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactProjectStructureElement.java @@ -114,11 +114,6 @@ public class ArtifactProjectStructureElement extends ProjectStructureElement { return new UsageInArtifact(myOriginalArtifact, myArtifactsStructureContext, element, this, path.getPathString(), packagingElement); } - @Override - public String toString() { - return "artifact:" + myOriginalArtifact.getName(); - } - @Override public boolean equals(Object o) { if (this == o) return true; @@ -138,4 +133,17 @@ public class ArtifactProjectStructureElement extends ProjectStructureElement { return false; } + @Override + public String getPresentableName() { + return "Artifact '" + getActualArtifactName() + "'"; + } + + @Override + public String getId() { + return "artifact:" + getActualArtifactName(); + } + + private String getActualArtifactName() { + return myArtifactsStructureContext.getArtifactModel().getArtifactByOriginal(myOriginalArtifact).getName(); + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/PlaceInArtifact.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/PlaceInArtifact.java index 8580edea68ce..1ce7d47a305b 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/PlaceInArtifact.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/PlaceInArtifact.java @@ -17,6 +17,7 @@ package com.intellij.openapi.roots.ui.configuration.artifacts; import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.PlaceInProjectStructure; +import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureElement; import com.intellij.openapi.util.ActionCallback; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.elements.PackagingElement; @@ -40,6 +41,21 @@ public class PlaceInArtifact extends PlaceInProjectStructure { myPackagingElement = packagingElement; } + @NotNull + @Override + public ProjectStructureElement getContainingElement() { + return myContext.getOrCreateArtifactElement(myArtifact); + } + + @Override + public String getPlacePath() { + if (myParentPath != null && myPackagingElement != null) { + //todo[nik] use id of element? + return myParentPath + "/" + myPackagingElement.getType().getId(); + } + return null; + } + @NotNull @Override public ActionCallback navigate() { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/PackagingElementNode.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/PackagingElementNode.java index 7e1e8e653623..7be4d398a30d 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/PackagingElementNode.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/PackagingElementNode.java @@ -20,7 +20,7 @@ import com.intellij.openapi.editor.markup.EffectType; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.roots.ui.configuration.artifacts.ArtifactEditorImpl; import com.intellij.openapi.roots.ui.configuration.artifacts.ArtifactProblemDescription; -import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemDescription; +import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemType; import com.intellij.openapi.util.MultiValuesMap; import com.intellij.packaging.elements.CompositePackagingElement; import com.intellij.packaging.elements.PackagingElement; @@ -107,7 +107,7 @@ public class PackagingElementNode> extends Artifac try { buffer.append(""); for (ArtifactProblemDescription problem : problems) { - isError |= problem.getSeverity() == ProjectStructureProblemDescription.Severity.ERROR; + isError |= problem.getSeverity() == ProjectStructureProblemType.Severity.ERROR; buffer.append(problem.getMessage()).append("
"); } buffer.append(""); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseStructureConfigurable.java index 92849908baec..7f575dd06a6c 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/BaseStructureConfigurable.java @@ -196,14 +196,14 @@ public abstract class BaseStructureConfigurable extends MasterDetailsComponent i if (problemsHolder == null) { daemonAnalyzer.queueUpdate(projectStructureElement, true, false); } - final ProjectStructureProblemDescription.Severity level = problemsHolder != null ? problemsHolder.getSeverity() : null; + final ProjectStructureProblemType.Severity level = problemsHolder != null ? problemsHolder.getSeverity() : null; final boolean invalid = level != null; if (unused || invalid) { Color fg = unused ? UIUtil.getInactiveTextColor() : selected && hasFocus ? UIUtil.getTreeSelectionForeground() : UIUtil.getTreeForeground(); textAttributes = new SimpleTextAttributes(invalid ? SimpleTextAttributes.STYLE_WAVED : SimpleTextAttributes.STYLE_PLAIN, fg, - level == ProjectStructureProblemDescription.Severity.ERROR ? Color.RED : Color.GRAY); + level == ProjectStructureProblemType.Severity.ERROR ? Color.RED : Color.GRAY); String text = problemsHolder != null ? problemsHolder.composeTooltipMessage() : ""; if (unused) { text += ProjectBundle.message("project.roots.tooltip.unused", displayName); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/FacetProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/FacetProjectStructureElement.java index c2a1ce1e59f0..43e79bc7bc30 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/FacetProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/FacetProjectStructureElement.java @@ -16,6 +16,7 @@ package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon; import com.intellij.facet.Facet; +import com.intellij.facet.pointers.FacetPointersManager; import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; import org.jetbrains.annotations.NotNull; @@ -47,6 +48,16 @@ public class FacetProjectStructureElement extends ProjectStructureElement { return false; } + @Override + public String getPresentableName() { + return "Facet '" + myFacet.getName() + "' in module '" + myFacet.getModule().getName() + "'"; + } + + @Override + public String getId() { + return "facet:" + FacetPointersManager.constructId(myFacet); + } + @Override public boolean equals(Object obj) { return obj instanceof FacetProjectStructureElement && myFacet.equals(((FacetProjectStructureElement)obj).myFacet); @@ -56,9 +67,4 @@ public class FacetProjectStructureElement extends ProjectStructureElement { public int hashCode() { return myFacet.hashCode(); } - - @Override - public String toString() { - return "facet:" + myFacet.getName() + " in " + myFacet.getModule().getName(); - } } 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 356ee2aa0ebc..9417597aebfa 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 @@ -1,7 +1,6 @@ package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.roots.JavadocOrderRootType; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.impl.libraries.LibraryEx; @@ -17,14 +16,11 @@ import com.intellij.openapi.roots.ui.configuration.projectRoot.LibraryConfigurab import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext; import com.intellij.openapi.ui.NamedConfigurable; import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import javax.swing.*; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -49,22 +45,38 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { final LibraryEx library = (LibraryEx)myContext.getLibraryModel(myLibrary); if (library == null || library.isDisposed()) return; - final String libraryName = library.getName(); - final List invalidClasses = library.getInvalidRootUrls(OrderRootType.CLASSES); - if (!invalidClasses.isEmpty()) { - final String description = createInvalidRootsDescription(invalidClasses, libraryName); - problemsHolder.registerError(ProjectBundle.message("project.roots.tooltip.library.misconfigured", libraryName), description, createPlace(), - new RemoveInvalidRootsQuickFix(Collections.singletonMap(OrderRootType.CLASSES, invalidClasses), library)); - } - final List invalidJavadocs = library.getInvalidRootUrls(JavadocOrderRootType.getInstance()); - final List invalidSources = library.getInvalidRootUrls(OrderRootType.SOURCES); - if (!invalidJavadocs.isEmpty() || !invalidSources.isEmpty()) { - final Map> invalidRoots = new HashMap>(); - invalidRoots.put(OrderRootType.SOURCES, invalidSources); - invalidRoots.put(JavadocOrderRootType.getInstance(), invalidJavadocs); - final String description = createInvalidRootsDescription(ContainerUtil.concat(invalidJavadocs, invalidSources), libraryName); - problemsHolder.registerWarning(ProjectBundle.message("project.roots.tooltip.library.misconfigured", libraryName), description, createPlace(), - new RemoveInvalidRootsQuickFix(invalidRoots, library)); + //final String libraryName = library.getName(); + reportInvalidRoots(problemsHolder, library, OrderRootType.CLASSES, ProjectStructureProblemType.error("library-invalid-classes-path")); + reportInvalidRoots(problemsHolder, library, OrderRootType.SOURCES, ProjectStructureProblemType.warning("library-invalid-source-javadoc-path")); + reportInvalidRoots(problemsHolder, library, JavadocOrderRootType.getInstance(), ProjectStructureProblemType.warning("library-invalid-source-javadoc-path")); + //if (!invalidClasses.isEmpty()) { + // final String description = createInvalidRootsDescription(invalidClasses, libraryName); + // problemsHolder.registerProblem(ProjectBundle.message("project.roots.error.message.invalid.classes.roots", invalidClasses.size()), description, ProjectStructureProblemType.error("library-invalid-classes-path"), + // createPlace(), + // new RemoveInvalidRootsQuickFix(Collections.singletonMap(OrderRootType.CLASSES, invalidClasses), + // library)); + //} + //final List invalidJavadocs = library.getInvalidRootUrls(JavadocOrderRootType.getInstance()); + //final List invalidSources = library.getInvalidRootUrls(OrderRootType.SOURCES); + //if (!invalidJavadocs.isEmpty() || !invalidSources.isEmpty()) { + // final Map> invalidRoots = new HashMap>(); + // invalidRoots.put(OrderRootType.SOURCES, invalidSources); + // invalidRoots.put(JavadocOrderRootType.getInstance(), invalidJavadocs); + // final String description = createInvalidRootsDescription(ContainerUtil.concat(invalidJavadocs, invalidSources), libraryName); + // problemsHolder.registerProblem(ProjectBundle.message("project.roots.error.message.invalid.source.javadoc.roots", invalidJavadocs.size()+invalidSources.size()), description, + // ProjectStructureProblemType.warning("library-invalid-source-javadoc-path"), + // createPlace(), + // new RemoveInvalidRootsQuickFix(invalidRoots, library)); + //} + } + + private void reportInvalidRoots(ProjectStructureProblemsHolder problemsHolder, + LibraryEx library, + final OrderRootType type, final ProjectStructureProblemType problemType) { + final List invalidClasses = library.getInvalidRootUrls(type); + for (String url : invalidClasses) { + problemsHolder.registerProblem("invalid path '" + url + "'", null, problemType, + createPlace(), new RemoveInvalidRootsQuickFix(Collections.singletonMap(type, Collections.singletonList(url)), library)); } } @@ -83,7 +95,7 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { @NotNull private PlaceInProjectStructure createPlace() { final Project project = myContext.getProject(); - return new PlaceInProjectStructureBase(project, ProjectStructureConfigurable.getInstance(project).createProjectOrGlobalLibraryPlace(myLibrary)); + return new PlaceInProjectStructureBase(project, ProjectStructureConfigurable.getInstance(project).createProjectOrGlobalLibraryPlace(myLibrary), this); } @Override @@ -113,17 +125,22 @@ public class LibraryProjectStructureElement extends ProjectStructureElement { return getSourceOrThis().hashCode(); } - @Override - public String toString() { - return "library:" + myLibrary.getName(); - } - @Override public boolean highlightIfUnused() { final LibraryTable libraryTable = myLibrary.getTable(); return libraryTable != null && LibraryTablesRegistrar.PROJECT_LEVEL.equals(libraryTable.getTableLevel()); } + @Override + public String getPresentableName() { + return "Library '" + myLibrary.getName() + "'"; + } + + @Override + public String getId() { + return "library:" + myLibrary.getTable().getTableLevel() + ":" + myLibrary.getName(); + } + private class RemoveInvalidRootsQuickFix extends ConfigurationErrorQuickFix { private final Map> myInvalidRoots; private final Library myLibrary; diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ModuleProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ModuleProjectStructureElement.java index f9cac84a151e..5915083f67d5 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ModuleProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ModuleProjectStructureElement.java @@ -41,7 +41,8 @@ public class ModuleProjectStructureElement extends ProjectStructureElement { for (Module each : all) { if (each != myModule && myContext.getRealName(each).equals(myContext.getRealName(myModule))) { - problemsHolder.registerError(ProjectBundle.message("project.roots.module.duplicate.name.message"), null, createPlace(), null); + problemsHolder.registerProblem(ProjectBundle.message("project.roots.module.duplicate.name.message"), null, ProjectStructureProblemType.error("duplicate-module-name"), createPlace(), + null); break; } } @@ -52,12 +53,13 @@ public class ModuleProjectStructureElement extends ProjectStructureElement { for (OrderEntry entry : entries) { if (!entry.isValid()){ if (entry instanceof JdkOrderEntry && ((JdkOrderEntry)entry).getJdkName() == null) { - problemsHolder.registerError(ProjectBundle.message("project.roots.module.jdk.problem.message"), null, createPlace(entry), null); + problemsHolder.registerProblem(ProjectBundle.message("project.roots.module.jdk.problem.message"), null, ProjectStructureProblemType.error("module-sdk-not-defined"), createPlace(entry), + null); } else { - problemsHolder.registerError(ProjectBundle.message("project.roots.library.problem.message", entry.getPresentableName()), null, - createPlace(entry), - null); + problemsHolder.registerProblem(ProjectBundle.message("project.roots.library.problem.message", entry.getPresentableName()), null, + ProjectStructureProblemType.error("invalid-module-dependency"), createPlace(entry), + null); } } //todo[nik] highlight libraries with invalid paths in ClasspathEditor @@ -77,11 +79,11 @@ public class ModuleProjectStructureElement extends ProjectStructureElement { private PlaceInProjectStructure createPlace() { final Project project = myContext.getProject(); - return new PlaceInProjectStructureBase(project, ProjectStructureConfigurable.getInstance(project).createModulePlace(myModule)); + return new PlaceInProjectStructureBase(project, ProjectStructureConfigurable.getInstance(project).createModulePlace(myModule), this); } private PlaceInProjectStructure createPlace(OrderEntry entry) { - return new PlaceInModuleClasspath(myContext, myModule, entry); + return new PlaceInModuleClasspath(myContext, myModule, this, entry); } @Override @@ -127,13 +129,18 @@ public class ModuleProjectStructureElement extends ProjectStructureElement { return myModule.hashCode(); } - @Override - public String toString() { - return "module:" + myModule.getName(); - } - @Override public boolean highlightIfUnused() { return false; } + + @Override + public String getPresentableName() { + return "Module '" + myModule.getName() + "'"; + } + + @Override + public String getId() { + return "module:" + myModule.getName(); + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInModuleClasspath.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInModuleClasspath.java index 1bf77792e50a..1bf444845bd1 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInModuleClasspath.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInModuleClasspath.java @@ -28,19 +28,22 @@ import org.jetbrains.annotations.NotNull; * @author nik */ public class PlaceInModuleClasspath extends PlaceInProjectStructure { - private StructureConfigurableContext myContext; - private Module myModule; - private OrderEntry myOrderEntry; + private final StructureConfigurableContext myContext; + private final Module myModule; + private final ProjectStructureElement myElement; + private final OrderEntry myOrderEntry; - public PlaceInModuleClasspath(StructureConfigurableContext context, Module module, OrderEntry orderEntry) { + public PlaceInModuleClasspath(StructureConfigurableContext context, Module module, ProjectStructureElement element, OrderEntry orderEntry) { myContext = context; myModule = module; + myElement = element; myOrderEntry = orderEntry; } - public PlaceInModuleClasspath(@NotNull StructureConfigurableContext context, @NotNull Module module, @NotNull ProjectStructureElement elementInClasspath) { + public PlaceInModuleClasspath(@NotNull StructureConfigurableContext context, @NotNull Module module, ProjectStructureElement element, @NotNull ProjectStructureElement elementInClasspath) { myContext = context; myModule = module; + myElement = element; ModuleRootModel rootModel = myContext.getModulesConfigurator().getRootModel(myModule); if (elementInClasspath instanceof LibraryProjectStructureElement) { myOrderEntry = OrderEntryUtil.findLibraryOrderEntry(rootModel, ((LibraryProjectStructureElement)elementInClasspath).getLibrary()); @@ -56,6 +59,17 @@ public class PlaceInModuleClasspath extends PlaceInProjectStructure { } } + @NotNull + @Override + public ProjectStructureElement getContainingElement() { + return myElement; + } + + @Override + public String getPlacePath() { + return myOrderEntry != null ? myOrderEntry.getPresentableName() : null; + } + @NotNull @Override public ActionCallback navigate() { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInProjectStructure.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInProjectStructure.java index dc5a46fb5d8a..03cf009b1b68 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInProjectStructure.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInProjectStructure.java @@ -17,11 +17,18 @@ package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon; import com.intellij.openapi.util.ActionCallback; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author nik */ public abstract class PlaceInProjectStructure { + @NotNull + public abstract ProjectStructureElement getContainingElement(); + + @Nullable + public abstract String getPlacePath(); + @NotNull public abstract ActionCallback navigate(); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInProjectStructureBase.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInProjectStructureBase.java index b9b152f8ed0f..4331c5f88b69 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInProjectStructureBase.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/PlaceInProjectStructureBase.java @@ -27,10 +27,23 @@ import org.jetbrains.annotations.NotNull; public class PlaceInProjectStructureBase extends PlaceInProjectStructure { private final Project myProject; private final Place myPlace; + private final ProjectStructureElement myElement; - public PlaceInProjectStructureBase(Project project, Place place) { + public PlaceInProjectStructureBase(Project project, Place place, ProjectStructureElement element) { myProject = project; myPlace = place; + myElement = element; + } + + @Override + public String getPlacePath() { + return null; + } + + @NotNull + @Override + public ProjectStructureElement getContainingElement() { + return myElement; } @NotNull diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblem.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblem.java index f876ce463486..c2dc5d183ee1 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblem.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblem.java @@ -12,10 +12,12 @@ */ package com.intellij.openapi.roots.ui.configuration.projectRoot.daemon; +import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ui.configuration.ConfigurationError; 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.text.StringUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -26,10 +28,28 @@ import java.util.List; */ class ProjectConfigurationProblem extends ConfigurationError { private final ProjectStructureProblemDescription myDescription; + private final Project myProject; - public ProjectConfigurationProblem(ProjectStructureProblemDescription description) { - super(description.getMessage(), description.getDescription() != null ? description.getDescription() : description.getMessage()); + public ProjectConfigurationProblem(ProjectStructureProblemDescription description, Project project) { + super(computeMessage(description), computeDescription(description), + ProjectStructureProblemsSettings.getInstance(project).isIgnored(description)); myDescription = description; + myProject = project; + } + + private static String computeDescription(ProjectStructureProblemDescription description) { + final String descriptionString = description.getDescription(); + return descriptionString != null ? descriptionString : computeMessage(description); + } + + private static String computeMessage(ProjectStructureProblemDescription description) { + return description.getPlace().getContainingElement().getPresentableName() + ": " + StringUtil.decapitalize(description.getMessage()); + } + + @Override + public void ignore(boolean b) { + super.ignore(b); + ProjectStructureProblemsSettings.getInstance(myProject).setIgnored(myDescription, b); } @Override diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblems.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblems.java index e77ea6e267d3..9392d8458ad5 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblems.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectConfigurationProblems.java @@ -67,7 +67,7 @@ public class ProjectConfigurationProblems { final List descriptions = problemsHolder.getProblemDescriptions(); if (descriptions != null) { for (ProjectStructureProblemDescription description : descriptions) { - final ProjectConfigurationProblem error = new ProjectConfigurationProblem(description); + final ProjectConfigurationProblem error = new ProjectConfigurationProblem(description, myContext.getProject()); myErrors.put(element, error); ConfigurationErrors.Bus.addError(error, myContext.getProject()); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureElement.java index 70ee1e0352ca..40884089009a 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureElement.java @@ -15,6 +15,10 @@ public abstract class ProjectStructureElement { myContext = context; } + public abstract String getPresentableName(); + + public abstract String getId(); + public abstract void check(ProjectStructureProblemsHolder problemsHolder); public abstract List getUsagesInElement(); @@ -26,4 +30,9 @@ public abstract class ProjectStructureElement { @Override public abstract int hashCode(); + + @Override + public String toString() { + return getId(); + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemDescription.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemDescription.java index 5af61c4359f3..b4d3b63b25f1 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemDescription.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemDescription.java @@ -26,17 +26,20 @@ import java.util.List; public class ProjectStructureProblemDescription { private final String myMessage; private final String myDescription; - private final Severity mySeverity; private final PlaceInProjectStructure myPlace; private final List myFixes; + private final ProjectStructureProblemType myProblemType; - public ProjectStructureProblemDescription(@NotNull String message, @Nullable String description, @NotNull Severity severity, @NotNull PlaceInProjectStructure place, - @NotNull List fixes) { + public ProjectStructureProblemDescription(@NotNull String message, + @Nullable String description, + @NotNull PlaceInProjectStructure place, + @NotNull List fixes, + @NotNull ProjectStructureProblemType problemType) { myMessage = message; myDescription = description; - mySeverity = severity; myPlace = place; myFixes = fixes; + myProblemType = problemType; } public String getMessage() { @@ -52,13 +55,16 @@ public class ProjectStructureProblemDescription { return myFixes; } - public Severity getSeverity() { - return mySeverity; + public ProjectStructureProblemType.Severity getSeverity() { + return myProblemType.getSeverity(); } public PlaceInProjectStructure getPlace() { return myPlace; } - public enum Severity { ERROR, WARNING } + public String getId() { + final String placePath = myPlace.getPlacePath(); + return myProblemType.getId() + "(" + myPlace.getContainingElement().getId() + (placePath != null ? "," + placePath : "") + ")"; + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemType.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemType.java new file mode 100644 index 000000000000..7e22bb32eab5 --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemType.java @@ -0,0 +1,51 @@ +/* + * Copyright 2000-2011 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 org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public class ProjectStructureProblemType { + public enum Severity { ERROR, WARNING } + + private final String myId; + private final Severity mySeverity; + + public ProjectStructureProblemType(@NotNull String id, @NotNull Severity severity) { + myId = id; + mySeverity = severity; + } + + public static ProjectStructureProblemType error(@NotNull String id) { + return new ProjectStructureProblemType(id, Severity.ERROR); + } + + public static ProjectStructureProblemType warning(@NotNull String id) { + return new ProjectStructureProblemType(id, Severity.WARNING); + } + + @NotNull + public String getId() { + return myId; + } + + @NotNull + public Severity getSeverity() { + return mySeverity; + } +} diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsHolder.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsHolder.java index b4d3a36bbb3b..e6d6a8c260b7 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsHolder.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsHolder.java @@ -22,9 +22,8 @@ import org.jetbrains.annotations.Nullable; * @author nik */ public interface ProjectStructureProblemsHolder { - void registerError(@NotNull String message, @Nullable String description, @NotNull PlaceInProjectStructure place, @Nullable ConfigurationErrorQuickFix fix); - - void registerWarning(@NotNull String message, @Nullable String description, @NotNull PlaceInProjectStructure place, @Nullable ConfigurationErrorQuickFix fix); + void registerProblem(@NotNull String message, @Nullable String description, @NotNull ProjectStructureProblemType problemType, + @NotNull PlaceInProjectStructure place, @Nullable ConfigurationErrorQuickFix fix); void registerProblem(@NotNull ProjectStructureProblemDescription description); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsHolderImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsHolderImpl.java index 4d31e1452efb..02bfd58e6c40 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsHolderImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsHolderImpl.java @@ -15,14 +15,12 @@ import java.util.List; public class ProjectStructureProblemsHolderImpl implements ProjectStructureProblemsHolder { private List myProblemDescriptions; - public void registerError(@NotNull String message, String description, @NotNull PlaceInProjectStructure place, @Nullable ConfigurationErrorQuickFix fix) { + public void registerProblem(@NotNull String message, @Nullable String description, + @NotNull ProjectStructureProblemType problemType, + @NotNull PlaceInProjectStructure place, + @Nullable ConfigurationErrorQuickFix fix) { final List fixes = fix != null ? Collections.singletonList(fix) : Collections.emptyList(); - registerProblem(new ProjectStructureProblemDescription(message, description, ProjectStructureProblemDescription.Severity.ERROR, place, fixes)); - } - - public void registerWarning(@NotNull String message, String description, @NotNull PlaceInProjectStructure place, @Nullable ConfigurationErrorQuickFix fix) { - final List fixes = Collections.singletonList(fix); - registerProblem(new ProjectStructureProblemDescription(message, description, ProjectStructureProblemDescription.Severity.WARNING, place, fixes)); + registerProblem(new ProjectStructureProblemDescription(message, description, place, fixes, problemType)); } public void registerProblem(final @NotNull ProjectStructureProblemDescription description) { @@ -33,16 +31,16 @@ public class ProjectStructureProblemsHolderImpl implements ProjectStructureProbl } @Nullable - public ProjectStructureProblemDescription.Severity getSeverity() { + public ProjectStructureProblemType.Severity getSeverity() { if (myProblemDescriptions == null || myProblemDescriptions.isEmpty()) { return null; } for (ProjectStructureProblemDescription description : myProblemDescriptions) { - if (description.getSeverity() == ProjectStructureProblemDescription.Severity.ERROR) { - return ProjectStructureProblemDescription.Severity.ERROR; + if (description.getSeverity() == ProjectStructureProblemType.Severity.ERROR) { + return ProjectStructureProblemType.Severity.ERROR; } } - return ProjectStructureProblemDescription.Severity.WARNING; + return ProjectStructureProblemType.Severity.WARNING; } public String composeTooltipMessage() { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsSettings.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsSettings.java new file mode 100644 index 000000000000..5a1b59e3a297 --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsSettings.java @@ -0,0 +1,32 @@ +/* + * Copyright 2000-2011 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.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public abstract class ProjectStructureProblemsSettings { + public static ProjectStructureProblemsSettings getInstance(@NotNull Project project) { + return ServiceManager.getService(project, ProjectStructureProblemsSettings.class); + } + + public abstract boolean isIgnored(@NotNull ProjectStructureProblemDescription description); + public abstract void setIgnored(@NotNull ProjectStructureProblemDescription description, boolean ignored); +} diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsSettingsImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsSettingsImpl.java new file mode 100644 index 000000000000..48f83f41499e --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/ProjectStructureProblemsSettingsImpl.java @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2011 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.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.util.containers.SortedList; +import com.intellij.util.xmlb.XmlSerializerUtil; +import com.intellij.util.xmlb.annotations.AbstractCollection; +import com.intellij.util.xmlb.annotations.Tag; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author nik + */ +@State( + name = "ProjectStructureProblems", + storages = {@Storage(file = "$WORKSPACE_FILE$")} +) +public class ProjectStructureProblemsSettingsImpl extends ProjectStructureProblemsSettings implements PersistentStateComponent { + @AbstractCollection(surroundWithTag = false, elementTag = "problem", elementValueAttribute = "id") + @Tag("ignored-problems") + public List myIgnoredProblems = new SortedList(String.CASE_INSENSITIVE_ORDER); + + @Override + public ProjectStructureProblemsSettingsImpl getState() { + return this; + } + + @Override + public void loadState(ProjectStructureProblemsSettingsImpl state) { + XmlSerializerUtil.copyBean(state, this); + } + + @Override + public boolean isIgnored(@NotNull ProjectStructureProblemDescription description) { + return myIgnoredProblems.contains(description.getId()); + } + + @Override + public void setIgnored(@NotNull ProjectStructureProblemDescription description, boolean ignored) { + final String id = description.getId(); + if (ignored) { + myIgnoredProblems.add(id); + } + else { + myIgnoredProblems.remove(id); + } + } +} diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/SdkProjectStructureElement.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/SdkProjectStructureElement.java index 6621b75042ad..79a4713459a5 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/SdkProjectStructureElement.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/SdkProjectStructureElement.java @@ -43,13 +43,18 @@ public class SdkProjectStructureElement extends ProjectStructureElement { return mySdk.hashCode(); } - @Override - public String toString() { - return "sdk:" + mySdk.getName(); - } - @Override public boolean highlightIfUnused() { return false; } + + @Override + public String getPresentableName() { + return "SDK '" + mySdk.getName() + "'"; + } + + @Override + public String getId() { + return "sdk:" + mySdk.getName(); + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/UsageInModuleClasspath.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/UsageInModuleClasspath.java index 5f384dd6a14d..f76544f9a96f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/UsageInModuleClasspath.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/daemon/UsageInModuleClasspath.java @@ -45,7 +45,7 @@ public class UsageInModuleClasspath extends ProjectStructureElementUsage { @Override public PlaceInProjectStructure getPlace() { - return new PlaceInModuleClasspath(myContext, myModule, mySourceElement); + return new PlaceInModuleClasspath(myContext, myModule, myContainingElement, mySourceElement); } @Override diff --git a/platform/platform-resources-en/src/messages/ProjectBundle.properties b/platform/platform-resources-en/src/messages/ProjectBundle.properties index d0a324fae94b..e49f1296655c 100644 --- a/platform/platform-resources-en/src/messages/ProjectBundle.properties +++ b/platform/platform-resources-en/src/messages/ProjectBundle.properties @@ -310,12 +310,14 @@ rename.module.title=Rename module project.roots.plain.mode.action.text.disabled=Hide Module Groups project.roots.plain.mode.action.text.enabled=Show Module Groups project.roots.tooltip.library.misconfigured=Library ''{0}'' has broken paths. +project.roots.error.message.invalid.classes.roots=invalid classes {0, choice, 1#root|2#roots} +project.roots.error.message.invalid.source.javadoc.roots=invalid source/javadoc {0, choice, 1#root|2#roots} project.roots.tooltip.unused=''{0}'' is unused. project.roots.javadoc.tab.description=Manage external JavaDocs attached to this module. External JavaDoc override JavaDoc annotations you might have in your module. project.roots.output.compiler.title=Compiler output project.roots.module.jdk.problem.message=Module SDK is not defined. -project.roots.module.duplicate.name.message=Duplicate module name -project.roots.library.problem.message=Classpath entry is invalid: {0} +project.roots.module.duplicate.name.message=duplicate module name +project.roots.library.problem.message=invalid item ''{0}'' in the dependencies list project.roots.project.display.name=Project sdk.configuration.exception=SDK ''{0}'' is invalid. project.roots.project.jdk.inherited=Project SDK diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 2dc1f3ed0345..44db51e1163e 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1115,6 +1115,8 @@ +