Project Templates: initial

This commit is contained in:
Dmitry Avdeev
2012-09-27 19:25:52 +04:00
parent 1fd7f5029c
commit 504dfce60e
8 changed files with 328 additions and 13 deletions
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.ide.util.newProjectWizard.SelectTemplateStep">
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="2" column-count="3" 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="470" height="400"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<grid id="ac540" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="8" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="3580d" class="com.intellij.ui.SearchTextField" binding="mySearchField">
<constraints border-constraint="North"/>
<properties/>
</component>
<scrollpane id="474de" class="com.intellij.ui.components.JBScrollPane">
<constraints border-constraint="Center"/>
<properties/>
<border type="none"/>
<children>
<component id="9dad" class="com.intellij.ui.components.JBList" binding="myTemplatesList">
<constraints/>
<properties/>
</component>
</children>
</scrollpane>
</children>
</grid>
<grid id="caf4" binding="mySettingsPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children/>
</grid>
<hspacer id="fc0b6">
<constraints>
<grid row="1" column="2" 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="dafde" class="com.intellij.ui.components.JBLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Please select desired template from the list"/>
</properties>
</component>
</children>
</grid>
</form>
@@ -0,0 +1,134 @@
/*
* Copyright 2000-2012 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.util.newProjectWizard;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.openapi.util.Condition;
import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.platform.WebProjectGenerator;
import com.intellij.psi.codeStyle.MinusculeMatcher;
import com.intellij.psi.codeStyle.NameUtil;
import com.intellij.ui.CollectionListModel;
import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.SearchTextField;
import com.intellij.ui.components.JBList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FactoryMap;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.util.List;
/**
* @author Dmitry Avdeev
* Date: 9/26/12
*/
public class SelectTemplateStep extends ModuleWizardStep {
private JPanel myPanel;
private JBList myTemplatesList;
private JPanel mySettingsPanel;
private SearchTextField mySearchField;
private FactoryMap<WebProjectGenerator, WebProjectGenerator.GeneratorPeer> myPeers = new FactoryMap<WebProjectGenerator, WebProjectGenerator.GeneratorPeer>() {
@Nullable
@Override
protected WebProjectGenerator.GeneratorPeer create(WebProjectGenerator key) {
return key.createPeer();
}
};
public SelectTemplateStep() {
final DirectoryProjectGenerator[] extensions = DirectoryProjectGenerator.EP_NAME.getExtensions();
myTemplatesList.setModel(new CollectionListModel<DirectoryProjectGenerator>(extensions));
myTemplatesList.setCellRenderer(new ColoredListCellRenderer() {
@Override
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
append(((DirectoryProjectGenerator)value).getName());
}
});
myTemplatesList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (mySettingsPanel.getComponentCount() > 0) {
mySettingsPanel.remove(0);
}
DirectoryProjectGenerator generator = getSelectedGenerator();
if (generator instanceof WebProjectGenerator) {
WebProjectGenerator.GeneratorPeer peer = myPeers.get(generator);
mySettingsPanel.add(peer.getComponent(), BorderLayout.NORTH);
}
mySettingsPanel.revalidate();
}
});
if (myTemplatesList.getModel().getSize() > 0) {
myTemplatesList.setSelectedIndex(0);
}
mySearchField.addDocumentListener(new DocumentAdapter() {
@Override
protected void textChanged(DocumentEvent e) {
final MinusculeMatcher matcher = NameUtil.buildMatcher(mySearchField.getText(), NameUtil.MatchingCaseSensitivity.NONE);
DirectoryProjectGenerator generator = getSelectedGenerator();
List<DirectoryProjectGenerator> list = ContainerUtil.filter(extensions, new Condition<DirectoryProjectGenerator>() {
@Override
public boolean value(DirectoryProjectGenerator generator) {
String name = generator.getName();
String[] words = NameUtil.nameToWords(name);
for (String word : words) {
if (matcher.matches(word)) return true;
}
return false;
}
});
myTemplatesList.setModel(new CollectionListModel<DirectoryProjectGenerator>(list));
if (!list.isEmpty()) {
if (list.contains(generator)) {
myTemplatesList.setSelectedValue(generator, true);
}
else {
myTemplatesList.setSelectedIndex(0);
}
}
}
});
}
public DirectoryProjectGenerator getSelectedGenerator() {
return (DirectoryProjectGenerator)myTemplatesList.getSelectedValue();
}
public WebProjectGenerator.GeneratorPeer getPeer(DirectoryProjectGenerator generator) {
return myPeers.get(generator);
}
@Override
public JComponent getComponent() {
return myPanel;
}
@Override
public JComponent getPreferredFocusedComponent() {
return mySearchField;
}
@Override
public void updateDataModel() {
}
}
@@ -36,6 +36,10 @@ public class StepSequence {
@NonNls private List<String> myTypes = new ArrayList<String>();
private List<ModuleWizardStep> mySelectedSteps;
public StepSequence(ModuleWizardStep... commonSteps) {
myCommonSteps.addAll(Arrays.asList(commonSteps));
}
public void addCommonStep(@NotNull ModuleWizardStep step){
myCommonSteps.add(step);
}
@@ -0,0 +1,89 @@
/*
* Copyright 2000-2012 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.util.newProjectWizard.modes;
import com.intellij.ide.util.newProjectWizard.ProjectNameStep;
import com.intellij.ide.util.newProjectWizard.SelectTemplateStep;
import com.intellij.ide.util.newProjectWizard.StepSequence;
import com.intellij.ide.util.projectWizard.ProjectBuilder;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.WebModuleBuilder;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.platform.WebProjectGenerator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author Dmitry Avdeev
* Date: 9/26/12
*/
public class CreateFromTemplateMode extends WizardMode {
private final SelectTemplateStep mySelectTemplateStep = new SelectTemplateStep();
@NotNull
@Override
public String getDisplayName(WizardContext context) {
return ProjectBundle.message("project.new.wizard.from.template.title", context.getPresentationName());
}
@NotNull
@Override
public String getDescription(WizardContext context) {
return ProjectBundle.message("project.new.wizard.from.template.description", context.getPresentationName());
}
@Override
public boolean isAvailable(WizardContext context) {
return true;
}
@Nullable
@Override
protected StepSequence createSteps(WizardContext context, @NotNull ModulesProvider modulesProvider) {
return new StepSequence(mySelectTemplateStep, new ProjectNameStep(context, this));
}
@Nullable
@Override
public ProjectBuilder getModuleBuilder() {
return new WebModuleBuilder() {
@Nullable
@Override
public List<Module> commit(Project project, ModifiableModuleModel model, ModulesProvider modulesProvider) {
List<Module> modules = super.commit(project, model, modulesProvider);
if (modules != null && modules.size() == 1) {
Module module = modules.get(0);
DirectoryProjectGenerator generator = mySelectTemplateStep.getSelectedGenerator();
WebProjectGenerator.GeneratorPeer peer = mySelectTemplateStep.getPeer(generator);
generator.generateProject(project, project.getBaseDir(), peer.getSettings(), module);
}
return modules;
}
};
}
@Override
public void onChosen(boolean enabled) {
}
}
@@ -0,0 +1,36 @@
/*
* Copyright 2000-2012 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.openapi.module;
import com.intellij.ide.util.projectWizard.ModuleBuilder;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.roots.ModifiableRootModel;
/**
* @author Dmitry Avdeev
* Date: 9/27/12
*/
public class WebModuleBuilder extends ModuleBuilder {
@Override
public void setupRootModel(ModifiableRootModel modifiableRootModel) throws ConfigurationException {
doAddContentEntry(modifiableRootModel);
}
@Override
public ModuleType getModuleType() {
return WebModuleType.getInstance();
}
}
@@ -4,8 +4,6 @@ import com.intellij.ide.util.projectWizard.ModuleBuilder;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.ide.util.projectWizard.WebModuleGenerationStep;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import org.jetbrains.annotations.NotNull;
@@ -29,16 +27,6 @@ public class WebModuleType extends WebModuleTypeBase<ModuleBuilder> {
}
public ModuleBuilder createModuleBuilder() {
return new ModuleBuilder() {
@Override
public void setupRootModel(ModifiableRootModel modifiableRootModel) throws ConfigurationException {
doAddContentEntry(modifiableRootModel);
}
@Override
public ModuleType getModuleType() {
return getInstance();
}
};
return new WebModuleBuilder();
}
}
@@ -402,6 +402,9 @@ project.new.wizard.import.title=Import {0} from external &model
project.new.wizard.import.description=<html>Create {0} {1} from external model ({2})</html>
project.new.wizard.from.existent.sources.title=Create {0} from &existing sources
project.new.wizard.from.existent.sources.description=<html>Create {0} {1} structure over existing sources</html>
project.new.wizard.from.template.title=Create {0} from &template
project.new.wizard.from.template.description=<html>Create {0} with pre-defined support for your favourite framework/technology</html>
project.new.wizard.module.name.title=Module na&me:
project.new.wizard.module.root.title=Content &root:
project.new.wizard.module.file.title=Module &file location:
+3
View File
@@ -1310,9 +1310,12 @@
<projectService serviceImplementation="com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable"/>
<projectService serviceInterface="com.intellij.openapi.roots.ui.configuration.ProjectSettingsService"
serviceImplementation="com.intellij.openapi.roots.ui.configuration.IdeaProjectSettingsService"/>
<wizardMode implementation="com.intellij.ide.util.newProjectWizard.modes.CreateFromScratchMode" id="CreateFromScratchMode" order="first"/>
<wizardMode implementation="com.intellij.ide.util.newProjectWizard.modes.CreateProjectFromSourcesMode" id="CreateProjectFromSourcesMode" order="after CreateFromScratchMode"/>
<wizardMode implementation="com.intellij.ide.util.newProjectWizard.modes.CreateModuleFromSourcesMode" id="CreateModuleFromSourcesMode" order="after CreateProjectFromSourcesMode"/>
<wizardMode implementation="com.intellij.ide.util.newProjectWizard.modes.CreateFromTemplateMode" id="CreateFromTemplateMode" order="last"/>
<projectStructureDetector implementation="com.intellij.ide.util.projectWizard.importSources.impl.JavaProjectStructureDetector" order="first"/>
<applicationService serviceImplementation="com.intellij.execution.JavaRunConfigurationExtensionManager"/>