diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java index 8aca6ad5e24b..21e4713d26d3 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java @@ -21,6 +21,7 @@ import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.frameworkSupport.FrameworkRole; import com.intellij.ide.util.frameworkSupport.FrameworkSupportUtil; import com.intellij.ide.util.newProjectWizard.AddSupportForFrameworksPanel; +import com.intellij.ide.util.newProjectWizard.FrameworkSupportNode; import com.intellij.ide.util.newProjectWizard.TemplatesGroup; import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelBase; import com.intellij.ide.util.newProjectWizard.modes.CreateFromTemplateMode; @@ -88,6 +89,12 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { return o.getId(); } }; + public static final Function NODE_STRING_FUNCTION = new Function() { + @Override + public String fun(FrameworkSupportNode node) { + return node.getId(); + } + }; private JPanel myPanel; private JPanel myOptionsPanel; @@ -424,7 +431,23 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { } public Collection getAvailableTemplates() { - return myCurrentCard != FRAMEWORKS_CARD ? Collections.emptyList() : myTemplatesMap.get(getSelectedGroup()); + if (myCurrentCard != FRAMEWORKS_CARD) { + return Collections.emptyList(); + } + else { + Collection templates = myTemplatesMap.get(getSelectedGroup()); + List nodes = myFrameworksPanel.getSelectedNodes(); + if (nodes.isEmpty()) return templates; + final List selectedFrameworks = ContainerUtil.map(nodes, NODE_STRING_FUNCTION); + return ContainerUtil.filter(templates, new Condition() { + @Override + public boolean value(ProjectTemplate template) { + if (!(template instanceof ArchivedProjectTemplate)) return true; + List frameworks = ((ArchivedProjectTemplate)template).getFeaturedFrameworks(); + return frameworks.containsAll(selectedFrameworks); + } + }); + } } public void onWizardFinished() throws CommitStepException { @@ -467,19 +490,6 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { return myProjectTypeList; } - @TestOnly - public boolean setSelectedTemplate(String group, String name) { - ListModel model = myProjectTypeList.getModel(); - for (int i = 0; i < model.getSize(); i++) { - if (group.equals(((TemplatesGroup)model.getElementAt(i)).getName())) { - myProjectTypeList.setSelectedIndex(i); - if (name == null) return getSelectedGroup().getName().equals(group); - return myTemplatesList.setSelectedTemplate(name); - } - } - return false; - } - @Override public void dispose() { } @@ -560,4 +570,22 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable { myWizard.getSequence().setType(builder.getBuilderId()); } } + + @TestOnly + public boolean setSelectedTemplate(String group, String name) { + ListModel model = myProjectTypeList.getModel(); + for (int i = 0; i < model.getSize(); i++) { + if (group.equals(((TemplatesGroup)model.getElementAt(i)).getName())) { + myProjectTypeList.setSelectedIndex(i); + if (name == null) return getSelectedGroup().getName().equals(group); + return myTemplatesList.setSelectedTemplate(name); + } + } + return false; + } + + @TestOnly + public AddSupportForFrameworksPanel getFrameworksPanel() { + return myFrameworksPanel; + } } diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java index f772f04660ec..200d63580438 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddSupportForFrameworksPanel.java @@ -368,7 +368,7 @@ public class AddSupportForFrameworksPanel implements Disposable { return !getSelectedNodes().isEmpty(); } - private List getSelectedNodes() { + public List getSelectedNodes() { List list = new ArrayList(); if (myRoots != null) { addChildFrameworks(myRoots, list); diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java index 894bfcb9ce42..b7a4e12b7681 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/FrameworksTree.java @@ -20,10 +20,12 @@ import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelBase; import com.intellij.ui.*; import com.intellij.util.containers.Convertor; import com.intellij.util.ui.tree.TreeUtil; +import org.jetbrains.annotations.TestOnly; import javax.swing.*; import javax.swing.border.Border; import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.event.MouseEvent; @@ -123,4 +125,19 @@ public class FrameworksTree extends CheckboxTree { } } } + + @TestOnly + public boolean selectFramework(final String id, final boolean checked) { + TreeNode root = (TreeNode)getModel().getRoot(); + return !TreeUtil.traverse(root, new TreeUtil.Traverse() { + @Override + public boolean accept(Object node) { + if (node instanceof FrameworkSupportNode && id.equals(((FrameworkSupportNode)node).getId())) { + ((FrameworkSupportNode)node).setChecked(checked); + return false; + } + return true; + } + }); + } } diff --git a/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java b/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java index 8937dd97dcc8..817b3da048c8 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java +++ b/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java @@ -60,8 +60,12 @@ public abstract class ArchivedProjectTemplate implements ProjectTemplate { return new TemplateModuleBuilder(this, getModuleType(), getInputFields()); } + @NotNull public abstract List getInputFields(); + @NotNull + public abstract List getFeaturedFrameworks(); + @Nullable @Override public ValidationInfo validateSettings() { diff --git a/java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java b/java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java index e9c84800dafe..3bf2e8072383 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java +++ b/java/idea-ui/src/com/intellij/platform/templates/LocalArchivedTemplate.java @@ -46,12 +46,13 @@ import java.util.zip.ZipInputStream; public class LocalArchivedTemplate extends ArchivedProjectTemplate { public static final String DESCRIPTION_PATH = Project.DIRECTORY_STORE_FOLDER + "/description.html"; - static final String IDEA_INPUT_FIELDS_XML = Project.DIRECTORY_STORE_FOLDER + "/project-template.xml"; + static final String TEMPLATE_DESCRIPTOR = Project.DIRECTORY_STORE_FOLDER + "/project-template.xml"; private final URL myArchivePath; private final ModuleType myModuleType; private List myInputFields = Collections.emptyList(); private Icon myIcon; + private List myFrameworks = Collections.emptyList(); public LocalArchivedTemplate(@NotNull URL archivePath, @NotNull ClassLoader classLoader) { @@ -62,7 +63,7 @@ public class LocalArchivedTemplate extends ArchivedProjectTemplate { String s = readEntry(new Condition() { @Override public boolean value(ZipEntry entry) { - return entry.getName().endsWith(IDEA_INPUT_FIELDS_XML); + return entry.getName().endsWith(TEMPLATE_DESCRIPTOR); } }); if (s != null) { @@ -73,6 +74,7 @@ public class LocalArchivedTemplate extends ArchivedProjectTemplate { if (iconPath != null) { myIcon = IconLoader.findIcon(iconPath, classLoader); } + myFrameworks = RemoteTemplatesFactory.getFrameworks(templateElement); } catch (Exception e) { throw new RuntimeException(e); @@ -145,11 +147,18 @@ public class LocalArchivedTemplate extends ArchivedProjectTemplate { return myModuleType; } + @NotNull @Override public List getInputFields() { return myInputFields; } + @NotNull + @Override + public List getFeaturedFrameworks() { + return myFrameworks; + } + @Override public ZipInputStream getStream() throws IOException { return new ZipInputStream(myArchivePath.openStream()); diff --git a/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java b/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java index dd30f52a5386..a3e8b803f0af 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java +++ b/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java @@ -59,6 +59,12 @@ public class RemoteTemplatesFactory extends ProjectTemplatesFactory { public static final String INPUT_FIELD = "input-field"; public static final String TEMPLATE = "template"; public static final String INPUT_DEFAULT = "default"; + public static final Function ELEMENT_STRING_FUNCTION = new Function() { + @Override + public String fun(Element element) { + return element.getText(); + } + }; private final ClearableLazyValue> myTemplates = new ClearableLazyValue>() { @NotNull @@ -137,17 +143,25 @@ public class RemoteTemplatesFactory extends ProjectTemplatesFactory { final String path = element.getChildText("path", ns); final String description = element.getChildTextTrim("description", ns); String name = element.getChildTextTrim("name", ns); + final List frameworks = getFrameworks(element); return new ArchivedProjectTemplate(name, element.getChildTextTrim("category")) { @Override protected ModuleType getModuleType() { return moduleType; } + @NotNull @Override public List getInputFields() { return inputFields; } + @NotNull + @Override + public List getFeaturedFrameworks() { + return frameworks; + } + @Override public ZipInputStream getStream() throws IOException { final HttpURLConnection connection = getConnection(path); @@ -170,6 +184,11 @@ public class RemoteTemplatesFactory extends ProjectTemplatesFactory { }); } + public static List getFrameworks(Element element) { + List frameworks = element.getChildren("framework"); + return ContainerUtil.map(frameworks, ELEMENT_STRING_FUNCTION); + } + static List getFields(Element templateElement, final Namespace ns) { //noinspection unchecked return ContainerUtil.mapNotNull(templateElement.getChildren(INPUT_FIELD, ns), new Function() { diff --git a/java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java b/java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java index 2ef20073fc12..4d7c4767c27e 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java +++ b/java/idea-ui/src/com/intellij/platform/templates/SaveProjectAsTemplateAction.java @@ -143,7 +143,7 @@ public class SaveProjectAsTemplateAction extends AnAction { writeFile(LocalArchivedTemplate.DESCRIPTION_PATH, description, project, dir, stream, true); if (replaceParameters) { String text = getInputFieldsText(parameters); - writeFile(LocalArchivedTemplate.IDEA_INPUT_FIELDS_XML, text, project, dir, stream, false); + writeFile(LocalArchivedTemplate.TEMPLATE_DESCRIPTOR, text, project, dir, stream, false); } FileIndex index = moduleToSave == null diff --git a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java index 96e85a21f989..dd94962cddfd 100644 --- a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java +++ b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java @@ -91,10 +91,6 @@ public abstract class ProjectWizardTestCase ext throw new IllegalArgumentException(group + "/" + name + " template not found"); } - if (adjuster != null) { - adjuster.consume(step); - } - runWizard(new Consumer() { @Override public void consume(Step step) { @@ -108,6 +104,23 @@ public abstract class ProjectWizardTestCase ext }); } + protected void runWizard(Consumer adjuster) { + while(true) { + ModuleWizardStep currentStep = myWizard.getCurrentStepObject(); + if (adjuster != null) { + adjuster.consume(currentStep); + } + if (myWizard.isLast()) { + break; + } + myWizard.doNextAction(); + if (currentStep == myWizard.getCurrentStepObject()) { + throw new RuntimeException(currentStep + " is not validated"); + } + } + myWizard.doOk(); + } + protected void createWizard(Project project) throws IOException { File directory = FileUtil.createTempDirectory(getName(), "new", false); myFilesToDelete.add(directory); @@ -126,23 +139,6 @@ public abstract class ProjectWizardTestCase ext return (T)new AddModuleWizard(project, DefaultModulesProvider.createForProject(project), directory.getPath()); } - protected void runWizard(Consumer adjuster) { - while(true) { - ModuleWizardStep currentStep = myWizard.getCurrentStepObject(); - if (adjuster != null) { - adjuster.consume(currentStep); - } - if (myWizard.isLast()) { - break; - } - myWizard.doNextAction(); - if (currentStep == myWizard.getCurrentStepObject()) { - throw new RuntimeException(currentStep + " is not validated"); - } - } - myWizard.doOk(); - } - @Override protected void setUp() throws Exception { super.setUp();