291e505d99aa9b595b9bd36764beea44335a3f4b
[idea/community.git] / java / compiler / impl / src / com / intellij / packaging / impl / elements / ArtifactElementType.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.packaging.impl.elements;
3
4 import com.intellij.icons.AllIcons;
5 import com.intellij.openapi.compiler.JavaCompilerBundle;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.packaging.artifacts.Artifact;
8 import com.intellij.packaging.artifacts.ArtifactManager;
9 import com.intellij.packaging.artifacts.ArtifactPointerManager;
10 import com.intellij.packaging.elements.ComplexPackagingElementType;
11 import com.intellij.packaging.elements.CompositePackagingElement;
12 import com.intellij.packaging.impl.artifacts.ArtifactUtil;
13 import com.intellij.packaging.ui.ArtifactEditorContext;
14 import com.intellij.util.containers.ContainerUtil;
15 import org.jetbrains.annotations.NotNull;
16
17 import javax.swing.*;
18 import java.util.ArrayList;
19 import java.util.Iterator;
20 import java.util.List;
21 import java.util.Set;
22
23 public class ArtifactElementType extends ComplexPackagingElementType<ArtifactPackagingElement> {
24   public static final ArtifactElementType ARTIFACT_ELEMENT_TYPE = new ArtifactElementType();
25
26   ArtifactElementType() {
27     super("artifact", JavaCompilerBundle.message("element.type.name.artifact"));
28   }
29
30   @Override
31   public Icon getCreateElementIcon() {
32     return AllIcons.Nodes.Artifact;
33   }
34
35   @Override
36   public boolean canCreate(@NotNull ArtifactEditorContext context, @NotNull Artifact artifact) {
37     return !getAvailableArtifacts(context, artifact, false).isEmpty();
38   }
39
40   @Override
41   @NotNull
42   public List<? extends ArtifactPackagingElement> chooseAndCreate(@NotNull ArtifactEditorContext context, @NotNull Artifact artifact,
43                                                                    @NotNull CompositePackagingElement<?> parent) {
44     final Project project = context.getProject();
45     List<Artifact> artifacts = context.chooseArtifacts(getAvailableArtifacts(context, artifact, false), JavaCompilerBundle
46       .message("dialog.title.choose.artifacts"));
47     final List<ArtifactPackagingElement> elements = new ArrayList<>();
48     for (Artifact selected : artifacts) {
49       elements.add(new ArtifactPackagingElement(project, ArtifactPointerManager.getInstance(project).createPointer(selected, context.getArtifactModel())));
50     }
51     return elements;
52   }
53
54   @NotNull
55   public static List<? extends Artifact> getAvailableArtifacts(@NotNull final ArtifactEditorContext context,
56                                                                @NotNull final Artifact artifact,
57                                                                final boolean notIncludedOnly) {
58     final Set<Artifact> result = ContainerUtil.set(context.getArtifactModel().getArtifacts());
59     if (notIncludedOnly) {
60       ArtifactUtil.processPackagingElements(artifact, ARTIFACT_ELEMENT_TYPE, artifactPackagingElement -> {
61         result.remove(artifactPackagingElement.findArtifact(context));
62         return true;
63       }, context, true);
64     }
65     result.remove(artifact);
66     final Iterator<Artifact> iterator = result.iterator();
67     while (iterator.hasNext()) {
68       Artifact another = iterator.next();
69       final boolean notContainThis =
70           ArtifactUtil.processPackagingElements(another, ARTIFACT_ELEMENT_TYPE,
71                                                 element -> !artifact.getName().equals(element.getArtifactName()), context, true);
72       if (!notContainThis) {
73         iterator.remove();
74       }
75     }
76     final ArrayList<Artifact> list = new ArrayList<>(result);
77     list.sort(ArtifactManager.ARTIFACT_COMPARATOR);
78     return list;
79   }
80
81   @Override
82   @NotNull
83   public ArtifactPackagingElement createEmpty(@NotNull Project project) {
84     return new ArtifactPackagingElement(project);
85   }
86
87   @Override
88   public String getShowContentActionText() {
89     return "Show Content of Included Artifacts";
90   }
91 }