void registerError(@NotNull String message, @Nullable ArtifactProblemQuickFix quickFix);
void registerError(@NotNull String message, @Nullable List<PackagingElement<?>> pathToPlace, ArtifactProblemQuickFix... quickFixes);
+
+ void registerWarning(@NotNull String message, @Nullable List<PackagingElement<?>> pathToPlace, ArtifactProblemQuickFix... quickFixes);
}
}
public void registerError(@NotNull String message, @Nullable List<PackagingElement<?>> pathToPlace, @Nullable ArtifactProblemQuickFix... quickFixes) {
- myProblemsHolder.registerProblem(new ArtifactProblemDescription(message, ProjectStructureProblemDescription.Severity.ERROR, pathToPlace, Arrays.asList(
- quickFixes)));
+ registerProblem(message, pathToPlace, ProjectStructureProblemDescription.Severity.ERROR, quickFixes);
+ }
+
+ private void registerProblem(@NotNull String message, @Nullable List<PackagingElement<?>> pathToPlace,
+ final ProjectStructureProblemDescription.Severity severity, @Nullable ArtifactProblemQuickFix... quickFixes) {
+ myProblemsHolder.registerProblem(new ArtifactProblemDescription(message, severity, pathToPlace, Arrays.asList(quickFixes)));
+ }
+
+ public void registerWarning(@NotNull String message,
+ @Nullable List<PackagingElement<?>> pathToPlace,
+ ArtifactProblemQuickFix... quickFixes) {
+ registerProblem(message, pathToPlace, ProjectStructureProblemDescription.Severity.WARNING, quickFixes);
}
}
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.*;
public class ArtifactValidationManagerImpl implements Disposable {
private ArtifactErrorPanel myErrorPanel;
private final ArtifactEditorImpl myArtifactEditor;
- private MultiValuesMap<PackagingElementNode<?>, String> myErrorsForNodes = new MultiValuesMap<PackagingElementNode<?>, String>(true);
- private List<Pair<String, List<PackagingElement<?>>>> myProblems = new ArrayList<Pair<String, List<PackagingElement<?>>>>();
+ private MultiValuesMap<PackagingElementNode<?>, ArtifactProblemDescription> myProblemsForNodes = new MultiValuesMap<PackagingElementNode<?>, ArtifactProblemDescription>(true);
+ private List<ArtifactProblemDescription> myProblems = new ArrayList<ArtifactProblemDescription>();
ArtifactValidationManagerImpl(ArtifactEditorImpl artifactEditor) {
Disposer.register(artifactEditor, this);
}
public void onNodesAdded() {
- for (Pair<String, List<PackagingElement<?>>> problem : myProblems) {
- registerProblem(problem.getFirst(), problem.getSecond());
+ for (ArtifactProblemDescription problem : myProblems) {
+ showProblemInTree(problem);
}
}
- private void registerProblem(@NotNull PackagingElementNode<?> node, @NotNull String message) {
- myErrorsForNodes.put(node, message);
- }
-
@Nullable
- public Collection<String> getProblems(PackagingElementNode<?> node) {
- return myErrorsForNodes.get(node);
+ public Collection<ArtifactProblemDescription> getProblems(PackagingElementNode<?> node) {
+ return myProblemsForNodes.get(node);
}
public void updateProblems(@Nullable ProjectStructureProblemsHolderImpl holder) {
myErrorPanel.clearError();
- myErrorsForNodes.clear();
+ myProblemsForNodes.clear();
myProblems.clear();
if (holder != null) {
final List<ProjectStructureProblemDescription> problemDescriptions = holder.getProblemDescriptions();
final String message = description.getMessage();
List<ArtifactProblemQuickFix> quickFix = Collections.emptyList();
if (description instanceof ArtifactProblemDescription) {
- quickFix = ((ArtifactProblemDescription)description).getQuickFixes();
- final List<PackagingElement<?>> pathToPlace = ((ArtifactProblemDescription)description).getPathToPlace();
- if (pathToPlace != null) {
- myProblems.add(Pair.create(message, pathToPlace));
- registerProblem(message, pathToPlace);
+ final ArtifactProblemDescription artifactProblem = (ArtifactProblemDescription)description;
+ quickFix = artifactProblem.getQuickFixes();
+ if (artifactProblem.getPathToPlace() != null) {
+ myProblems.add(artifactProblem);
+ showProblemInTree(artifactProblem);
}
}
myErrorPanel.showError(message, quickFix);
myArtifactEditor.getLayoutTreeComponent().updateTreeNodesPresentation();
}
- private void registerProblem(String message, List<PackagingElement<?>> pathToPlace) {
+ private void showProblemInTree(ArtifactProblemDescription problem) {
final LayoutTree layoutTree = myArtifactEditor.getLayoutTreeComponent().getLayoutTree();
PackagingElementNode<?> node = layoutTree.getRootPackagingNode();
- if (node != null) {
+ final List<PackagingElement<?>> pathToPlace = problem.getPathToPlace();
+ if (node != null && pathToPlace != null) {
List<PackagingElementNode<?>> nodes = node.getNodesByPath(pathToPlace.subList(1, pathToPlace.size()));
for (PackagingElementNode<?> elementNode : nodes) {
- registerProblem(elementNode, message);
+ myProblemsForNodes.put(elementNode, problem);
}
}
}
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.util.MultiValuesMap;
-import com.intellij.openapi.util.text.StringUtil;
import com.intellij.packaging.elements.CompositePackagingElement;
import com.intellij.packaging.elements.PackagingElement;
import com.intellij.packaging.ui.ArtifactEditorContext;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.ui.treeStructure.SimpleNode;
import com.intellij.util.SmartList;
+import com.intellij.util.StringBuilderSpinAllocator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@Override
protected void update(PresentationData presentation) {
- final Collection<String> problems = ((ArtifactEditorImpl)myContext.getThisArtifactEditor()).getValidationManager().getProblems(this);
+ final Collection<ArtifactProblemDescription> problems = ((ArtifactEditorImpl)myContext.getThisArtifactEditor()).getValidationManager().getProblems(this);
if (problems == null || problems.isEmpty()) {
super.update(presentation);
return;
}
- final String message = StringUtil.join(problems, "\n");
+ StringBuilder buffer = StringBuilderSpinAllocator.alloc();
+ final String tooltip;
+ boolean isError = false;
+ try {
+ buffer.append("<html>");
+ for (ArtifactProblemDescription problem : problems) {
+ isError |= problem.getSeverity() == ProjectStructureProblemDescription.Severity.ERROR;
+ buffer.append(problem.getMessage()).append("<br>");
+ }
+ buffer.append("</html>");
+ tooltip = buffer.toString();
+ }
+ finally {
+ StringBuilderSpinAllocator.dispose(buffer);
+ }
- getElementPresentation().render(presentation, addErrorHighlighting(SimpleTextAttributes.REGULAR_ATTRIBUTES),
- addErrorHighlighting(SimpleTextAttributes.GRAY_ATTRIBUTES));
- presentation.setTooltip(message);
+ getElementPresentation().render(presentation, addErrorHighlighting(isError, SimpleTextAttributes.REGULAR_ATTRIBUTES),
+ addErrorHighlighting(isError, SimpleTextAttributes.GRAY_ATTRIBUTES));
+ presentation.setTooltip(tooltip);
}
- private static SimpleTextAttributes addErrorHighlighting(SimpleTextAttributes attributes) {
+ private static SimpleTextAttributes addErrorHighlighting(boolean error, SimpleTextAttributes attributes) {
final TextAttributes textAttributes = attributes.toTextAttributes();
textAttributes.setEffectType(EffectType.WAVE_UNDERSCORE);
- textAttributes.setEffectColor(Color.RED);
+ textAttributes.setEffectColor(error ? Color.RED : Color.GRAY);
return SimpleTextAttributes.fromTextAttributes(textAttributes);
}