aa0540efc290a6b17833ec251991f6853d8e438d
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / artifacts / actions / MovePackagingElementAction.java
1 // Copyright 2000-2019 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.actions;
3
4 import com.intellij.ide.JavaUiBundle;
5 import com.intellij.openapi.actionSystem.AnActionEvent;
6 import com.intellij.openapi.project.DumbAwareAction;
7 import com.intellij.openapi.roots.ui.configuration.artifacts.LayoutTreeComponent;
8 import com.intellij.openapi.roots.ui.configuration.artifacts.nodes.CompositePackagingElementNode;
9 import com.intellij.openapi.roots.ui.configuration.artifacts.nodes.PackagingElementNode;
10 import com.intellij.packaging.elements.CompositePackagingElement;
11 import com.intellij.packaging.elements.PackagingElement;
12 import org.jetbrains.annotations.NotNull;
13
14 import javax.swing.*;
15 import java.util.ArrayList;
16 import java.util.Collections;
17 import java.util.List;
18
19 public class MovePackagingElementAction extends DumbAwareAction {
20   private final LayoutTreeComponent myLayoutTreeComponent;
21   private final int myDirection;
22
23   public MovePackagingElementAction(LayoutTreeComponent layoutTreeComponent, String text, String description, Icon icon, int direction) {
24     super(text, description, icon);
25     myLayoutTreeComponent = layoutTreeComponent;
26     myDirection = direction;
27   }
28
29   @Override
30   public void update(@NotNull AnActionEvent e) {
31     final boolean b = isEnabled();
32     e.getPresentation().setEnabled(b);
33     e.getPresentation().setText(JavaUiBundle.message("action.text.0.disabled.if.elements.are.sorted", getTemplatePresentation().getText()));
34   }
35
36   private boolean isEnabled() {
37     if (myLayoutTreeComponent.isSortElements()) {
38       return false;
39     }
40     final PackagingElementNode<?> node = myLayoutTreeComponent.getSelection().getNodeIfSingle();
41     if (node == null) {
42       return false;
43     }
44     final CompositePackagingElementNode parent = node.getParentNode();
45     if (parent == null) return false;
46
47     final PackagingElement<?> element = node.getElementIfSingle();
48     final CompositePackagingElement<?> parentElement = parent.getElementIfSingle();
49     if (parentElement == null || element == null) return false;
50     final List<PackagingElement<?>> children = parentElement.getChildren();
51     final int index = children.indexOf(element);
52     return index != -1 && 0 <= index + myDirection && index + myDirection < children.size();
53   }
54
55   @Override
56   public void actionPerformed(@NotNull AnActionEvent e) {
57     final PackagingElementNode<?> node = myLayoutTreeComponent.getSelection().getNodeIfSingle();
58     if (node == null) return;
59     final CompositePackagingElementNode parent = node.getParentNode();
60     if (parent == null) return;
61
62     final PackagingElement<?> element = node.getElementIfSingle();
63     final CompositePackagingElement<?> parentElement = parent.getElementIfSingle();
64     if (parentElement == null || element == null) return;
65
66
67     if (!myLayoutTreeComponent.checkCanModifyChildren(parentElement, parent, Collections.singletonList(node))) return;
68
69     final List<PackagingElement<?>> toSelect = new ArrayList<>();
70     myLayoutTreeComponent.editLayout(() -> {
71       final int index = parentElement.getChildren().indexOf(element);
72       final PackagingElement<?> moved = parentElement.moveChild(index, myDirection);
73       if (moved != null) {
74         toSelect.add(moved);
75       }
76     });
77     if (!toSelect.isEmpty()) {
78       myLayoutTreeComponent.updateAndSelect(parent, toSelect);
79     }
80   }
81 }