'RIDER-47575 Design for Plist Editor -- icon for the button to toggle localized/raw...
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / artifacts / ArtifactProjectStructureElement.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.roots.ui.configuration.artifacts;
17
18 import com.intellij.facet.Facet;
19 import com.intellij.ide.JavaUiBundle;
20 import com.intellij.openapi.module.Module;
21 import com.intellij.openapi.roots.ProjectModelExternalSource;
22 import com.intellij.openapi.roots.libraries.Library;
23 import com.intellij.openapi.roots.ui.configuration.ModificationOfImportedModelWarningComponent;
24 import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
25 import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.*;
26 import com.intellij.packaging.artifacts.Artifact;
27 import com.intellij.packaging.artifacts.ModifiableArtifactModel;
28 import com.intellij.packaging.elements.CompositePackagingElement;
29 import com.intellij.packaging.elements.PackagingElement;
30 import com.intellij.packaging.impl.artifacts.ArtifactUtil;
31 import com.intellij.packaging.impl.artifacts.PackagingElementPath;
32 import com.intellij.packaging.impl.artifacts.PackagingElementProcessor;
33 import com.intellij.packaging.impl.elements.ArtifactPackagingElement;
34 import com.intellij.packaging.impl.elements.FacetBasedPackagingElement;
35 import com.intellij.packaging.impl.elements.LibraryPackagingElement;
36 import com.intellij.packaging.impl.elements.ModulePackagingElement;
37 import org.jetbrains.annotations.Nls;
38 import org.jetbrains.annotations.NotNull;
39 import org.jetbrains.annotations.Nullable;
40
41 import java.util.ArrayList;
42 import java.util.List;
43
44 public class ArtifactProjectStructureElement extends ProjectStructureElement {
45   private final ArtifactsStructureConfigurableContext myArtifactsStructureContext;
46   private final Artifact myOriginalArtifact;
47
48   ArtifactProjectStructureElement(StructureConfigurableContext context,
49                                   ArtifactsStructureConfigurableContext artifactsStructureContext, Artifact artifact) {
50     super(context);
51     myArtifactsStructureContext = artifactsStructureContext;
52     myOriginalArtifact = artifactsStructureContext.getOriginalArtifact(artifact);
53   }
54
55   @Override
56   public void check(final ProjectStructureProblemsHolder problemsHolder) {
57     final Artifact artifact = myArtifactsStructureContext.getArtifactModel().getArtifactByOriginal(myOriginalArtifact);
58     final ArtifactProblemsHolderImpl artifactProblemsHolder = new ArtifactProblemsHolderImpl(myArtifactsStructureContext, myOriginalArtifact, problemsHolder);
59     if (myArtifactsStructureContext instanceof ArtifactsStructureConfigurableContextImpl) {
60       ArtifactEditorImpl artifactEditor = ((ArtifactsStructureConfigurableContextImpl)myArtifactsStructureContext).getArtifactEditor(artifact);
61       if (artifactEditor != null && (artifactEditor.isModified() || isArtifactModified(artifact))) {
62         ProjectModelExternalSource externalSource = artifact.getExternalSource();
63         if (externalSource != null) {
64           String message = ModificationOfImportedModelWarningComponent.getWarningText(
65             JavaUiBundle.message("banner.slogan.artifact.0", artifact.getName()), externalSource);
66           artifactProblemsHolder.registerWarning(message, "modification-of-imported-element", null);
67         }
68       }
69     }
70     artifact.getArtifactType().checkRootElement(myArtifactsStructureContext.getRootElement(myOriginalArtifact), artifact, artifactProblemsHolder);
71   }
72
73   private boolean isArtifactModified(Artifact artifact) {
74     ModifiableArtifactModel modifiableModel = ((ArtifactsStructureConfigurableContextImpl)myArtifactsStructureContext).getActualModifiableModel();
75     return modifiableModel != null && artifact != modifiableModel.getOriginalArtifact(artifact);
76   }
77
78   public Artifact getOriginalArtifact() {
79     return myOriginalArtifact;
80   }
81
82   @Override
83   public List<ProjectStructureElementUsage> getUsagesInElement() {
84     final Artifact artifact = myArtifactsStructureContext.getArtifactModel().getArtifactByOriginal(myOriginalArtifact);
85     final List<ProjectStructureElementUsage> usages = new ArrayList<>();
86     final CompositePackagingElement<?> rootElement = myArtifactsStructureContext.getRootElement(artifact);
87     ArtifactUtil.processPackagingElements(rootElement, null, new PackagingElementProcessor<PackagingElement<?>>() {
88       @Override
89       public boolean process(@NotNull PackagingElement<?> packagingElement, @NotNull PackagingElementPath path) {
90         ProjectStructureElement element = getProjectStructureElementFor(packagingElement, ArtifactProjectStructureElement.this.myContext,
91                                                                         ArtifactProjectStructureElement.this.myArtifactsStructureContext);
92         if (element != null) {
93           usages.add(createUsage(packagingElement, element, path.getPathStringFrom("/", rootElement)));
94         }
95         return true;
96       }
97     }, myArtifactsStructureContext, false, artifact.getArtifactType());
98     return usages;
99   }
100
101   @Nullable
102   public static ProjectStructureElement getProjectStructureElementFor(PackagingElement<?> packagingElement,
103                                                                        final StructureConfigurableContext context,
104                                                                        final ArtifactsStructureConfigurableContext artifactsStructureContext) {
105     if (packagingElement instanceof ModulePackagingElement) {
106       final Module module = ((ModulePackagingElement)packagingElement).findModule(artifactsStructureContext);
107       if (module != null) {
108         return new ModuleProjectStructureElement(context, module);
109       }
110     }
111     else if (packagingElement instanceof LibraryPackagingElement) {
112       final Library library = ((LibraryPackagingElement)packagingElement).findLibrary(artifactsStructureContext);
113       if (library != null) {
114         return new LibraryProjectStructureElement(context, library);
115       }
116     }
117     else if (packagingElement instanceof ArtifactPackagingElement) {
118       final Artifact usedArtifact = ((ArtifactPackagingElement)packagingElement).findArtifact(artifactsStructureContext);
119       if (usedArtifact != null) {
120         return artifactsStructureContext.getOrCreateArtifactElement(usedArtifact);
121       }
122     }
123     else if (packagingElement instanceof FacetBasedPackagingElement) {
124       Facet facet = ((FacetBasedPackagingElement)packagingElement).findFacet(artifactsStructureContext);
125       if (facet != null) {
126         return new FacetProjectStructureElement(context, facet);
127       }
128     }
129     return null;
130   }
131
132   private UsageInArtifact createUsage(PackagingElement<?> packagingElement, final ProjectStructureElement element, final String parentPath) {
133     return new UsageInArtifact(myOriginalArtifact, myArtifactsStructureContext, element, this, parentPath, packagingElement);
134   }
135
136   @Override
137   public boolean equals(Object o) {
138     if (this == o) return true;
139     if (!(o instanceof ArtifactProjectStructureElement)) return false;
140
141     return myOriginalArtifact.equals(((ArtifactProjectStructureElement)o).myOriginalArtifact);
142
143   }
144
145   @Override
146   public int hashCode() {
147     return myOriginalArtifact.hashCode();
148   }
149
150   @Override
151   public @Nls(capitalization = Nls.Capitalization.Sentence) String getPresentableName() {
152     return getActualArtifactName();
153   }
154
155   @Override
156   public @Nls(capitalization = Nls.Capitalization.Sentence) String getTypeName() {
157     return JavaUiBundle.message("configurable.artifact.prefix");
158   }
159
160   @Override
161   public String getId() {
162     return "artifact:" + getActualArtifactName();
163   }
164
165   private @Nls(capitalization = Nls.Capitalization.Sentence) String getActualArtifactName() {
166     return myArtifactsStructureContext.getArtifactModel().getArtifactByOriginal(myOriginalArtifact).getName();
167   }
168 }