ImportProjectAction: initial

This commit is contained in:
Dmitry Avdeev
2012-11-02 09:56:30 +04:00
parent 114dc89afc
commit 34e59d0676
18 changed files with 349 additions and 30 deletions
@@ -0,0 +1,75 @@
/*
* 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.actions;
import com.intellij.ide.util.newProjectWizard.ImportProjectWizard;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileChooser.FileChooserDialog;
import com.intellij.openapi.fileChooser.FileChooserFactory;
import com.intellij.openapi.project.Project;
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;
/**
* @author Dmitry Avdeev
* Date: 10/31/12
*/
public class ImportProjectAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
final Project project = getEventProject(e);
FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor();
FileChooserDialog chooser = FileChooserFactory.getInstance().createFileChooser(descriptor, project, null);
VirtualFile[] files = chooser.choose(null, project);
if (files.length > 0) {
final VirtualFile file = files[0];
ProjectImportProvider[] providers = ProjectImportProvider.PROJECT_IMPORT_PROVIDER.getExtensions();
ProjectImportProvider provider = ContainerUtil.find(providers, new Condition<ProjectImportProvider>() {
@Override
public boolean value(ProjectImportProvider provider) {
return (project != null || provider.canCreateNewProject()) && provider.isMyFile(file);
}
});
if (provider != null) {
ImportProjectWizard wizard = new ImportProjectWizard(project, provider, file);
if (wizard.getStepCount() > 0) {
boolean b = wizard.showAndGet();
}
else {
ProjectImportBuilder builder = provider.getBuilder();
builder.setFileToImport(file.getPath());
builder.commit(project);
}
}
}
}
@Override
public void update(AnActionEvent e) {
Presentation presentation = e.getPresentation();
presentation.setText(getEventProject(e) == null ? "Import Project..." : "Import Module/Project...");
presentation.setVisible(ApplicationManager.getApplication().isInternal());
}
}
@@ -37,11 +37,13 @@ import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.ui.configuration.DefaultModulesProvider;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.projectImport.ProjectImportProvider;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.util.Function;
import org.jetbrains.annotations.NonNls;
@@ -56,6 +58,7 @@ 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;
private ProjectImportProvider myImportProvider;
private final ModulesProvider myModulesProvider;
private WizardContext myWizardContext;
protected ProjectCreateModeStep myRootStep;
@@ -81,6 +84,14 @@ public class AddModuleWizard extends AbstractWizard<ModuleWizardStep> {
initModuleWizard(project, null);
}
protected AddModuleWizard(String title, Project project, ProjectImportProvider importProvider, String filePath) {
super(title, project);
myCurrentProject = project;
myImportProvider = importProvider;
myModulesProvider = DefaultModulesProvider.createForProject(project);
initModuleWizard(project, filePath);
}
private void initModuleWizard(@Nullable final Project project, @Nullable final String defaultPath) {
myWizardContext = new WizardContext(project);
if (defaultPath != null) {
@@ -97,6 +108,20 @@ public class AddModuleWizard extends AbstractWizard<ModuleWizardStep> {
}
});
if (myImportProvider == null) {
initSteps(defaultPath);
}
else {
myWizardContext.setProjectBuilder(myImportProvider.getBuilder());
ModuleWizardStep[] steps = myImportProvider.createSteps(myWizardContext);
for (ModuleWizardStep step : steps) {
addStep(step);
}
}
init();
}
protected void initSteps(final String defaultPath) {
myRootStep = new ProjectCreateModeStep(defaultPath, myWizardContext){
protected void update() {
updateButtons();
@@ -106,7 +131,6 @@ public class AddModuleWizard extends AbstractWizard<ModuleWizardStep> {
for (WizardMode mode : myRootStep.getModes()) {
appendSteps(mode.getSteps(myWizardContext, myModulesProvider));
}
init();
}
private void appendSteps(@Nullable final StepSequence sequence) {
@@ -126,9 +150,9 @@ public class AddModuleWizard extends AbstractWizard<ModuleWizardStep> {
}
protected void updateStep() {
final ModuleWizardStep currentStep = getCurrentStepObject();
currentStep.updateStep();
if (!mySteps.isEmpty()) {
getCurrentStepObject().updateStep();
}
super.updateStep();
}
@@ -224,30 +248,40 @@ public class AddModuleWizard extends AbstractWizard<ModuleWizardStep> {
}
protected final int getNextStep(int step) {
ModuleWizardStep nextStep = null;
final StepSequence stepSequence = getMode().getSteps(myWizardContext, myModulesProvider);
if (stepSequence != null) {
if (myRootStep == mySteps.get(step)) {
return mySteps.indexOf(stepSequence.getFirstStep());
}
nextStep = stepSequence.getNextStep(mySteps.get(step));
while (nextStep != null && !nextStep.isStepVisible()) {
nextStep = stepSequence.getNextStep(nextStep);
if (myRootStep != null) {
ModuleWizardStep nextStep = null;
final StepSequence stepSequence = getMode().getSteps(myWizardContext, myModulesProvider);
if (stepSequence != null) {
if (myRootStep == mySteps.get(step)) {
return mySteps.indexOf(stepSequence.getFirstStep());
}
nextStep = stepSequence.getNextStep(mySteps.get(step));
while (nextStep != null && !nextStep.isStepVisible()) {
nextStep = stepSequence.getNextStep(nextStep);
}
}
return nextStep == null ? step : mySteps.indexOf(nextStep);
}
else {
return super.getNextStep(step);
}
return nextStep == null ? step : mySteps.indexOf(nextStep);
}
protected final int getPreviousStep(final int step) {
ModuleWizardStep previousStep = null;
final StepSequence stepSequence = getMode().getSteps(myWizardContext, myModulesProvider);
if (stepSequence != null) {
previousStep = stepSequence.getPreviousStep(mySteps.get(step));
while (previousStep != null && !previousStep.isStepVisible()) {
previousStep = stepSequence.getPreviousStep(previousStep);
if (myRootStep != null) {
ModuleWizardStep previousStep = null;
final StepSequence stepSequence = getMode().getSteps(myWizardContext, myModulesProvider);
if (stepSequence != null) {
previousStep = stepSequence.getPreviousStep(mySteps.get(step));
while (previousStep != null && !previousStep.isStepVisible()) {
previousStep = stepSequence.getPreviousStep(previousStep);
}
}
return previousStep == null ? 0 : mySteps.indexOf(previousStep);
}
else {
return super.getPreviousStep(step);
}
return previousStep == null ? 0 : mySteps.indexOf(previousStep);
}
private WizardMode getMode() {
@@ -0,0 +1,42 @@
/*
* 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.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.projectImport.ProjectImportProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Dmitry Avdeev
* Date: 10/31/12
*/
public class ImportProjectWizard extends AddModuleWizard {
private final ProjectImportProvider myProvider;
private final VirtualFile myFile;
public ImportProjectWizard(@Nullable Project project,
@NotNull ProjectImportProvider provider,
VirtualFile file) {
super("Import Project/Module", project, provider, file.getPath());
myProvider = provider;
myFile = file;
}
}
@@ -0,0 +1,76 @@
/*
* 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.projectWizard;
import com.intellij.ide.util.newProjectWizard.modes.ImportImlMode;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.packaging.artifacts.ModifiableArtifactModel;
import com.intellij.projectImport.ProjectImportBuilder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.List;
/**
* @author Dmitry Avdeev
* Date: 10/31/12
*/
public class ModuleImportBuilder extends ProjectImportBuilder {
@NotNull
@Override
public String getName() {
return "";
}
@Override
public Icon getIcon() {
return null;
}
@Override
public List getList() {
return null;
}
@Override
public boolean isMarked(Object element) {
return false;
}
@Override
public void setList(List list) throws ConfigurationException {
}
@Override
public void setOpenProjectSettingsAfter(boolean on) {
}
@Nullable
@Override
public List<Module> commit(Project project,
ModifiableModuleModel model,
ModulesProvider modulesProvider,
ModifiableArtifactModel artifactModel) {
return ImportImlMode.setUpLoader(getFileToImport()).commit(project, model, modulesProvider);
}
}
@@ -0,0 +1,45 @@
/*
* 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.projectWizard;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.projectImport.ProjectImportProvider;
/**
* @author Dmitry Avdeev
* Date: 10/31/12
*/
public class ModuleImportProvider extends ProjectImportProvider {
public ModuleImportProvider() {
super(new ModuleImportBuilder());
}
@Override
public boolean isMyFile(VirtualFile file) {
return "iml".equals(file.getExtension());
}
@Override
public boolean canCreateNewProject() {
return false;
}
@Override
public ModuleWizardStep[] createSteps(WizardContext context) {
return ModuleWizardStep.EMPTY_ARRAY;
}
}
@@ -20,12 +20,13 @@ import com.intellij.ide.IdeBundle;
import com.intellij.ide.util.projectWizard.ProjectBuilder;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.packaging.artifacts.ModifiableArtifactModel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -38,7 +39,9 @@ public abstract class ProjectImportBuilder<T> extends ProjectBuilder {
public static final ExtensionPointName<ProjectImportBuilder> EXTENSIONS_POINT_NAME = ExtensionPointName.create("com.intellij.projectImportBuilder");
private boolean myUpdate;
private String myFileToImport;
@NotNull
public abstract String getName();
public abstract Icon getIcon();
@@ -59,6 +62,14 @@ public abstract class ProjectImportBuilder<T> extends ProjectBuilder {
@Nullable
public abstract List<Module> commit(Project project, ModifiableModuleModel model, ModulesProvider modulesProvider, ModifiableArtifactModel artifactModel);
public void setFileToImport(String path) {
myFileToImport = path;
}
protected String getFileToImport() {
return myFileToImport;
}
@Nullable
public static Project getCurrentProject() {
return PlatformDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext());
@@ -23,6 +23,7 @@ package com.intellij.projectImport;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -57,5 +58,13 @@ public abstract class ProjectImportProvider {
return getBuilder().getIcon();
}
public boolean isMyFile(VirtualFile file) {
return false;
}
public boolean canCreateNewProject() {
return true;
}
public abstract ModuleWizardStep[] createSteps(WizardContext context);
}
@@ -26,6 +26,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkTypeId;
import com.intellij.openapi.roots.ui.configuration.DefaultModulesProvider;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import org.jetbrains.annotations.Nullable;
@@ -39,6 +40,10 @@ public abstract class ProjectBuilder {
@Nullable
public abstract List<Module> commit(final Project project, @Nullable final ModifiableModuleModel model, final ModulesProvider modulesProvider);
public List<Module> commit(@Nullable Project project) {
return commit(project, null, DefaultModulesProvider.createForProject(project));
}
public boolean validate(Project current, Project dest) {
return true;
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* 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.
@@ -24,11 +24,17 @@ import com.intellij.openapi.roots.ModuleRootModel;
import com.intellij.facet.FacetModel;
import com.intellij.facet.FacetManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author nik
*/
public class DefaultModulesProvider implements ModulesProvider {
public static ModulesProvider createForProject(@Nullable Project project) {
return project == null ? EMPTY_MODULES_PROVIDER : new DefaultModulesProvider(project);
}
private final Project myProject;
public DefaultModulesProvider(final Project project) {
@@ -292,6 +292,10 @@ public abstract class AbstractWizard<T extends Step> extends DialogWrapper {
return myCurrentStep;
}
public int getStepCount() {
return mySteps.size();
}
public T getCurrentStepObject() {
return mySteps.get(myCurrentStep);
}
@@ -413,7 +417,7 @@ public abstract class AbstractWizard<T extends Step> extends DialogWrapper {
}
protected void updateStep() {
if (mySteps.size() == 0) {
if (mySteps.isEmpty()) {
return;
}
@@ -154,8 +154,8 @@
<separator/>
<action id="SaveAll" class="com.intellij.ide.actions.SaveAllAction" icon="AllIcons.Actions.Menu_saveall"/>
<group id="ExportImportGroup">
<action id="ExportSettings" class="com.intellij.ide.actions.ExportSettingsAction"/>
<action id="ImportSettings" class="com.intellij.ide.actions.ImportSettingsAction"/>
<action id="ExportSettings" class="com.intellij.ide.actions.ExportSettingsAction"/>
</group>
<separator/>
<action id="Synchronize" class="com.intellij.ide.actions.SynchronizeAction" icon="AllIcons.Actions.Refresh"/>
@@ -21,7 +21,7 @@
</module-components>
<actions>
<action id="ExportToEclipse" class="org.jetbrains.idea.eclipse.export.ExportEclipseProjectsAction" text="Export to Eclipse...">
<add-to-group group-id="ExportImportGroup" anchor="after" relative-to-action="ImportSettings"/>
<add-to-group group-id="ExportImportGroup" anchor="after" relative-to-action="ExportSettings"/>
</action>
</actions>
</idea-plugin>
@@ -85,6 +85,7 @@ public class EclipseImportBuilder extends ProjectImportBuilder<String> implement
private Parameters parameters;
@NotNull
public String getName() {
return EclipseBundle.message("eclipse.name");
}
@@ -49,6 +49,7 @@ public class GradleProjectImportBuilder extends ProjectImportBuilder<GradleProje
private GradleProject myGradleProject;
private File myProjectFile;
@NotNull
@Override
public String getName() {
return GradleBundle.message("gradle.name");
@@ -30,6 +30,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.artifacts.ModifiableArtifactModel;
import com.intellij.projectImport.ProjectImportBuilder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.importing.MavenDefaultModifiableModelsProvider;
import org.jetbrains.idea.maven.importing.MavenUIModifiableModelsProvider;
@@ -60,6 +61,7 @@ public class MavenProjectBuilder extends ProjectImportBuilder<MavenProject> {
private Parameters myParameters;
@NotNull
public String getName() {
return ProjectBundle.message("maven.name");
}
@@ -181,7 +183,7 @@ public class MavenProjectBuilder extends ProjectImportBuilder<MavenProject> {
});
}
private boolean runConfigurationProcess(String message, MavenTask p) {
private static boolean runConfigurationProcess(String message, MavenTask p) {
try {
MavenUtil.run(null, message, p);
}
@@ -78,4 +78,9 @@ public class MavenProjectImportProvider extends ProjectImportProvider {
}
}, stepFactory.createProjectJdkStep(wizardContext), stepFactory.createNameAndLocationStep(wizardContext)};
}
@Override
public boolean isMyFile(VirtualFile file) {
return "pom.xml".equals(file.getName());
}
}
+4 -2
View File
@@ -57,9 +57,11 @@
</action>
<action id="SaveAsNewFormat" class="com.intellij.ide.actions.SaveAsDirectoryBasedFormatAction" text="Save as Directory-Based Format...">
<group>
<action id="SaveAsNewFormat" class="com.intellij.ide.actions.SaveAsDirectoryBasedFormatAction" text="Save as Directory-Based Format..."/>
<action class="com.intellij.ide.actions.ImportProjectAction"/>
<add-to-group group-id="ExportImportGroup" anchor="first"/>
</action>
</group>
<!-- Edit -->
<reference ref="EditorCompleteStatement">
@@ -297,6 +297,7 @@
order="after CreateFromScratchMode"/>
<wizardMode implementation="com.intellij.ide.util.newProjectWizard.modes.ImportMode" order="before ImportImlMode"/>
<wizardMode implementation="com.intellij.ide.util.newProjectWizard.modes.ImportImlMode" id="ImportImlMode"/>
<projectImportProvider implementation="com.intellij.ide.util.projectWizard.ModuleImportProvider"/>
<projectTemplatesFactory implementation="com.intellij.platform.templates.ArchivedTemplatesFactory"/>
<projectTemplatesFactory implementation="com.intellij.platform.templates.PlainModuleTemplatesFactory"/>