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