ChooseTemplateStep

This commit is contained in:
Dmitry Avdeev
2014-01-30 16:29:09 +04:00
parent da0b420c85
commit ec25543549
9 changed files with 199 additions and 38 deletions
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.ide.projectWizard.ChooseTemplateStep">
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="500" height="400"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="13f52" class="com.intellij.ui.components.JBRadioButton" binding="myEmptyProjectButton">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<selected value="true"/>
<text value="Create &amp;empty project"/>
</properties>
</component>
<hspacer id="35cc7">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
<component id="2c81b" class="com.intellij.ui.components.JBRadioButton" binding="myFromTemplateButton">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Create project from &amp;template"/>
</properties>
</component>
<nested-form id="2fbda" form-file="com/intellij/ide/projectWizard/ProjectTemplateList.form" binding="myTemplateList">
<constraints>
<grid row="2" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
</nested-form>
</children>
</grid>
<buttonGroups>
<group name="myGroup">
<member id="2c81b"/>
<member id="13f52"/>
</group>
</buttonGroups>
</form>
@@ -0,0 +1,80 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ide.projectWizard;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.platform.ProjectTemplate;
import com.intellij.ui.components.JBRadioButton;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
/**
* @author Dmitry Avdeev
*/
public class ChooseTemplateStep extends ModuleWizardStep {
private final WizardContext myWizardContext;
private final ProjectTypeStep myProjectTypeStep;
private JPanel myPanel;
private JBRadioButton myEmptyProjectButton;
private JBRadioButton myFromTemplateButton;
private ProjectTemplateList myTemplateList;
public ChooseTemplateStep(WizardContext wizardContext, ProjectTypeStep projectTypeStep) {
myWizardContext = wizardContext;
myProjectTypeStep = projectTypeStep;
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateSelection();
}
};
myEmptyProjectButton.addActionListener(listener);
myFromTemplateButton.addActionListener(listener);
updateSelection();
}
private void updateSelection() {
myTemplateList.setEnabled(myFromTemplateButton.isSelected());
}
@Override
public boolean isStepVisible() {
return !myProjectTypeStep.getAvailableTemplates().isEmpty();
}
@Override
public JComponent getComponent() {
return myPanel;
}
@Override
public void updateStep() {
myTemplateList.setTemplates(new ArrayList<ProjectTemplate>(myProjectTypeStep.getAvailableTemplates()), false);
}
@Override
public void updateDataModel() {
if (myFromTemplateButton.isSelected()) {
myWizardContext.setProjectTemplate(myTemplateList.getSelectedTemplate());
}
}
}
@@ -26,7 +26,6 @@ import org.jetbrains.annotations.Nullable;
/**
* @author Dmitry Avdeev
* Date: 04.09.13
*/
public class NewProjectWizard extends AbstractProjectWizard {
@@ -36,7 +35,9 @@ public class NewProjectWizard extends AbstractProjectWizard {
super(project == null ? IdeBundle.message("title.new.project") : IdeBundle.message("title.add.module"), project, defaultPath);
myWizardContext.setNewWizard(true);
mySequence = new StepSequence();
mySequence.addCommonStep(new ProjectTypeStep(myWizardContext, this, modulesProvider));
ProjectTypeStep projectTypeStep = new ProjectTypeStep(myWizardContext, this, modulesProvider);
mySequence.addCommonStep(projectTypeStep);
mySequence.addCommonStep(new ChooseTemplateStep(myWizardContext, projectTypeStep));
mySequence.addCommonFinishingStep(new ProjectSettingsStep(myWizardContext), null);
for (ModuleWizardStep step : mySequence.getAllSteps()) {
addStep(step);
@@ -17,16 +17,18 @@ package com.intellij.ide.projectWizard;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.popup.ListItemDescriptor;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.platform.ProjectTemplate;
import com.intellij.platform.templates.ArchivedProjectTemplate;
import com.intellij.ui.CollectionListModel;
import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.components.JBList;
import com.intellij.ui.popup.list.GroupedItemsListRenderer;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.Nullable;
@@ -54,14 +56,48 @@ public class ProjectTemplateList extends JPanel {
super(new BorderLayout());
add(myPanel, BorderLayout.CENTER);
ColoredListCellRenderer<ProjectTemplate> renderer = new ColoredListCellRenderer<ProjectTemplate>() {
GroupedItemsListRenderer renderer = new GroupedItemsListRenderer(new ListItemDescriptor<ProjectTemplate>() {
@Nullable
@Override
protected void customizeCellRenderer(JList list, ProjectTemplate template, int index, boolean selected, boolean hasFocus) {
append(template.getName());
setIcon(template.getIcon());
public String getTextFor(ProjectTemplate value) {
return value.getName();
}
@Nullable
@Override
public String getTooltipFor(ProjectTemplate value) {
return null;
}
@Nullable
@Override
public Icon getIconFor(ProjectTemplate value) {
return value.getIcon();
}
@Override
public boolean hasSeparatorAboveOf(ProjectTemplate value) {
return false;
}
@Nullable
@Override
public String getCaptionAboveOf(ProjectTemplate value) {
return null;
}
}) {
@Override
protected void customizeComponent(JList list, Object value, boolean isSelected) {
super.customizeComponent(list, value, isSelected);
Icon icon = myTextLabel.getIcon();
if (icon != null && myTextLabel.getDisabledIcon() == icon) {
myTextLabel.setDisabledIcon(IconLoader.getDisabledIcon(icon));
}
myTextLabel.setEnabled(myList.isEnabled());
myTextLabel.setBorder(IdeBorderFactory.createEmptyBorder(3, 3, 3, 3));
}
};
renderer.setBorder(IdeBorderFactory.createEmptyBorder(2, 2, 2, 2));
myList.setCellRenderer(renderer);
myList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@@ -103,6 +139,13 @@ public class ProjectTemplateList extends JPanel {
return (ProjectTemplate)myList.getSelectedValue();
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
myList.setEnabled(enabled);
myDescriptionPane.setEnabled(enabled);
}
void restoreSelection() {
final String templateName = PropertiesComponent.getInstance().getValue(PROJECT_WIZARD_TEMPLATE);
if (templateName != null && myList.getModel() instanceof CollectionListModel) {
@@ -218,7 +218,7 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable {
else {
TemplatesGroup group = new TemplatesGroup(builder);
groupMap.put(group.getName(), group);
myTemplatesMap.put(group, new ArrayList<ProjectTemplate>(Arrays.asList(template)));
myTemplatesMap.put(group, new ArrayList<ProjectTemplate>());
}
}
@@ -226,7 +226,7 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable {
myTemplatesMap.putAllValues(map);
for (ProjectCategory category : ProjectCategory.EXTENSION_POINT_NAME.getExtensions()) {
myTemplatesMap.put(new TemplatesGroup(category), new ArrayList<ProjectTemplate>(Arrays.asList(new ProjectCategoryTemplate(category))));
myTemplatesMap.put(new TemplatesGroup(category), new ArrayList<ProjectTemplate>());
}
if (context.isCreatingNewProject()) {
@@ -391,28 +391,21 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable {
return (TemplatesGroup)myProjectTypeList.getSelectedValue();
}
@Nullable
public ProjectTemplate getSelectedTemplate() {
TemplatesGroup group = getSelectedGroup();
if (group == null) return null;
if (myCurrentCard == Cards.TEMPLATES) {
return myTemplatesList.getSelectedTemplate();
}
Collection<ProjectTemplate> templates = myTemplatesMap.get(group);
if (!templates.isEmpty()) return templates.iterator().next();
final ModuleBuilder builder = group.getModuleBuilder();
Map.Entry<ProjectTemplate, ModuleBuilder> entry =
ContainerUtil.find(myBuilders.entrySet(), new Condition<Map.Entry<ProjectTemplate, ModuleBuilder>>() {
@Override
public boolean value(Map.Entry<ProjectTemplate, ModuleBuilder> entry) {
return entry.getValue() == builder;
}
});
return entry == null ? null : entry.getKey();
return myCurrentCard == Cards.TEMPLATES ? myTemplatesList.getSelectedTemplate() : null;
}
private ModuleBuilder getSelectedBuilder() {
ProjectTemplate template = getSelectedTemplate();
return myBuilders.get(template);
if (template != null) {
return myBuilders.get(template);
}
return getSelectedGroup().getModuleBuilder();
}
public Collection<ProjectTemplate> getAvailableTemplates() {
return myCurrentCard != Cards.FRAMEWORKS ? Collections.<ProjectTemplate>emptyList() : myTemplatesMap.get(getSelectedGroup());
}
public void onWizardFinished() throws CommitStepException {
@@ -462,7 +455,7 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable {
for (int i = 0; i < model.getSize(); i++) {
if (group.equals(((TemplatesGroup)model.getElementAt(i)).getName())) {
myProjectTypeList.setSelectedIndex(i);
if (name == null) return getSelectedTemplate().getName().equals(group);
if (name == null) return getSelectedGroup().getName().equals(group);
return myTemplatesList.setSelectedTemplate(name);
}
}
@@ -532,8 +525,11 @@ public class ProjectTypeStep extends ModuleWizardStep implements Disposable {
ProjectTemplate template = getSelectedTemplate();
if (template != null) {
myContext.setProjectTemplate(template);
ModuleBuilder builder = myBuilders.get(template);
myContext.setProjectBuilder(builder);
}
ModuleBuilder builder = getSelectedBuilder();
myContext.setProjectBuilder(builder);
if (builder != null) {
myWizard.getSequence().setType(builder.getBuilderId());
}
}
@@ -23,7 +23,6 @@ import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.platform.ProjectTemplate;
import com.intellij.projectImport.ProjectImportProvider;
import com.intellij.testFramework.PlatformTestCase;
import com.intellij.util.Consumer;
@@ -91,8 +90,6 @@ public abstract class ProjectWizardTestCase<T extends AbstractProjectWizard> ext
if (!condition) {
throw new IllegalArgumentException(group + "/" + name + " template not found");
}
ProjectTemplate template = step.getSelectedTemplate();
assertNotNull(template);
if (adjuster != null) {
adjuster.consume(step);
@@ -172,6 +172,7 @@ public class WizardContext extends UserDataHolderBase {
public void setProjectTemplate(ProjectTemplate projectTemplate) {
myProjectTemplate = projectTemplate;
setProjectBuilder(projectTemplate.createModuleBuilder());
}
public String getPresentationName() {
@@ -17,7 +17,6 @@ package org.jetbrains.idea.devkit;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.projectWizard.NewProjectWizardTestCase;
import com.intellij.openapi.module.JavaModuleType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
@@ -26,7 +25,6 @@ import org.jetbrains.idea.devkit.projectRoots.IdeaJdk;
/**
* @author Dmitry Avdeev
* Date: 11/8/12
*/
public class PluginProjectWizardTest extends NewProjectWizardTestCase {
@@ -40,7 +38,7 @@ public class PluginProjectWizardTest extends NewProjectWizardTestCase {
public void testProjectWithoutSdk() throws Exception {
try {
createProjectFromTemplate(JavaModuleType.JAVA_GROUP, PluginModuleType.getInstance().getName(), null);
createProjectFromTemplate(PluginModuleType.getInstance().getName(), null, null);
fail("Exception should be thrown");
}
catch (Exception e) {
@@ -23,7 +23,6 @@ import com.intellij.util.Consumer;
/**
* @author Dmitry Avdeev
* Date: 18.10.13
*/
public class GradleProjectWizardTest extends NewProjectWizardTestCase {
@@ -32,7 +31,7 @@ public class GradleProjectWizardTest extends NewProjectWizardTestCase {
@Override
public void consume(Step step) {
if (step instanceof ProjectTypeStep) {
assertTrue(((ProjectTypeStep)step).setSelectedTemplate("Java", "Gradle"));
assertTrue(((ProjectTypeStep)step).setSelectedTemplate("Gradle", null));
}
}
});