filtering templates by frameworks

This commit is contained in:
Dmitry Avdeev
2014-03-07 13:43:45 +04:00
parent 2670f2de67
commit 3b799e4d8d
8 changed files with 112 additions and 39 deletions
@@ -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<FrameworkSupportNode, String> NODE_STRING_FUNCTION = new Function<FrameworkSupportNode, String>() {
@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<ProjectTemplate> getAvailableTemplates() {
return myCurrentCard != FRAMEWORKS_CARD ? Collections.<ProjectTemplate>emptyList() : myTemplatesMap.get(getSelectedGroup());
if (myCurrentCard != FRAMEWORKS_CARD) {
return Collections.emptyList();
}
else {
Collection<ProjectTemplate> templates = myTemplatesMap.get(getSelectedGroup());
List<FrameworkSupportNode> nodes = myFrameworksPanel.getSelectedNodes();
if (nodes.isEmpty()) return templates;
final List<String> selectedFrameworks = ContainerUtil.map(nodes, NODE_STRING_FUNCTION);
return ContainerUtil.filter(templates, new Condition<ProjectTemplate>() {
@Override
public boolean value(ProjectTemplate template) {
if (!(template instanceof ArchivedProjectTemplate)) return true;
List<String> 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;
}
}
@@ -368,7 +368,7 @@ public class AddSupportForFrameworksPanel implements Disposable {
return !getSelectedNodes().isEmpty();
}
private List<FrameworkSupportNode> getSelectedNodes() {
public List<FrameworkSupportNode> getSelectedNodes() {
List<FrameworkSupportNode> list = new ArrayList<FrameworkSupportNode>();
if (myRoots != null) {
addChildFrameworks(myRoots, list);
@@ -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;
}
});
}
}
@@ -60,8 +60,12 @@ public abstract class ArchivedProjectTemplate implements ProjectTemplate {
return new TemplateModuleBuilder(this, getModuleType(), getInputFields());
}
@NotNull
public abstract List<WizardInputField> getInputFields();
@NotNull
public abstract List<String> getFeaturedFrameworks();
@Nullable
@Override
public ValidationInfo validateSettings() {
@@ -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<WizardInputField> myInputFields = Collections.emptyList();
private Icon myIcon;
private List<String> 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<ZipEntry>() {
@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<WizardInputField> getInputFields() {
return myInputFields;
}
@NotNull
@Override
public List<String> getFeaturedFrameworks() {
return myFrameworks;
}
@Override
public ZipInputStream getStream() throws IOException {
return new ZipInputStream(myArchivePath.openStream());
@@ -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> ELEMENT_STRING_FUNCTION = new Function<Element, String>() {
@Override
public String fun(Element element) {
return element.getText();
}
};
private final ClearableLazyValue<MultiMap<String, ArchivedProjectTemplate>> myTemplates = new ClearableLazyValue<MultiMap<String, ArchivedProjectTemplate>>() {
@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<String> frameworks = getFrameworks(element);
return new ArchivedProjectTemplate(name, element.getChildTextTrim("category")) {
@Override
protected ModuleType getModuleType() {
return moduleType;
}
@NotNull
@Override
public List<WizardInputField> getInputFields() {
return inputFields;
}
@NotNull
@Override
public List<String> 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<String> getFrameworks(Element element) {
List<Element> frameworks = element.getChildren("framework");
return ContainerUtil.map(frameworks, ELEMENT_STRING_FUNCTION);
}
static List<WizardInputField> getFields(Element templateElement, final Namespace ns) {
//noinspection unchecked
return ContainerUtil.mapNotNull(templateElement.getChildren(INPUT_FIELD, ns), new Function<Element, WizardInputField>() {
@@ -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
@@ -91,10 +91,6 @@ public abstract class ProjectWizardTestCase<T extends AbstractProjectWizard> ext
throw new IllegalArgumentException(group + "/" + name + " template not found");
}
if (adjuster != null) {
adjuster.consume(step);
}
runWizard(new Consumer<Step>() {
@Override
public void consume(Step step) {
@@ -108,6 +104,23 @@ public abstract class ProjectWizardTestCase<T extends AbstractProjectWizard> ext
});
}
protected void runWizard(Consumer<Step> 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<T extends AbstractProjectWizard> ext
return (T)new AddModuleWizard(project, DefaultModulesProvider.createForProject(project), directory.getPath());
}
protected void runWizard(Consumer<Step> 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();