Cleanup: NotNull/Nullable
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / artifacts / actions / SurroundElementWithAction.java
1 /*
2  * Copyright 2000-2010 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.actions;
17
18 import com.intellij.openapi.actionSystem.AnActionEvent;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.roots.ui.configuration.artifacts.ArtifactEditorEx;
21 import com.intellij.openapi.roots.ui.configuration.artifacts.LayoutTreeComponent;
22 import com.intellij.openapi.roots.ui.configuration.artifacts.LayoutTreeSelection;
23 import com.intellij.openapi.roots.ui.configuration.artifacts.nodes.PackagingElementNode;
24 import com.intellij.openapi.ui.popup.JBPopupFactory;
25 import com.intellij.openapi.ui.popup.PopupStep;
26 import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
27 import com.intellij.packaging.elements.CompositePackagingElement;
28 import com.intellij.packaging.elements.CompositePackagingElementType;
29 import com.intellij.packaging.elements.PackagingElement;
30 import com.intellij.packaging.elements.PackagingElementFactory;
31 import com.intellij.packaging.impl.artifacts.ArtifactUtil;
32 import com.intellij.util.PathUtil;
33 import com.intellij.util.containers.ContainerUtil;
34 import org.jetbrains.annotations.NotNull;
35
36 import javax.swing.*;
37 import java.util.List;
38
39 import static com.intellij.openapi.keymap.KeymapUtil.getActiveKeymapShortcuts;
40
41 /**
42  * @author nik
43  */
44 public class SurroundElementWithAction extends LayoutTreeActionBase {
45   public SurroundElementWithAction(ArtifactEditorEx artifactEditor) {
46     super("Surround With...", artifactEditor);
47     registerCustomShortcutSet(getActiveKeymapShortcuts("SurroundWith"), artifactEditor.getLayoutTreeComponent().getLayoutTree());
48   }
49
50   @Override
51   protected boolean isEnabled() {
52     return myArtifactEditor.getLayoutTreeComponent().getSelection().getCommonParentElement() != null;
53   }
54
55   @Override
56   public void actionPerformed(@NotNull AnActionEvent e) {
57     final LayoutTreeComponent treeComponent = myArtifactEditor.getLayoutTreeComponent();
58     final LayoutTreeSelection selection = treeComponent.getSelection();
59     final CompositePackagingElement<?> parent = selection.getCommonParentElement();
60     if (parent == null) return;
61     final PackagingElementNode<?> parentNode = selection.getNodes().get(0).getParentNode();
62     if (parentNode == null) return;
63
64     if (!treeComponent.checkCanModifyChildren(parent, parentNode, selection.getNodes())) {
65       return;
66     }
67
68     final CompositePackagingElementType<?>[] types = PackagingElementFactory.getInstance().getCompositeElementTypes();
69     final List<PackagingElement<?>> selected = selection.getElements();
70     if (types.length == 1) {
71       surroundWith(types[0], parent, selected, treeComponent);
72     }
73     else {
74       JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep<CompositePackagingElementType>("Surround With...", types) {
75         @Override
76         public Icon getIconFor(CompositePackagingElementType aValue) {
77           return aValue.getCreateElementIcon();
78         }
79
80         @NotNull
81         @Override
82         public String getTextFor(CompositePackagingElementType value) {
83           return value.getPresentableName();
84         }
85
86         @Override
87         public PopupStep onChosen(final CompositePackagingElementType selectedValue, boolean finalChoice) {
88           return doFinalStep(() -> surroundWith(selectedValue, parent, selected, treeComponent));
89         }
90       }).showInBestPositionFor(e.getDataContext());
91     }
92   }
93
94   private void surroundWith(final CompositePackagingElementType<?> type, final CompositePackagingElement<?> parent, final List<PackagingElement<?>> selected,
95                             LayoutTreeComponent treeComponent) {
96     if (myArtifactEditor.isDisposed() || selected.isEmpty()) return;
97
98     final Project project = myArtifactEditor.getContext().getProject();
99     final String elementName = ContainerUtil.getFirstItem(selected, null).createPresentation(myArtifactEditor.getContext()).getPresentableName();
100     final String baseName = PathUtil.suggestFileName(elementName);
101     final CompositePackagingElement<?> newParent = type.createComposite(parent, baseName, myArtifactEditor.getContext());
102     if (newParent != null) {
103       treeComponent.editLayout(() -> {
104         for (PackagingElement<?> element : selected) {
105           newParent.addOrFindChild(ArtifactUtil.copyWithChildren(element, project));
106         }
107         for (PackagingElement<?> element : selected) {
108           parent.removeChild(element);
109         }
110         parent.addOrFindChild(newParent);
111       });
112       treeComponent.rebuildTree();
113     }
114   }
115 }