1ef86a638327af615e700f2d932e6235f6ca3eac
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / artifacts / ArtifactPropertiesEditors.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.openapi.roots.ui.configuration.artifacts;
3
4 import com.intellij.openapi.ui.VerticalFlowLayout;
5 import com.intellij.packaging.artifacts.Artifact;
6 import com.intellij.packaging.artifacts.ArtifactProperties;
7 import com.intellij.packaging.artifacts.ArtifactPropertiesProvider;
8 import com.intellij.packaging.artifacts.ModifiableArtifact;
9 import com.intellij.packaging.impl.artifacts.ArtifactUtil;
10 import com.intellij.packaging.ui.ArtifactEditorContext;
11 import com.intellij.packaging.ui.ArtifactPropertiesEditor;
12 import com.intellij.ui.TabbedPaneWrapper;
13 import com.intellij.ui.components.JBScrollPane;
14 import org.jetbrains.annotations.NotNull;
15 import org.jetbrains.annotations.Nullable;
16
17 import javax.swing.*;
18 import java.util.*;
19
20 public class ArtifactPropertiesEditors {
21   private static final List<String> STANDARD_TABS_ORDER = Arrays.asList(
22     ArtifactPropertiesEditor.VALIDATION_TAB, ArtifactPropertiesEditor.PRE_PROCESSING_TAB, ArtifactPropertiesEditor.POST_PROCESSING_TAB
23   );
24   private final Map<String, JPanel> myMainPanels;
25   private final ArtifactEditorContext myContext;
26   private final Artifact myOriginalArtifact;
27   private final List<PropertiesEditorInfo> myEditors;
28
29   public ArtifactPropertiesEditors(ArtifactEditorContext context, Artifact originalArtifact, Artifact artifact) {
30     myContext = context;
31     myOriginalArtifact = originalArtifact;
32     myMainPanels = new HashMap<>();
33     myEditors = new ArrayList<>();
34     for (ArtifactPropertiesProvider provider : artifact.getPropertiesProviders()) {
35       final PropertiesEditorInfo editorInfo = new PropertiesEditorInfo(provider);
36       myEditors.add(editorInfo);
37       final String tabName = editorInfo.myEditor.getTabName();
38       JPanel panel = myMainPanels.get(tabName);
39       if (panel == null) {
40         panel = new JPanel(new VerticalFlowLayout());
41         myMainPanels.put(tabName, panel);
42       }
43       panel.add(editorInfo.myEditor.createComponent());
44     }
45   }
46
47   public void applyProperties() {
48     for (PropertiesEditorInfo editor : myEditors) {
49       if (editor.isModified()) {
50         editor.applyProperties();
51       }
52     }
53   }
54
55   public void addTabs(TabbedPaneWrapper tabbedPane) {
56     List<String> sortedTabs = new ArrayList<>(myMainPanels.keySet());
57     sortedTabs.sort((o1, o2) -> {
58       int i1 = STANDARD_TABS_ORDER.indexOf(o1);
59       if (i1 == -1) i1 = STANDARD_TABS_ORDER.size();
60       int i2 = STANDARD_TABS_ORDER.indexOf(o2);
61       if (i2 == -1) i2 = STANDARD_TABS_ORDER.size();
62       if (i1 != i2) {
63         return i1 - i2;
64       }
65       return o1.compareTo(o2);
66     });
67     for (String tab : sortedTabs) {
68       tabbedPane.addTab(tab, new JBScrollPane(myMainPanels.get(tab)));
69     }
70   }
71
72   public boolean isModified() {
73     for (PropertiesEditorInfo editor : myEditors) {
74       if (editor.isModified()) {
75         return true;
76       }
77     }
78     return false;
79   }
80
81   public void removeTabs(TabbedPaneWrapper tabbedPane) {
82     for (String tabName : myMainPanels.keySet()) {
83       for (int i = 0; i < tabbedPane.getTabCount(); i++) {
84         if (tabName.equals(tabbedPane.getTitleAt(i))) {
85           tabbedPane.removeTabAt(i);
86           break;
87         }
88       }
89     }
90   }
91
92   @Nullable
93   public String getHelpId(String title) {
94     if (ArtifactPropertiesEditor.VALIDATION_TAB.equals(title)) {
95       return "reference.project.structure.artifacts.validation";
96     }
97     else if (ArtifactPropertiesEditor.PRE_PROCESSING_TAB.equals(title)) {
98       return "reference.project.structure.artifacts.preprocessing";
99     }
100     else if (ArtifactPropertiesEditor.POST_PROCESSING_TAB.equals(title)) {
101       return "reference.project.structure.artifacts.postprocessing";
102     }
103     for (PropertiesEditorInfo editorInfo : myEditors) {
104       final ArtifactPropertiesEditor editor = editorInfo.myEditor;
105       if (editor.getTabName().equals(title)) {
106         return editor.getHelpId();
107       }
108     }
109     return null;
110   }
111
112   private final class PropertiesEditorInfo {
113     private final ArtifactPropertiesEditor myEditor;
114     private final ArtifactProperties<?> myProperties;
115     private final ArtifactPropertiesProvider myProvider;
116
117     private PropertiesEditorInfo(@NotNull ArtifactPropertiesProvider provider) {
118       myProvider = provider;
119       myProperties = provider.createProperties(myOriginalArtifact.getArtifactType());
120       final ArtifactProperties<?> originalProperties = myOriginalArtifact.getProperties(provider);
121       if (originalProperties != null) {
122         ArtifactUtil.copyProperties(originalProperties, myProperties);
123       }
124       myEditor = myProperties.createEditor(myContext);
125       myEditor.reset();
126     }
127
128     public void applyProperties() {
129       myEditor.apply();
130       final ModifiableArtifact artifact = myContext.getOrCreateModifiableArtifactModel().getOrCreateModifiableArtifact(myOriginalArtifact);
131       artifact.setProperties(myProvider, myProperties);
132     }
133
134     public boolean isModified() {
135       return myEditor.isModified();
136     }
137   }
138 }