bd1c921eaf29cc39c04f6157450012c640576c11
[idea/community.git] / platform / lang-impl / src / com / intellij / ide / projectView / impl / ModuleGroup.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
3 package com.intellij.ide.projectView.impl;
4
5 import com.intellij.openapi.actionSystem.DataKey;
6 import com.intellij.openapi.module.Module;
7 import com.intellij.openapi.module.ModuleGrouper;
8 import com.intellij.openapi.project.Project;
9 import com.intellij.openapi.util.text.StringUtil;
10 import com.intellij.util.ArrayUtilRt;
11 import com.intellij.util.containers.ContainerUtil;
12 import gnu.trove.THashSet;
13 import org.jetbrains.annotations.NotNull;
14
15 import java.util.ArrayList;
16 import java.util.Collection;
17 import java.util.List;
18 import java.util.Set;
19
20 public class ModuleGroup {
21   public static final DataKey<ModuleGroup[]> ARRAY_DATA_KEY = DataKey.create("moduleGroup.array");
22   private final List<String> myGroupPath;
23
24   public ModuleGroup(@NotNull List<String> groupPath) {
25     myGroupPath = groupPath;
26   }
27
28   @Override
29   public boolean equals(Object o) {
30     if (this == o) return true;
31     if (!(o instanceof ModuleGroup)) return false;
32
33     return myGroupPath.equals(((ModuleGroup)o).myGroupPath);
34   }
35
36   @Override
37   public int hashCode() {
38     return myGroupPath.hashCode();
39   }
40
41   public String @NotNull [] getGroupPath() {
42     return ArrayUtilRt.toStringArray(myGroupPath);
43   }
44
45   @NotNull
46   public List<String> getGroupPathList() {
47     return myGroupPath;
48   }
49
50   @NotNull
51   public Collection<Module> modulesInGroup(@NotNull Project project, boolean recursively) {
52     return modulesInGroup(ModuleGrouper.instanceFor(project), recursively);
53   }
54
55   /**
56    * Returns modules in this group (without modules in sub-groups) using cache built for default project grouper.
57    */
58   @NotNull
59   public Collection<Module> modulesInGroup(@NotNull Project project) {
60     return ModuleGroupsTree.getModuleGroupTree(project).getModulesInGroup(this);
61   }
62
63   @NotNull
64   public Collection<Module> modulesInGroup(@NotNull ModuleGrouper grouper, boolean recursively) {
65     List<Module> result = new ArrayList<>();
66     Set<List<String>> moduleAsGroupsPaths = ContainerUtil.map2Set(grouper.getAllModules(), module -> grouper.getModuleAsGroupPath(module));
67     for (final Module module : grouper.getAllModules()) {
68       List<String> group = grouper.getGroupPath(module);
69       if (myGroupPath.equals(group) || isChild(myGroupPath, group) && (recursively || isUnderGroupWithSameNameAsSomeModule(myGroupPath, group, moduleAsGroupsPaths))) {
70         result.add(module);
71       }
72     }
73     return result;
74   }
75
76   private static boolean isUnderGroupWithSameNameAsSomeModule(@NotNull List<String> parent, @NotNull List<String> descendant, @NotNull Set<List<String>> moduleNamesAsGroups) {
77     return descendant.size() > parent.size() && moduleNamesAsGroups.contains(descendant.subList(0, parent.size() + 1));
78   }
79
80   /**
81    * Returns direct subgroups of this group using cache built for default project grouper.
82    */
83   @NotNull
84   public Collection<ModuleGroup> childGroups(@NotNull Project project) {
85     return ModuleGroupsTree.getModuleGroupTree(project).getChildGroups(this);
86   }
87
88   @NotNull
89   public Collection<ModuleGroup> childGroups(@NotNull ModuleGrouper grouper) {
90     Set<ModuleGroup> result = new THashSet<>();
91     Set<List<String>> moduleAsGroupsPaths = ContainerUtil.map2Set(grouper.getAllModules(), module -> grouper.getModuleAsGroupPath(module));
92     for (Module module : grouper.getAllModules()) {
93       List<String> group = grouper.getGroupPath(module);
94       if (isChild(myGroupPath, group)) {
95         final List<String> directChild = ContainerUtil.append(myGroupPath, group.get(myGroupPath.size()));
96         if (!moduleAsGroupsPaths.contains(directChild)) {
97           result.add(new ModuleGroup(directChild));
98         }
99       }
100     }
101
102     return result;
103   }
104
105   private static boolean isChild(@NotNull List<String> parent, @NotNull List<String> descendant) {
106     return descendant.size() > parent.size() && descendant.subList(0, parent.size()).equals(parent);
107   }
108
109   @NotNull
110   public String presentableText() {
111     return "'" + myGroupPath.get(myGroupPath.size() - 1) + "'";
112   }
113
114   @NotNull
115   public String getQualifiedName() {
116     return StringUtil.join(myGroupPath, ".");
117   }
118
119   @Override
120   public String toString() {
121     return myGroupPath.get(myGroupPath.size() - 1);
122   }
123 }