diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/ModuleData.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/ModuleData.java index 76ddf6debefb..37cec02ab894 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/ModuleData.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/ModuleData.java @@ -2,6 +2,7 @@ package com.intellij.openapi.externalSystem.model.project; import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -223,6 +224,19 @@ public class ModuleData extends AbstractNamedData implements Named, ExternalConf myProperties.put(key, value); } + @Nullable + public String getIdeGrouping() { + String internalName = StringUtil.nullize(getInternalName()); + String parentGrouping = getIdeParentGrouping(); + if (parentGrouping == null) return internalName; + return StringUtil.join(parentGrouping, ".", internalName); + } + + @Nullable + public String getIdeParentGrouping() { + return StringUtil.nullize(getGroup()); + } + @Override public boolean equals(Object o) { if (!(o instanceof ModuleData)) return false; diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java index fac0d113cbb1..7b8791ffd428 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java @@ -288,6 +288,19 @@ public class ExternalSystemApiUtil { } } + public static void visitChildrenFirst(@Nullable DataNode node, @NotNull Consumer> consumer) { + if (node == null) return; + + Queue toProcess = ContainerUtil.newLinkedList(node); + while (!toProcess.isEmpty()) { + DataNode node0 = toProcess.poll(); + consumer.consume(node0); + for (DataNode child : node0.getChildren()) { + toProcess.offer(child); + } + } + } + @NotNull public static Collection> findAllRecursively(@Nullable final DataNode node, @NotNull final Key key) { diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalProjectDataSelectorDialog.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalProjectDataSelectorDialog.java index 02328433b00d..6226af059791 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalProjectDataSelectorDialog.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalProjectDataSelectorDialog.java @@ -311,6 +311,7 @@ public class ExternalProjectDataSelectorDialog extends DialogWrapper { private Couple createRoot() { final Map treeNodeMap = ContainerUtil.newIdentityTroveMap(); + final Map ideGroupingMap = ContainerUtil.newHashMap(); final DataNodeCheckedTreeNode[] preselectedNode = {null}; final DataNodeCheckedTreeNode[] rootModuleNode = {null}; @@ -328,7 +329,7 @@ public class ExternalProjectDataSelectorDialog extends DialogWrapper { final int[] modulesCount = {0}; - ExternalSystemApiUtil.visit(myProjectInfo.getExternalProjectStructure(), node -> { + ExternalSystemApiUtil.visitChildrenFirst(myProjectInfo.getExternalProjectStructure(), node -> { final Key key = node.getKey(); if (!myPublicKeys.contains(key)) return; @@ -353,20 +354,31 @@ public class ExternalProjectDataSelectorDialog extends DialogWrapper { if (myPreselectedNodeObject != null && myPreselectedNodeObject.equals(node.getData())) { preselectedNode[0] = treeNode; } + DataNode parent = node.getParent(); if (node.getData() instanceof ModuleData) { - if (key.equals(ProjectKeys.MODULE) && myProjectInfo.getExternalProjectPath().equals(((ModuleData)node.getData()).getLinkedExternalProjectPath())) { + ModuleData moduleData = (ModuleData)node.getData(); + if (key.equals(ProjectKeys.MODULE) && myProjectInfo.getExternalProjectPath().equals(moduleData.getLinkedExternalProjectPath())) { rootModuleNode[0] = treeNode; } + String ideGrouping = moduleData.getIdeGrouping(); + if (ideGrouping != null) { + ideGroupingMap.put(ideGrouping, node); + } + String ideParentGrouping = moduleData.getIdeParentGrouping(); + DataNode structuralParent = ideParentGrouping != null ? ideGroupingMap.get(ideParentGrouping) : null; + if (structuralParent != null) { + parent = structuralParent; + } } - treeNode.setEnabled(myIgnorableKeys.contains(key)); - treeNodeMap.put(node, treeNode); - final DataNode parent = node.getParent(); if (parent != null) { final CheckedTreeNode parentTreeNode = treeNodeMap.get(parent); if (parentTreeNode != null) { parentTreeNode.add(treeNode); } } + treeNode.setEnabled(myIgnorableKeys.contains(key)); + treeNodeMap.put(node, treeNode); + } }); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ModuleNode.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ModuleNode.java index 7aeddeac1f02..52868e422f6b 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ModuleNode.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ModuleNode.java @@ -132,16 +132,13 @@ public class ModuleNode extends ExternalSystemNode { public String getIdeGrouping() { ModuleData data = getData(); if (data == null) return null; - String internalName = StringUtil.nullize(data.getInternalName()); - String parentGrouping = getIdeParentGrouping(); - if (parentGrouping == null) return internalName; - return StringUtil.join(parentGrouping, ".", internalName); + return data.getIdeGrouping(); } @Nullable public String getIdeParentGrouping() { ModuleData data = getData(); if (data == null) return null; - return StringUtil.nullize(data.getGroup()); + return data.getIdeParentGrouping(); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectStructureCustomizer.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectStructureCustomizer.java index 59885fe4980e..dd5067276fed 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectStructureCustomizer.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectStructureCustomizer.java @@ -19,15 +19,17 @@ import com.intellij.openapi.externalSystem.ExternalSystemUiAware; import com.intellij.openapi.externalSystem.importing.ExternalProjectStructureCustomizer; import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.Key; +import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.project.Identifiable; +import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData; import javax.swing.*; -import java.util.Collections; import java.util.Set; /** @@ -35,7 +37,7 @@ import java.util.Set; */ public class GradleProjectStructureCustomizer extends ExternalProjectStructureCustomizer { - private final Set> myKeys = Collections.singleton(GradleSourceSetData.KEY); + private final Set> myKeys = ContainerUtil.newHashSet(GradleSourceSetData.KEY, ProjectKeys.MODULE); @NotNull @Override @@ -68,6 +70,10 @@ public class GradleProjectStructureCustomizer extends ExternalProjectStructureCu final GradleSourceSetData data = (GradleSourceSetData)node.getData(); return Couple.of("Source Set", StringUtil.substringAfter(data.getExternalName(), ":")); } + if (node.getKey().equals(ProjectKeys.MODULE)) { + ModuleData moduleData = (ModuleData)node.getData(); + return Couple.of(moduleData.getExternalName(), null); + } return super.getRepresentationName(node); } }