From ec255435497d535aa52fe120108c61d142f027b2 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 30 Jan 2014 16:27:30 +0400 Subject: [PATCH] ChooseTemplateStep --- .../ide/projectWizard/ChooseTemplateStep.form | 46 +++++++++++ .../ide/projectWizard/ChooseTemplateStep.java | 80 +++++++++++++++++++ .../ide/projectWizard/NewProjectWizard.java | 5 +- .../projectWizard/ProjectTemplateList.java | 55 +++++++++++-- .../ide/projectWizard/ProjectTypeStep.java | 40 +++++----- .../projectWizard/ProjectWizardTestCase.java | 3 - .../ide/util/projectWizard/WizardContext.java | 1 + .../testSources/PluginProjectWizardTest.java | 4 +- .../gradle/GradleProjectWizardTest.java | 3 +- 9 files changed, 199 insertions(+), 38 deletions(-) create mode 100644 java/idea-ui/src/com/intellij/ide/projectWizard/ChooseTemplateStep.form create mode 100644 java/idea-ui/src/com/intellij/ide/projectWizard/ChooseTemplateStep.java diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ChooseTemplateStep.form b/java/idea-ui/src/com/intellij/ide/projectWizard/ChooseTemplateStep.form new file mode 100644 index 000000000000..10c9cc5bb1c6 --- /dev/null +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ChooseTemplateStep.form @@ -0,0 +1,46 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ChooseTemplateStep.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ChooseTemplateStep.java new file mode 100644 index 000000000000..0c2dd3c56b01 --- /dev/null +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ChooseTemplateStep.java @@ -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(myProjectTypeStep.getAvailableTemplates()), false); + } + + @Override + public void updateDataModel() { + if (myFromTemplateButton.isSelected()) { + myWizardContext.setProjectTemplate(myTemplateList.getSelectedTemplate()); + } + } +} diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java b/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java index b0b58451370a..5d231defec59 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/NewProjectWizard.java @@ -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); diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTemplateList.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTemplateList.java index c8de4747afc6..7c76028d1a05 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTemplateList.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTemplateList.java @@ -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 renderer = new ColoredListCellRenderer() { + GroupedItemsListRenderer renderer = new GroupedItemsListRenderer(new ListItemDescriptor() { + @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) { 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 0847d666242b..2623a035f96d 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java @@ -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(Arrays.asList(template))); + myTemplatesMap.put(group, new ArrayList()); } } @@ -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(Arrays.asList(new ProjectCategoryTemplate(category)))); + myTemplatesMap.put(new TemplatesGroup(category), new ArrayList()); } 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 templates = myTemplatesMap.get(group); - if (!templates.isEmpty()) return templates.iterator().next(); - final ModuleBuilder builder = group.getModuleBuilder(); - Map.Entry entry = - ContainerUtil.find(myBuilders.entrySet(), new Condition>() { - @Override - public boolean value(Map.Entry 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 getAvailableTemplates() { + return myCurrentCard != Cards.FRAMEWORKS ? Collections.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()); } } diff --git a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java index f4e5439c1bb7..d328f5a22b9f 100644 --- a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java +++ b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java @@ -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 ext if (!condition) { throw new IllegalArgumentException(group + "/" + name + " template not found"); } - ProjectTemplate template = step.getSelectedTemplate(); - assertNotNull(template); if (adjuster != null) { adjuster.consume(step); diff --git a/platform/lang-api/src/com/intellij/ide/util/projectWizard/WizardContext.java b/platform/lang-api/src/com/intellij/ide/util/projectWizard/WizardContext.java index 67513572535a..041548726188 100644 --- a/platform/lang-api/src/com/intellij/ide/util/projectWizard/WizardContext.java +++ b/platform/lang-api/src/com/intellij/ide/util/projectWizard/WizardContext.java @@ -172,6 +172,7 @@ public class WizardContext extends UserDataHolderBase { public void setProjectTemplate(ProjectTemplate projectTemplate) { myProjectTemplate = projectTemplate; + setProjectBuilder(projectTemplate.createModuleBuilder()); } public String getPresentationName() { diff --git a/plugins/devkit/testSources/PluginProjectWizardTest.java b/plugins/devkit/testSources/PluginProjectWizardTest.java index db291d297c46..1b6dd25aacbd 100644 --- a/plugins/devkit/testSources/PluginProjectWizardTest.java +++ b/plugins/devkit/testSources/PluginProjectWizardTest.java @@ -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) { diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/GradleProjectWizardTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/GradleProjectWizardTest.java index 0216997843c0..9219717462d8 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/GradleProjectWizardTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/GradleProjectWizardTest.java @@ -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)); } } });