IDEA-94956 Add "Import module" option to project settings

This commit is contained in:
Dmitry Avdeev
2012-11-16 09:56:38 +04:00
parent 6b04b1741f
commit 7b319d8604
8 changed files with 135 additions and 114 deletions
@@ -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<Module> 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<Module> 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.<Module>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<ProjectImportProvider> list = ContainerUtil.filter(providers, new Condition<ProjectImportProvider>() {
@Override
public boolean value(ProjectImportProvider provider) {
@@ -78,18 +126,13 @@ public class ImportModuleAction extends AnAction {
builder.append(" or");
}
builder.append(" directory with <b>existing sources</b> to be imported.</html>");
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<Module> 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<ProjectImportProvider> available = ContainerUtil.filter(providers, new Condition<ProjectImportProvider>() {
@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<ProjectImportProvider> available, String path) {
return new AddModuleWizard(project, path, available.toArray(new ProjectImportProvider[available.size()]));
}
public List<Module> createFromWizard(Project project, AddModuleWizard wizard) {
Module module = new NewModuleAction().createModuleFromWizard(project, null, wizard);
return Collections.singletonList(module);
}
@Override
public void update(AnActionEvent e) {
@@ -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<Module> doImport(Project project, @NotNull VirtualFile file) {
return super.doImport(null, file);
}
@Override
public List<Module> createFromWizard(Project project, AddModuleWizard wizard) {
Project newProject = NewProjectUtil.createFromWizard(wizard, project);
return newProject == null ? Collections.<Module>emptyList() : Arrays.asList(ModuleManager.getInstance(newProject).getModules());
public void actionPerformed(AnActionEvent e) {
doImport(null);
}
@Override
@@ -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<ModuleWizardStep> {
public class AddModuleWizard extends AbstractWizard<ModuleWizardStep>
{
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<ModuleWizardStep> {
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<ModuleWizardStep> {
}
return false;
}
public ProjectImportProvider[] getImportProviders() {
return myImportProviders;
}
@TestOnly
public void doOk() {
doOKAction();
}
@TestOnly
public boolean isLast() {
return isLastStep();
}
@TestOnly
public void commit() {
commitStepData(getCurrentStepObject());
}
}
@@ -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;
@@ -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<Module> addModule(Component parent) {
public List<Module> 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<Module> modules = new ArrayList<Module>();
final List<Module> 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();
@@ -555,8 +555,8 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple
return myContext.myModulesConfigurator.getFacetsConfigurator();
}
private void addModule() {
final List<Module> modules = myContext.myModulesConfigurator.addModule(myTree);
private void addModule(boolean anImport) {
final List<Module> 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<AnAction> result = new ArrayList<AnAction>();
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<AnAction> 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);
}
}
@@ -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<Sdk> mySdks = new ArrayList<Sdk>();
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<ProjectImportProvider> available, String path) {
myWizard = new TestWizard(project, path, providers);
return myWizard;
}
@Override
protected boolean processWizard(AddModuleWizard wizard) {
runWizard(null);
return true;
}
@Override
public List<Module> createFromWizard(Project project, AddModuleWizard wizard) {
return project == null ? new ImportProjectAction().createFromWizard(project, wizard) : super.createFromWizard(project, wizard);
}
};
List<Module> modules = action.doImport(project, file);
myWizard = ImportModuleAction.createImportWizard(project, null, file, providers);
if (myWizard.getStepCount() > 0) {
runWizard(null);
}
List<Module> 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());
}
}
}
@@ -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