blob: 13f019e211478cbc25454fa6884c4523488b518a [file] [log] [blame]
/*
* Copyright 2000-2013 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.
*/
/*
* User: anna
* Date: 09-Jul-2007
*/
package com.intellij.ide.util.newProjectWizard;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.util.newProjectWizard.modes.CreateFromTemplateMode;
import com.intellij.ide.util.newProjectWizard.modes.ImportMode;
import com.intellij.ide.util.newProjectWizard.modes.WizardMode;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.ide.util.projectWizard.ProjectBuilder;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.ide.wizard.Step;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ui.configuration.DefaultModulesProvider;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.util.Condition;
import com.intellij.projectImport.ProjectImportBuilder;
import com.intellij.projectImport.ProjectImportProvider;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import java.awt.*;
public class AddModuleWizard extends AbstractProjectWizard {
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 ProjectImportProvider[] myImportProviders;
private final ModulesProvider myModulesProvider;
private WizardMode myWizardMode;
/**
* @param project if null, the wizard will start creating new project, otherwise will add a new module to the existing project.
*/
public AddModuleWizard(@Nullable final Project project, final @NotNull ModulesProvider modulesProvider, @Nullable String defaultPath) {
super(project == null ? NEW_PROJECT_TITLE : ADD_MODULE_TITLE, project, defaultPath);
myModulesProvider = modulesProvider;
initModuleWizard(project, defaultPath);
}
/**
* @param project if null, the wizard will start creating new project, otherwise will add a new module to the existing project.
*/
public AddModuleWizard(Component parent, final Project project, @NotNull ModulesProvider modulesProvider) {
super(project == null ? NEW_PROJECT_TITLE : ADD_MODULE_TITLE, project, parent);
myModulesProvider = modulesProvider;
initModuleWizard(project, null);
}
/** Import mode */
public AddModuleWizard(@Nullable Project project, String filePath, ProjectImportProvider... importProviders) {
super(getImportWizardTitle(project, importProviders), project, filePath);
myImportProviders = importProviders;
myModulesProvider = DefaultModulesProvider.createForProject(project);
initModuleWizard(project, filePath);
}
/** Import mode */
public AddModuleWizard(Project project, Component dialogParent, String filePath, ProjectImportProvider... importProviders) {
super(getImportWizardTitle(project, importProviders), project, dialogParent);
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");
if (providers.length == 1) {
builder.append(" from ").append(providers[0].getName());
}
return builder.toString();
}
private void initModuleWizard(@Nullable final Project project, @Nullable final String defaultPath) {
myWizardContext.addContextListener(new WizardContext.Listener() {
public void buttonsUpdateRequested() {
updateButtons();
}
public void nextStepRequested() {
doNextAction();
}
});
if (myImportProviders == null) {
myWizardMode = new CreateFromTemplateMode();
appendSteps(myWizardMode.getSteps(myWizardContext, myModulesProvider));
}
else {
myWizardMode = new ImportMode(myImportProviders);
StepSequence sequence = myWizardMode.getSteps(myWizardContext, DefaultModulesProvider.createForProject(project));
appendSteps(sequence);
for (ProjectImportProvider provider : myImportProviders) {
provider.getBuilder().setFileToImport(defaultPath);
}
if (myImportProviders.length == 1) {
final ProjectImportBuilder builder = myImportProviders[0].getBuilder();
myWizardContext.setProjectBuilder(builder);
builder.setUpdate(getWizardContext().getProject() != null);
}
}
init();
}
private void appendSteps(@Nullable final StepSequence sequence) {
if (sequence != null) {
for (ModuleWizardStep step : sequence.getAllSteps()) {
addStep(step);
}
}
}
@Override
public StepSequence getSequence() {
return myWizardMode.getSteps(myWizardContext, myModulesProvider);
}
@Nullable
public static Sdk getMostRecentSuitableSdk(final WizardContext context) {
if (context.getProject() == null) {
@Nullable final ProjectBuilder projectBuilder = context.getProjectBuilder();
return ProjectJdkTable.getInstance().findMostRecentSdk(new Condition<Sdk>() {
public boolean value(Sdk sdk) {
return projectBuilder == null || projectBuilder.isSuitableSdkType(sdk.getSdkType());
}
});
}
return null;
}
@NotNull
public WizardContext getWizardContext() {
return myWizardContext;
}
@Override
protected String getDimensionServiceKey() {
return "NewModule_or_Project.wizard";
}
/**
* Allows to ask current wizard to move to the desired step.
*
* @param filter closure that allows to indicate target step - is called with each of registered steps and is expected
* to return <code>true</code> for the step to go to
* @return <code>true</code> if current wizard is navigated to the target step; <code>false</code> otherwise
*/
public boolean navigateToStep(@NotNull Function<Step, Boolean> filter) {
for (int i = 0, myStepsSize = mySteps.size(); i < myStepsSize; i++) {
ModuleWizardStep step = mySteps.get(i);
if (filter.fun(step) != Boolean.TRUE) {
continue;
}
// Update current step.
myCurrentStep = i;
updateStep();
return true;
}
return false;
}
@TestOnly
public void commit() {
commitStepData(getCurrentStepObject());
}
}