IDEADEV-40607: Artifact editing actions should be dumb​-​aware
[fedora-idea.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / artifacts / ArtifactsStructureConfigurable.java
blob28f3f3e03eb9a49b9cb4d92b2098bed3d7847d9e
1 package com.intellij.openapi.roots.ui.configuration.artifacts;
3 import com.intellij.openapi.actionSystem.AnAction;
4 import com.intellij.openapi.actionSystem.AnActionEvent;
5 import com.intellij.openapi.application.Result;
6 import com.intellij.openapi.application.WriteAction;
7 import com.intellij.openapi.components.State;
8 import com.intellij.openapi.components.Storage;
9 import com.intellij.openapi.options.ConfigurationException;
10 import com.intellij.openapi.project.DumbAwareAction;
11 import com.intellij.openapi.project.Project;
12 import com.intellij.openapi.project.ProjectBundle;
13 import com.intellij.openapi.roots.ui.configuration.projectRoot.BaseStructureConfigurable;
14 import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
15 import com.intellij.packaging.artifacts.*;
16 import org.jetbrains.annotations.Nls;
17 import org.jetbrains.annotations.NonNls;
18 import org.jetbrains.annotations.NotNull;
19 import org.jetbrains.annotations.Nullable;
21 import javax.swing.*;
23 /**
24 * @author nik
26 @State(
27 name = "ArtifactsStructureConfigurable.UI",
28 storages = {@Storage(id = "other", file = "$WORKSPACE_FILE$")}
30 public class ArtifactsStructureConfigurable extends BaseStructureConfigurable {
31 private ArtifactsStructureConfigurableContextImpl myPackagingEditorContext;
32 @NonNls private static final String DEFAULT_ARTIFACT_NAME = "unnamed";
34 public ArtifactsStructureConfigurable(@NotNull Project project) {
35 super(project);
38 @Override
39 public void init(StructureConfigurableContext context) {
40 super.init(context);
41 myPackagingEditorContext = new ArtifactsStructureConfigurableContextImpl(myContext, myProject, new ArtifactAdapter() {
42 @Override
43 public void artifactAdded(@NotNull Artifact artifact) {
44 final MyNode node = addArtifactNode(artifact);
45 selectNodeInTree(node);
47 });
50 @Nls
51 public String getDisplayName() {
52 return ProjectBundle.message("display.name.artifacts");
55 protected void loadTree() {
56 myTree.setRootVisible(false);
57 myTree.setShowsRootHandles(false);
58 for (Artifact artifact : myPackagingEditorContext.getArtifactModel().getArtifacts()) {
59 addArtifactNode(artifact);
63 private MyNode addArtifactNode(final Artifact artifact) {
64 final MyNode node = new MyNode(new ArtifactConfigurable(artifact, myPackagingEditorContext, TREE_UPDATER));
65 addNode(node, myRoot);
66 return node;
69 @Override
70 public void reset() {
71 myPackagingEditorContext.resetModifiableModel();
72 super.reset();
75 @Override
76 public boolean isModified() {
77 final ModifiableArtifactModel modifiableModel = myPackagingEditorContext.getActualModifiableModel();
78 if (modifiableModel != null && modifiableModel.isModified()) {
79 return true;
81 return myPackagingEditorContext.getManifestFilesInfo().isManifestFilesModified() || super.isModified();
84 public ArtifactsStructureConfigurableContext getArtifactsStructureContext() {
85 return myPackagingEditorContext;
88 public ModifiableArtifactModel getModifiableArtifactModel() {
89 return myPackagingEditorContext.getModifiableArtifactModel();
92 protected AbstractAddGroup createAddAction() {
93 return new AbstractAddGroup(ProjectBundle.message("add.new.header.text")) {
94 @NotNull
95 @Override
96 public AnAction[] getChildren(@Nullable AnActionEvent e) {
97 final ArtifactType[] types = ArtifactType.getAllTypes();
98 final AnAction[] actions = new AnAction[types.length];
99 for (int i = 0; i < types.length; i++) {
100 actions[i] = new AddArtifactAction(types[i]);
102 return actions;
107 private void addArtifact(@NotNull ArtifactType type) {
108 String name = DEFAULT_ARTIFACT_NAME;
109 int i = 2;
110 while (myPackagingEditorContext.getArtifactModel().findArtifact(name) != null) {
111 name = DEFAULT_ARTIFACT_NAME + i;
112 i++;
114 final ModifiableArtifact artifact = myPackagingEditorContext.getModifiableArtifactModel().addArtifact(name, type);
115 selectNodeInTree(findNodeByObject(myRoot, artifact));
118 @Override
119 public void apply() throws ConfigurationException {
120 super.apply();
121 myPackagingEditorContext.getManifestFilesInfo().saveManifestFiles();
122 final ModifiableArtifactModel modifiableModel = myPackagingEditorContext.getActualModifiableModel();
123 if (modifiableModel != null) {
124 new WriteAction() {
125 protected void run(final Result result) {
126 modifiableModel.commit();
128 }.execute();
129 myPackagingEditorContext.resetModifiableModel();
133 @Override
134 public void disposeUIResources() {
135 super.disposeUIResources();
136 myPackagingEditorContext.disposeUIResources();
139 @Override
140 protected void removeArtifact(Artifact artifact) {
141 myPackagingEditorContext.getModifiableArtifactModel().removeArtifact(artifact);
144 protected void processRemovedItems() {
147 protected boolean wasObjectStored(Object editableObject) {
148 return false;
151 public String getId() {
152 return "project.artifacts";
155 public Runnable enableSearch(String option) {
156 return null;
159 public void dispose() {
162 public Icon getIcon() {
163 return null;
167 private class AddArtifactAction extends DumbAwareAction {
168 private final ArtifactType myType;
170 public AddArtifactAction(ArtifactType type) {
171 super(ProjectBundle.message("action.text.add.artifact", type.getPresentableName()), null, type.getIcon());
172 myType = type;
175 @Override
176 public void actionPerformed(AnActionEvent e) {
177 addArtifact(myType);