mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
filtering templates by frameworks
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user