diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java index c3397e6cb345..98b69580fc32 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java @@ -181,33 +181,10 @@ public class SelectTemplateStep extends ModuleWizardStep { myTemplatesTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { - if (mySettingsPanel.getComponentCount() > 0) { - mySettingsPanel.remove(0); - } ProjectTemplate template = getSelectedTemplate(); - if (template != null) { - JComponent settingsPanel = template.getSettingsPanel(); - if (settingsPanel != null) { - mySettingsPanel.add(settingsPanel, BorderLayout.NORTH); - } - mySettingsPanel.setVisible(settingsPanel != null); - String description = template.getDescription(); - if (StringUtil.isNotEmpty(description)) { - StringBuilder sb = new StringBuilder("'); - sb.append(description).append(""); - description = sb.toString(); - } - - myDescriptionPane.setText(description); - myDescriptionPanel.setVisible(StringUtil.isNotEmpty(description)); - } - else { - mySettingsPanel.setVisible(false); - myDescriptionPanel.setVisible(false); - } - mySettingsPanel.revalidate(); - mySettingsPanel.repaint(); + setupPanels(template); + mySequence.setType(template == null ? null : template.createModuleBuilder().getBuilderId()); + myContext.requestWizardButtonsUpdate(); } }); @@ -223,13 +200,6 @@ public class SelectTemplateStep extends ModuleWizardStep { myDescriptionPanel.setVisible(false); mySettingsPanel.setVisible(false); - TreeState state = SelectTemplateSettings.getInstance().getTreeState(); - if (state != null) { - state.applyTo(myTemplatesTree, (DefaultMutableTreeNode)myTemplatesTree.getModel().getRoot()); - } - else { - myBuilder.expandAll(null); - } new AnAction() { @Override @@ -248,6 +218,49 @@ public class SelectTemplateStep extends ModuleWizardStep { } } }.registerCustomShortcutSet(new CustomShortcutSet(KeyEvent.VK_UP, KeyEvent.VK_DOWN), mySearchField); + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + TreeState state = SelectTemplateSettings.getInstance().getTreeState(); + if (state != null) { + state.applyTo(myTemplatesTree, (DefaultMutableTreeNode)myTemplatesTree.getModel().getRoot()); + } + else { + myBuilder.expandAll(null); + } + } + }); + + } + + private void setupPanels(@Nullable ProjectTemplate template) { + if (mySettingsPanel.getComponentCount() > 0) { + mySettingsPanel.remove(0); + } + if (template != null) { + JComponent settingsPanel = template.getSettingsPanel(); + if (settingsPanel != null) { + mySettingsPanel.add(settingsPanel, BorderLayout.NORTH); + } + mySettingsPanel.setVisible(settingsPanel != null); + String description = template.getDescription(); + if (StringUtil.isNotEmpty(description)) { + StringBuilder sb = new StringBuilder("'); + sb.append(description).append(""); + description = sb.toString(); + } + + myDescriptionPane.setText(description); + myDescriptionPanel.setVisible(StringUtil.isNotEmpty(description)); + } + else { + mySettingsPanel.setVisible(false); + myDescriptionPanel.setVisible(false); + } + mySettingsPanel.revalidate(); + mySettingsPanel.repaint(); } @Override diff --git a/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java b/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java index 8e26316e3a52..07608f4d665e 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java +++ b/java/idea-ui/src/com/intellij/platform/templates/ArchivedProjectTemplate.java @@ -15,32 +15,16 @@ */ package com.intellij.platform.templates; -import com.intellij.ide.util.newProjectWizard.modes.ImportImlMode; import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.ide.util.projectWizard.WizardContext; -import com.intellij.openapi.module.ModifiableModuleModel; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleType; -import com.intellij.openapi.module.ModuleWithNameAlreadyExists; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.ui.ValidationInfo; import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.io.StreamUtil; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.newvfs.RefreshQueue; import com.intellij.platform.ProjectTemplate; -import com.intellij.platform.templates.github.ZipUtil; -import com.intellij.util.containers.ContainerUtil; -import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.io.File; import java.io.IOException; import java.net.URL; import java.util.zip.ZipEntry; @@ -74,11 +58,22 @@ public class ArchivedProjectTemplate implements ProjectTemplate { @Override public String getDescription() { + return readEntry(new Condition() { + @Override + public boolean value(ZipEntry entry) { + return entry.getName().endsWith(DESCRIPTION_PATH); + } + }); + } + + @Nullable + String readEntry(Condition condition) { + ZipInputStream stream = null; try { - ZipInputStream stream = getStream(); + stream = getStream(); ZipEntry entry; while ((entry = stream.getNextEntry()) != null) { - if (entry.getName().endsWith(DESCRIPTION_PATH)) { + if (condition.value(entry)) { return StreamUtil.readText(stream); } } @@ -86,58 +81,26 @@ public class ArchivedProjectTemplate implements ProjectTemplate { catch (IOException e) { return null; } + finally { + StreamUtil.closeStream(stream); + } return null; } @NotNull @Override public ModuleBuilder createModuleBuilder() { - return new ModuleBuilder() { - @Override - public void setupRootModel(ModifiableRootModel modifiableRootModel) throws ConfigurationException { - - } - - @Override - public ModuleType getModuleType() { - return null; - } - - @NotNull - @Override - public Module createModule(@NotNull ModifiableModuleModel moduleModel) - throws InvalidDataException, IOException, ModuleWithNameAlreadyExists, JDOMException, ConfigurationException { - final String path = getContentEntryPath(); - String iml; - try { - File dir = new File(path); - ZipInputStream zipInputStream = getStream(); - ZipUtil.unzip(ProgressManager.getInstance().getProgressIndicator(), dir, zipInputStream); - VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir); - iml = ContainerUtil.find(dir.list(), new Condition() { - @Override - public boolean value(String s) { - return s.endsWith(".iml"); - } - }); - new File(path, iml).renameTo(new File(getModuleFilePath())); - RefreshQueue.getInstance().refresh(false, true, null, virtualFile); - } - catch (IOException e) { - throw new RuntimeException(e); - } - return ImportImlMode.setUpLoader(getModuleFilePath()).createModule(moduleModel); - } - }; + return new TemplateModuleBuilder(this); } + @Nullable @Override public ValidationInfo validateSettings() { return null; } - private ZipInputStream getStream() throws IOException { + ZipInputStream getStream() throws IOException { return new ZipInputStream(myArchivePath.openStream()); } diff --git a/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java b/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java new file mode 100644 index 000000000000..b852c890992d --- /dev/null +++ b/java/idea-ui/src/com/intellij/platform/templates/TemplateModuleBuilder.java @@ -0,0 +1,108 @@ +/* + * 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.platform.templates; + +import com.intellij.ide.util.newProjectWizard.modes.ImportImlMode; +import com.intellij.ide.util.projectWizard.ModuleBuilder; +import com.intellij.openapi.module.*; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.JDOMUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.newvfs.RefreshQueue; +import com.intellij.platform.templates.github.ZipUtil; +import com.intellij.util.containers.ContainerUtil; +import org.jdom.Document; +import org.jdom.JDOMException; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** +* @author Dmitry Avdeev +* Date: 10/19/12 +*/ +class TemplateModuleBuilder extends ModuleBuilder { + private final ModuleType myType; + private ArchivedProjectTemplate myTemplate; + + public TemplateModuleBuilder(ArchivedProjectTemplate template) { + myTemplate = template; + myType = computeModuleType(myTemplate); + } + + @NotNull + private static ModuleType computeModuleType(ArchivedProjectTemplate template) { + String iml = template.readEntry(new Condition() { + @Override + public boolean value(ZipEntry entry) { + return entry.getName().endsWith(".iml"); + } + }); + if (iml == null) return ModuleType.EMPTY; + try { + Document document = JDOMUtil.loadDocument(iml); + String type = document.getRootElement().getAttributeValue(Module.ELEMENT_TYPE); + return ModuleTypeManager.getInstance().findByID(type); + } + catch (Exception e) { + return ModuleType.EMPTY; + } + } + + @Override + public void setupRootModel(ModifiableRootModel modifiableRootModel) throws ConfigurationException { + + } + + @Override + public ModuleType getModuleType() { + return myType; + } + + @NotNull + @Override + public Module createModule(@NotNull ModifiableModuleModel moduleModel) + throws InvalidDataException, IOException, ModuleWithNameAlreadyExists, JDOMException, ConfigurationException { + final String path = getContentEntryPath(); + String iml; + try { + File dir = new File(path); + ZipInputStream zipInputStream = myTemplate.getStream(); + ZipUtil.unzip(ProgressManager.getInstance().getProgressIndicator(), dir, zipInputStream); + VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir); + iml = ContainerUtil.find(dir.list(), new Condition() { + @Override + public boolean value(String s) { + return s.endsWith(".iml"); + } + }); + new File(path, iml).renameTo(new File(getModuleFilePath())); + RefreshQueue.getInstance().refresh(false, true, null, virtualFile); + } + catch (IOException e) { + throw new RuntimeException(e); + } + return ImportImlMode.setUpLoader(getModuleFilePath()).createModule(moduleModel); + } +}