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));
}
}
});