mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-94956 Add "Import module" option to project settings
This commit is contained in:
@@ -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;
|
||||
|
||||
+13
-4
@@ -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();
|
||||
|
||||
+17
-6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user