diff --git a/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java b/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java index b8b6f3babe1d..b6985209d17b 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java @@ -15,6 +15,7 @@ */ package com.intellij.ide.actions; +import com.intellij.ide.impl.NewProjectUtil; import com.intellij.ide.util.newProjectWizard.AddModuleWizard; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -24,16 +25,18 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileChooser.FileChooserDialog; import com.intellij.openapi.fileChooser.FileChooserFactory; import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ui.configuration.actions.NewModuleAction; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.projectImport.ProjectImportBuilder; import com.intellij.projectImport.ProjectImportProvider; import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.awt.*; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -46,9 +49,54 @@ public class ImportModuleAction extends AnAction { @Override public void actionPerformed(AnActionEvent e) { final Project project = getEventProject(e); + doImport(project); + } + + public static List doImport(Project project) { + AddModuleWizard wizard = selectFileAndCreateWizard(project, null); + if (wizard == null) { + return Collections.emptyList(); + } + if (wizard.getStepCount() > 0 && !wizard.showAndGet()) return Collections.emptyList(); + + return createFromWizard(project, wizard); + } + + public static List createFromWizard(Project project, AddModuleWizard wizard) { + if (wizard.getStepCount() > 0) { + if (project != null) { + Module module = new NewModuleAction().createModuleFromWizard(project, null, wizard); + return Collections.singletonList(module); + } + else { + Project newProject = NewProjectUtil.createFromWizard(wizard, project); + return newProject == null ? Collections.emptyList() : Arrays.asList(ModuleManager.getInstance(newProject).getModules()); + } + } + else { + return wizard.getProjectBuilder().commit(project); + } + } + + @Nullable + public static AddModuleWizard selectFileAndCreateWizard(final Project project, Component dialogParent) { FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor(); descriptor.setTitle("Select File or Directory to Import"); ProjectImportProvider[] providers = ProjectImportProvider.PROJECT_IMPORT_PROVIDER.getExtensions(); + String description = getDescription(project, providers); + descriptor.setDescription(description); + + FileChooserDialog chooser = FileChooserFactory.getInstance().createFileChooser(descriptor, project, dialogParent); + VirtualFile[] files = chooser.choose(null, project); + if (files.length == 0) { + return null; + } + + final VirtualFile file = files[0]; + return createImportWizard(project, dialogParent, file, providers); + } + + private static String getDescription(final Project project, ProjectImportProvider[] providers) { List list = ContainerUtil.filter(providers, new Condition() { @Override public boolean value(ProjectImportProvider provider) { @@ -78,18 +126,13 @@ public class ImportModuleAction extends AnAction { builder.append(" or"); } builder.append(" directory with existing sources to be imported."); - descriptor.setDescription(builder.toString()); - - FileChooserDialog chooser = FileChooserFactory.getInstance().createFileChooser(descriptor, project, null); - VirtualFile[] files = chooser.choose(null, project); - if (files.length > 0) { - final VirtualFile file = files[0]; - doImport(project, file); - } + return builder.toString(); } - public List doImport(final Project project, @NotNull final VirtualFile file) { - ProjectImportProvider[] providers = ProjectImportProvider.PROJECT_IMPORT_PROVIDER.getExtensions(); + public static AddModuleWizard createImportWizard(final Project project, + Component dialogParent, + final VirtualFile file, + ProjectImportProvider... providers) { List available = ContainerUtil.filter(providers, new Condition() { @Override public boolean value(ProjectImportProvider provider) { @@ -98,7 +141,7 @@ public class ImportModuleAction extends AnAction { }); if (available.isEmpty()) { Messages.showInfoMessage(project, "Cannot import anything from " + file.getPath(), "Cannot Import"); - return Collections.emptyList(); + return null; } String path; @@ -109,33 +152,11 @@ public class ImportModuleAction extends AnAction { path = ProjectImportProvider.getDefaultPath(file); } - AddModuleWizard wizard = createWizard(project, available, path); - if (wizard.getStepCount() > 0) { - if (processWizard(wizard)) { - return createFromWizard(project, wizard); - } - return Collections.emptyList(); - } - else { - ProjectImportBuilder builder = available.get(0).getBuilder(); - builder.setFileToImport(file.getPath()); - return builder.commit(project); - } + ProjectImportProvider[] availableProviders = available.toArray(new ProjectImportProvider[available.size()]); + + return dialogParent == null ? new AddModuleWizard(project, path, availableProviders) : new AddModuleWizard(project, dialogParent, path, availableProviders); } - protected boolean processWizard(AddModuleWizard wizard) { - return wizard.showAndGet(); - } - - protected AddModuleWizard createWizard(Project project, List available, String path) { - return new AddModuleWizard(project, path, available.toArray(new ProjectImportProvider[available.size()])); - } - - - public List createFromWizard(Project project, AddModuleWizard wizard) { - Module module = new NewModuleAction().createModuleFromWizard(project, null, wizard); - return Collections.singletonList(module); - } @Override public void update(AnActionEvent e) { diff --git a/java/idea-ui/src/com/intellij/ide/actions/ImportProjectAction.java b/java/idea-ui/src/com/intellij/ide/actions/ImportProjectAction.java index e9305cdc25c1..2151bea8b9f5 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/ImportProjectAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/ImportProjectAction.java @@ -15,18 +15,7 @@ */ package com.intellij.ide.actions; -import com.intellij.ide.impl.NewProjectUtil; -import com.intellij.ide.util.newProjectWizard.AddModuleWizard; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; /** * @author Dmitry Avdeev @@ -34,15 +23,10 @@ import java.util.List; */ public class ImportProjectAction extends ImportModuleAction { - @Override - public List doImport(Project project, @NotNull VirtualFile file) { - return super.doImport(null, file); - } @Override - public List createFromWizard(Project project, AddModuleWizard wizard) { - Project newProject = NewProjectUtil.createFromWizard(wizard, project); - return newProject == null ? Collections.emptyList() : Arrays.asList(ModuleManager.getInstance(newProject).getModules()); + public void actionPerformed(AnActionEvent e) { + doImport(null); } @Override diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java index e008472c2194..f06585b0ac3c 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/AddModuleWizard.java @@ -51,12 +51,14 @@ import com.intellij.util.Function; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import javax.swing.*; import java.awt.*; import java.io.File; -public class AddModuleWizard extends AbstractWizard { +public class AddModuleWizard extends AbstractWizard +{ private static final String ADD_MODULE_TITLE = IdeBundle.message("title.add.module"); private static final String NEW_PROJECT_TITLE = IdeBundle.message("title.new.project"); private final Project myCurrentProject; @@ -94,6 +96,15 @@ public class AddModuleWizard extends AbstractWizard { initModuleWizard(project, filePath); } + /** Import mode */ + public AddModuleWizard(Project project, Component dialogParent, String filePath, ProjectImportProvider... importProviders) { + super(getImportWizardTitle(project, importProviders), dialogParent); + myCurrentProject = project; + myImportProviders = importProviders; + myModulesProvider = DefaultModulesProvider.createForProject(project); + initModuleWizard(project, filePath); + } + private static String getImportWizardTitle(Project project, ProjectImportProvider... providers) { StringBuilder builder = new StringBuilder("Import "); builder.append(project == null ? "Project" : "Module"); @@ -384,4 +395,23 @@ public class AddModuleWizard extends AbstractWizard { } return false; } + + public ProjectImportProvider[] getImportProviders() { + return myImportProviders; + } + + @TestOnly + public void doOk() { + doOKAction(); + } + + @TestOnly + public boolean isLast() { + return isLastStep(); + } + + @TestOnly + public void commit() { + commitStepData(getCurrentStepObject()); + } } diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/ModuleImportProvider.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/ModuleImportProvider.java index ada93d0633d8..b1790775ab35 100644 --- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/ModuleImportProvider.java +++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/ModuleImportProvider.java @@ -35,6 +35,11 @@ public class ModuleImportProvider extends ProjectImportProvider { return project != null && !fileOrDirectory.isDirectory() && "iml".equals(fileOrDirectory.getExtension()); } + @Override + public String getPathToBeImported(VirtualFile file) { + return file.getPath(); + } + @Override public boolean canCreateNewProject() { return false; diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java index b76c23491cb8..89c6617d8404 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java @@ -20,6 +20,7 @@ import com.intellij.facet.Facet; import com.intellij.facet.FacetModel; import com.intellij.facet.impl.ProjectFacetsConfigurator; import com.intellij.facet.impl.ui.FacetEditorImpl; +import com.intellij.ide.actions.ImportModuleAction; import com.intellij.ide.util.newProjectWizard.AddModuleWizard; import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.ide.util.projectWizard.ProjectBuilder; @@ -359,9 +360,9 @@ public class ModulesConfigurator implements ModulesProvider, ModuleEditor.Change @Nullable - public List addModule(Component parent) { + public List addModule(Component parent, boolean anImport) { if (myProject.isDefault()) return null; - final ProjectBuilder builder = runModuleWizard(parent); + final ProjectBuilder builder = runModuleWizard(parent, anImport); if (builder != null ) { final List modules = new ArrayList(); final List commitedModules; @@ -428,8 +429,16 @@ public class ModulesConfigurator implements ModulesProvider, ModuleEditor.Change } @Nullable - ProjectBuilder runModuleWizard(Component dialogParent) { - AddModuleWizard wizard = new AddModuleWizard(dialogParent, myProject, this); + ProjectBuilder runModuleWizard(Component dialogParent, boolean anImport) { + AddModuleWizard wizard; + if (anImport) { + wizard = ImportModuleAction.selectFileAndCreateWizard(myProject, dialogParent); + if (wizard == null) return null; + if (wizard.getStepCount() == 0) return wizard.getProjectBuilder(); + } + else { + wizard = new AddModuleWizard(dialogParent, myProject, this); + } wizard.show(); if (wizard.isOK()) { final ProjectBuilder builder = wizard.getProjectBuilder(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java index e58fec88ae67..0ba8d7d38b51 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java @@ -555,8 +555,8 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple return myContext.myModulesConfigurator.getFacetsConfigurator(); } - private void addModule() { - final List modules = myContext.myModulesConfigurator.addModule(myTree); + private void addModule(boolean anImport) { + final List modules = myContext.myModulesConfigurator.addModule(myTree, anImport); if (modules != null) { for (Module module : modules) { addModuleNode(module); @@ -782,10 +782,17 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple @Override @NotNull public AnAction[] getChildren(@Nullable final AnActionEvent e) { - AnAction module = new AddModuleAction(); ArrayList result = new ArrayList(); - result.add(module); + + AnAction addModuleAction = new AddModuleAction(false); + addModuleAction.getTemplatePresentation().setText("New Module"); + result.add(addModuleAction); + + AnAction importModuleAction = new AddModuleAction(true); + importModuleAction.getTemplatePresentation().setText("Import Module"); + importModuleAction.getTemplatePresentation().setIcon(AllIcons.ToolbarDecorator.Import); + result.add(importModuleAction); final Collection actions = AddFacetToModuleAction.createAddFrameworkActions(myFacetEditorFacade, myProject); if (!actions.isEmpty()) { @@ -970,13 +977,17 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple } private class AddModuleAction extends AnAction implements DumbAware { - public AddModuleAction() { + + private final boolean myImport; + + public AddModuleAction(boolean anImport) { super(ProjectBundle.message("add.new.module.text.full"), null, AllIcons.Actions.Module); + myImport = anImport; } @Override public void actionPerformed(final AnActionEvent e) { - addModule(); + addModule(myImport); } } diff --git a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java index 7a666a8b40ed..452204aba267 100644 --- a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java +++ b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java @@ -1,7 +1,6 @@ package com.intellij.ide.projectWizard; import com.intellij.ide.actions.ImportModuleAction; -import com.intellij.ide.actions.ImportProjectAction; import com.intellij.ide.impl.NewProjectUtil; import com.intellij.ide.util.newProjectWizard.AddModuleWizard; import com.intellij.ide.util.newProjectWizard.SelectTemplateStep; @@ -38,7 +37,7 @@ import java.util.List; public abstract class ProjectWizardTestCase extends PlatformTestCase { protected final List mySdks = new ArrayList(); - protected TestWizard myWizard; + protected AddModuleWizard myWizard; @Nullable private Project myCreatedProject; @@ -95,7 +94,7 @@ public abstract class ProjectWizardTestCase extends PlatformTestCase { protected void createWizard(Project project) throws IOException { File directory = FileUtil.createTempDirectory(getName(), "new", false); myFilesToDelete.add(directory); - myWizard = new TestWizard(project, directory.getPath()); + myWizard = new AddModuleWizard(project, DefaultModulesProvider.createForProject(project), directory.getPath()); UIUtil.dispatchAllInvocationEvents(); // to make default selection applied } @@ -149,50 +148,12 @@ public abstract class ProjectWizardTestCase extends PlatformTestCase { VirtualFile file = LocalFileSystem.getInstance().refreshAndFindFileByPath(path); assertNotNull("Can't find " + path, file); assertTrue(providers[0].canImport(file, project)); - ImportModuleAction action = new ImportModuleAction() { - @Override - protected AddModuleWizard createWizard(Project project, List available, String path) { - myWizard = new TestWizard(project, path, providers); - return myWizard; - } - @Override - protected boolean processWizard(AddModuleWizard wizard) { - runWizard(null); - return true; - } - - @Override - public List createFromWizard(Project project, AddModuleWizard wizard) { - return project == null ? new ImportProjectAction().createFromWizard(project, wizard) : super.createFromWizard(project, wizard); - } - }; - - List modules = action.doImport(project, file); + myWizard = ImportModuleAction.createImportWizard(project, null, file, providers); + if (myWizard.getStepCount() > 0) { + runWizard(null); + } + List modules = ImportModuleAction.createFromWizard(project, myWizard); return modules == null || modules.isEmpty() ? null : modules.get(0); } - - protected static class TestWizard extends AddModuleWizard { - - public TestWizard(@Nullable Project project, String defaultPath) { - super(project, DefaultModulesProvider.createForProject(project), defaultPath); - } - - public TestWizard(Project project, String filePath, ProjectImportProvider... importProvider) { - super(project, filePath, importProvider); - } - - void doOk() { - doOKAction(); - } - - boolean isLast() { - return isLastStep(); - } - - void commit() { - commitStepData(getCurrentStepObject()); - } - } - } diff --git a/platform/projectModel-impl/src/messages/ProjectBundle.properties b/platform/projectModel-impl/src/messages/ProjectBundle.properties index d04d18e7b436..251af86d9723 100644 --- a/platform/projectModel-impl/src/messages/ProjectBundle.properties +++ b/platform/projectModel-impl/src/messages/ProjectBundle.properties @@ -327,7 +327,7 @@ project.roots.library.problem.message=invalid item ''{0}'' in the dependencies l project.roots.project.display.name=Project sdk.configuration.exception=SDK ''{0}'' is invalid. project.roots.project.jdk.inherited=Project SDK -add.new.header.text=New +add.new.header.text=Add add.new.module.text.full=Module project.roots.replace.library.entry.message=Do you really want to replace old library ''{0}'' project.roots.replace.library.entry.title=Library already added