diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java index bd879e4c11c3..c3397e6cb345 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java @@ -89,19 +89,29 @@ public class SelectTemplateStep extends ModuleWizardStep { Messages.installHyperlinkSupport(myDescriptionPane); ProjectTemplatesFactory[] factories = ProjectTemplatesFactory.EP_NAME.getExtensions(); - final MultiMap groups = new MultiMap(); + final MultiMap groups = new MultiMap(); for (ProjectTemplatesFactory factory : factories) { for (String string : factory.getGroups()) { - groups.putValue(string, factory); + groups.putValues(string, Arrays.asList(factory.createTemplates(string, context))); + } + } + final MultiMap sorted = new MultiMap(); + // put single leafs under "Other" + for (Map.Entry> entry : groups.entrySet()) { + if (entry.getValue().size() > 1 || ArchivedTemplatesFactory.CUSTOM_GROUP.equals(entry.getKey())) { + sorted.put(entry.getKey(), entry.getValue()); + } + else { + sorted.putValues("Other", entry.getValue()); } } SimpleTreeStructure.Impl structure = new SimpleTreeStructure.Impl(new SimpleNode() { @Override public SimpleNode[] getChildren() { - return ContainerUtil.map2Array(groups.entrySet(), NO_CHILDREN, new Function>, SimpleNode>() { + return ContainerUtil.map2Array(sorted.entrySet(), NO_CHILDREN, new Function>, SimpleNode>() { @Override - public SimpleNode fun(Map.Entry> entry) { + public SimpleNode fun(Map.Entry> entry) { return new GroupNode(entry.getKey(), entry.getValue()); } }); @@ -182,7 +192,7 @@ public class SelectTemplateStep extends ModuleWizardStep { } mySettingsPanel.setVisible(settingsPanel != null); String description = template.getDescription(); - if (description != null) { + if (StringUtil.isNotEmpty(description)) { StringBuilder sb = new StringBuilder("'); sb.append(description).append(""); @@ -234,12 +244,10 @@ public class SelectTemplateStep extends ModuleWizardStep { case KeyEvent.VK_DOWN: myTemplatesTree.setSelectionRow(row < myTemplatesTree.getRowCount() - 1 ? row + 1 : 0); break; - case KeyEvent.VK_ENTER: - myTemplatesTree.expandRow(row); } } } - }.registerCustomShortcutSet(new CustomShortcutSet(KeyEvent.VK_UP, KeyEvent.VK_DOWN, KeyEvent.VK_ENTER), mySearchField); + }.registerCustomShortcutSet(new CustomShortcutSet(KeyEvent.VK_UP, KeyEvent.VK_DOWN), mySearchField); } @Override @@ -368,23 +376,20 @@ public class SelectTemplateStep extends ModuleWizardStep { mySearchField = new SearchTextField(false); } - private class GroupNode extends SimpleNode { + private static class GroupNode extends SimpleNode { private final String myGroup; - private final Collection myFactories; + private final Collection myTemplates; - public GroupNode(String group, Collection factories) { + public GroupNode(String group, Collection templates) { myGroup = group; - myFactories = factories; + myTemplates = templates; } @Override public SimpleNode[] getChildren() { List children = new ArrayList(); - for (ProjectTemplatesFactory factory : myFactories) { - ProjectTemplate[] templates = factory.createTemplates(myGroup, myContext); - for (ProjectTemplate template : templates) { - children.add(new TemplateNode(template)); - } + for (ProjectTemplate template : myTemplates) { + children.add(new TemplateNode(template)); } return children.toArray(new SimpleNode[children.size()]); } diff --git a/java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java b/java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java index 861717875b44..26a014774434 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java +++ b/java/idea-ui/src/com/intellij/platform/templates/ArchivedTemplatesFactory.java @@ -99,7 +99,7 @@ public class ArchivedTemplatesFactory implements ProjectTemplatesFactory { } static String getCustomTemplatesPath() { - return PathManager.getConfigPath() + "/projectTemplates"; + return PathManager.getConfigPath() + "/resources/projectTemplates"; } @NotNull diff --git a/java/idea-ui/src/com/intellij/platform/templates/EmptyModuleTemplatesFactory.java b/java/idea-ui/src/com/intellij/platform/templates/EmptyModuleTemplatesFactory.java index 934420591f08..eb8a1fa8477d 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/EmptyModuleTemplatesFactory.java +++ b/java/idea-ui/src/com/intellij/platform/templates/EmptyModuleTemplatesFactory.java @@ -39,48 +39,65 @@ public class EmptyModuleTemplatesFactory implements ProjectTemplatesFactory { @NotNull @Override public String[] getGroups() { - return new String[] {GROUP_NAME}; + List builders = ModuleBuilder.getAllBuilders(); + return ContainerUtil.map2Array(builders, String.class, new Function() { + @Override + public String fun(ModuleBuilder builder) { + return getGroupName(builder); + } + }); } @NotNull @Override public ProjectTemplate[] createTemplates(String group, WizardContext context) { List builders = ModuleBuilder.getAllBuilders(); - return ContainerUtil.map2Array(builders, ProjectTemplate.class, new Function() { - @Override - public ProjectTemplate fun(final ModuleBuilder builder) { - return new ProjectTemplate() { - @NotNull - @Override - public String getName() { - return builder.getPresentableName(); - } + for (ModuleBuilder builder : builders) { + if (getGroupName(builder).equals(group)) return new ProjectTemplate[] {new EmptyModuleTemplate(builder)}; + } + return new ProjectTemplate[0]; + } - @Nullable - @Override - public String getDescription() { - return builder.getDescription(); - } + private static String getGroupName(ModuleBuilder builder) { + String name = builder.getPresentableName(); + return name.split(" ")[0]; + } - @Nullable - @Override - public JComponent getSettingsPanel() { - return null; - } + private static class EmptyModuleTemplate implements ProjectTemplate { + private final ModuleBuilder myBuilder; - @NotNull - @Override - public ModuleBuilder createModuleBuilder() { - return builder; - } + public EmptyModuleTemplate(ModuleBuilder builder) { + myBuilder = builder; + } - @Nullable - @Override - public ValidationInfo validateSettings() { - return null; - } - }; - } - }); + @NotNull + @Override + public String getName() { + return myBuilder.getPresentableName(); + } + + @Nullable + @Override + public String getDescription() { + return myBuilder.getDescription(); + } + + @Nullable + @Override + public JComponent getSettingsPanel() { + return null; + } + + @NotNull + @Override + public ModuleBuilder createModuleBuilder() { + return myBuilder; + } + + @Nullable + @Override + public ValidationInfo validateSettings() { + return null; + } } } diff --git a/java/java-impl/src/resources/projectTemplates/Java/Java_Command_Line_Application.zip b/java/java-impl/src/resources/projectTemplates/Java/Java_Command_Line_Application.zip new file mode 100644 index 000000000000..c9dbc294b4f6 Binary files /dev/null and b/java/java-impl/src/resources/projectTemplates/Java/Java_Command_Line_Application.zip differ