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