From 4699fd4f8a7211db024886031e0afbb53fee90e1 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 17 Nov 2009 15:32:41 +0300 Subject: [PATCH] artifact editor: highlighting nodes with errors fixed --- .../packaging/ui/ArtifactProblemsHolder.java | 4 +- .../artifacts/ArtifactProblemDescription.java | 13 ++-- .../artifacts/ArtifactProblemsHolderImpl.java | 6 +- .../ArtifactValidationManagerImpl.java | 62 ++++++++++--------- .../nodes/CompositePackagingElementNode.java | 5 ++ .../artifacts/nodes/PackagingElementNode.java | 31 +++++++++- .../ui/treeStructure/CachingSimpleNode.java | 8 ++- 7 files changed, 87 insertions(+), 42 deletions(-) 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 74349d627491..d0e6e2153d3f 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactProblemsHolder.java +++ b/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactProblemsHolder.java @@ -19,6 +19,8 @@ import com.intellij.packaging.elements.PackagingElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author nik */ @@ -30,5 +32,5 @@ public interface ArtifactProblemsHolder { void registerError(@NotNull String message, @Nullable ArtifactProblemQuickFix quickFix); - void registerError(@NotNull String message, @Nullable PackagingElement place, @Nullable ArtifactProblemQuickFix quickFix); + void registerError(@NotNull String message, @Nullable List> pathToPlace, @Nullable ArtifactProblemQuickFix quickFix); } 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 43ac8ce424d9..2ccf2ee29ab5 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,12 +21,14 @@ import com.intellij.packaging.ui.ArtifactProblemQuickFix; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author nik */ public class ArtifactProblemDescription extends ProjectStructureProblemDescription { private ArtifactProblemQuickFix myQuickFix; - private PackagingElement myPlace; + private List> myPathToPlace; public ArtifactProblemDescription(@NotNull String message, @NotNull Severity severity) { super(message, severity); @@ -39,10 +41,10 @@ public class ArtifactProblemDescription extends ProjectStructureProblemDescripti public ArtifactProblemDescription(@NotNull String message, @NotNull Severity severity, - @Nullable PackagingElement place, + @Nullable List> pathToPlace, @Nullable ArtifactProblemQuickFix quickFix) { super(message, severity); - myPlace = place; + myPathToPlace = pathToPlace; myQuickFix = quickFix; } @@ -51,7 +53,8 @@ public class ArtifactProblemDescription extends ProjectStructureProblemDescripti return myQuickFix; } - public PackagingElement getPlace() { - return myPlace; + @Nullable + public List> getPathToPlace() { + return myPathToPlace; } } 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 c7d8de0c0ad1..809b5ee4961f 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,8 @@ import com.intellij.packaging.ui.ArtifactProblemQuickFix; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author nik */ @@ -35,7 +37,7 @@ public class ArtifactProblemsHolderImpl extends ArtifactProblemsHolderBase { myProblemsHolder = problemsHolder; } - public void registerError(@NotNull String message, @Nullable PackagingElement place, @Nullable ArtifactProblemQuickFix quickFix) { - myProblemsHolder.registerProblem(new ArtifactProblemDescription(message, ProjectStructureProblemDescription.Severity.ERROR, place, quickFix)); + public void registerError(@NotNull String message, @Nullable List> pathToPlace, @Nullable ArtifactProblemQuickFix quickFix) { + myProblemsHolder.registerProblem(new ArtifactProblemDescription(message, ProjectStructureProblemDescription.Severity.ERROR, pathToPlace, quickFix)); } } 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 54c745bfdfcc..5a43230b94e0 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 @@ -16,20 +16,21 @@ package com.intellij.openapi.roots.ui.configuration.artifacts; import com.intellij.openapi.Disposable; -import com.intellij.openapi.roots.ui.configuration.artifacts.nodes.CompositePackagingElementNode; import com.intellij.openapi.roots.ui.configuration.artifacts.nodes.PackagingElementNode; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemDescription; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureProblemsHolderImpl; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.MultiValuesMap; +import com.intellij.openapi.util.Pair; import com.intellij.packaging.elements.PackagingElement; import com.intellij.packaging.ui.ArtifactProblemQuickFix; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.Collections; -import java.util.HashMap; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; -import java.util.Map; /** * @author nik @@ -37,8 +38,8 @@ import java.util.Map; public class ArtifactValidationManagerImpl implements Disposable { private ArtifactErrorPanel myErrorPanel; private final ArtifactEditorImpl myArtifactEditor; - private Map, String> myErrorsForNodes = new HashMap, String>(); - private Map, String> myErrorsForElements = new HashMap, String>(); + private MultiValuesMap, String> myErrorsForNodes = new MultiValuesMap, String>(true); + private List>>> myProblems = new ArrayList>>>(); ArtifactValidationManagerImpl(ArtifactEditorImpl artifactEditor) { Disposer.register(artifactEditor, this); @@ -46,16 +47,6 @@ public class ArtifactValidationManagerImpl implements Disposable { myErrorPanel = new ArtifactErrorPanel(artifactEditor); } - private void addNodeToErrorsWithParents(PackagingElementNode node, String message) { - if (!myErrorsForNodes.containsKey(node)) { - myErrorsForNodes.put(node, message); - final CompositePackagingElementNode parentNode = node.getParentNode(); - if (parentNode != null) { - addNodeToErrorsWithParents(parentNode, message); - } - } - } - public void dispose() { } @@ -63,22 +54,25 @@ public class ArtifactValidationManagerImpl implements Disposable { return myErrorPanel.getMainPanel(); } - public void elementAddedToNode(PackagingElementNode node, PackagingElement element) { - final String message = myErrorsForElements.get(element); - if (message != null) { - addNodeToErrorsWithParents(node, message); + public void onNodesAdded() { + for (Pair>> problem : myProblems) { + registerProblem(problem.getFirst(), problem.getSecond()); } } + private void registerProblem(@NotNull PackagingElementNode node, @NotNull String message) { + myErrorsForNodes.put(node, message); + } + @Nullable - public String getProblem(PackagingElementNode node) { + public Collection getProblems(PackagingElementNode node) { return myErrorsForNodes.get(node); } public void updateProblems(@Nullable ProjectStructureProblemsHolderImpl holder) { myErrorPanel.clearError(); myErrorsForNodes.clear(); - myErrorsForElements.clear(); + myProblems.clear(); if (holder != null) { final List problemDescriptions = holder.getProblemDescriptions(); if (problemDescriptions != null) { @@ -87,14 +81,10 @@ public class ArtifactValidationManagerImpl implements Disposable { ArtifactProblemQuickFix quickFix = null; if (description instanceof ArtifactProblemDescription) { quickFix = ((ArtifactProblemDescription)description).getQuickFix(); - final PackagingElement place = ((ArtifactProblemDescription)description).getPlace(); - if (place != null) { - final LayoutTree layoutTree = myArtifactEditor.getLayoutTreeComponent().getLayoutTree(); - myErrorsForElements.put(place, message); - final List> nodes = layoutTree.findNodes(Collections.singletonList(place)); - for (PackagingElementNode node : nodes) { - addNodeToErrorsWithParents(node, message); - } + final List> pathToPlace = ((ArtifactProblemDescription)description).getPathToPlace(); + if (pathToPlace != null) { + myProblems.add(Pair.create(message, pathToPlace)); + registerProblem(message, pathToPlace); } } myErrorPanel.showError(message, quickFix); @@ -103,4 +93,16 @@ public class ArtifactValidationManagerImpl implements Disposable { } myArtifactEditor.getLayoutTreeComponent().updateTreeNodesPresentation(); } + + private void registerProblem(String message, List> pathToPlace) { + final LayoutTree layoutTree = myArtifactEditor.getLayoutTreeComponent().getLayoutTree(); + PackagingElementNode node = layoutTree.getRootPackagingNode(); + int i = 0; + while (node != null) { + registerProblem(node, message); + i++; + if (i >= pathToPlace.size()) break; + node = node.findChildByElement(pathToPlace.get(i)); + } + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/CompositePackagingElementNode.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/CompositePackagingElementNode.java index 114092a470d8..428639cbe9f7 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/CompositePackagingElementNode.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/CompositePackagingElementNode.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.roots.ui.configuration.artifacts.nodes; +import com.intellij.openapi.roots.ui.configuration.artifacts.ArtifactEditorImpl; import com.intellij.openapi.roots.ui.configuration.artifacts.ComplexElementSubstitutionParameters; import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.elements.CompositePackagingElement; @@ -51,4 +52,8 @@ public class CompositePackagingElementNode extends PackagingElementNode> extends Artifac private void doAddElement(E packagingElement) { myPackagingElements.add(packagingElement); - ((ArtifactEditorImpl)myContext.getThisArtifactEditor()).getValidationManager().elementAddedToNode(this, packagingElement); } @Nullable @@ -93,11 +93,12 @@ public class PackagingElementNode> extends Artifac @Override protected void update(PresentationData presentation) { - final String message = ((ArtifactEditorImpl)myContext.getThisArtifactEditor()).getValidationManager().getProblem(this); - if (message == null) { + final Collection problems = ((ArtifactEditorImpl)myContext.getThisArtifactEditor()).getValidationManager().getProblems(this); + if (problems == null || problems.isEmpty()) { super.update(presentation); return; } + final String message = StringUtil.join(problems, "\n"); getElementPresentation().render(presentation, addErrorHighlighting(SimpleTextAttributes.REGULAR_ATTRIBUTES), addErrorHighlighting(SimpleTextAttributes.GRAY_ATTRIBUTES)); @@ -145,4 +146,28 @@ public class PackagingElementNode> extends Artifac } return null; } + + @Nullable + public PackagingElementNode findChildByElement(@NotNull PackagingElement element) { + final SimpleNode[] children = getCached(); + if (children != null) { + for (SimpleNode child : children) { + if (child instanceof PackagingElementNode) { + PackagingElementNode elementNode = (PackagingElementNode)child; + for (PackagingElement childElement : elementNode.getPackagingElements()) { + if (childElement.isEqualTo(element)) { + return elementNode; + } + } + for (PackagingNodeSource nodeSource : elementNode.getNodeSources()) { + if (nodeSource.getSourceElement().isEqualTo(element)) { + return elementNode; + } + } + } + } + } + + return null; + } } diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/CachingSimpleNode.java b/platform/platform-api/src/com/intellij/ui/treeStructure/CachingSimpleNode.java index fd51e6a145f6..9dac9f17f901 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/CachingSimpleNode.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/CachingSimpleNode.java @@ -17,6 +17,7 @@ package com.intellij.ui.treeStructure; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.Nullable; public abstract class CachingSimpleNode extends SimpleNode { @@ -36,18 +37,23 @@ public abstract class CachingSimpleNode extends SimpleNode { public final SimpleNode[] getChildren() { if (myChildren == null) { myChildren = buildChildren(); + onChildrenBuilt(); } return myChildren; } + protected void onChildrenBuilt() { + } + protected abstract SimpleNode[] buildChildren(); public void cleanUpCache() { myChildren = null; } - SimpleNode[] getCached() { + @Nullable + protected SimpleNode[] getCached() { return myChildren; }