blob: 0b83da74e9f593c1c8f32803c42348c591c04475 [file] [log] [blame]
/*
* Copyright 2000-2014 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.ide.highlighter.ModuleFileType;
import com.intellij.ide.highlighter.ProjectFileType;
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.AbstractWizard;
import com.intellij.ide.wizard.CommitStepException;
import com.intellij.openapi.components.StorageScheme;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.IdeBorderFactory;
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;
/**
* @author Dmitry Avdeev
* Date: 19.09.13
*/
public abstract class AbstractProjectWizard extends AbstractWizard<ModuleWizardStep> {
protected final WizardContext myWizardContext;
public AbstractProjectWizard(String title, Project project, String defaultPath) {
super(title, project);
myWizardContext = initContext(project, defaultPath);
}
public AbstractProjectWizard(String title, Project project, Component dialogParent) {
super(title, dialogParent);
myWizardContext = initContext(project, null);
}
@Override
protected String addStepComponent(Component component) {
if (component instanceof JComponent) {
((JComponent)component).setBorder(IdeBorderFactory.createEmptyBorder(0, 0, 0, 0));
}
return super.addStepComponent(component);
}
public abstract StepSequence getSequence();
private static WizardContext initContext(@Nullable Project project, @Nullable String defaultPath) {
WizardContext context = new WizardContext(project);
if (defaultPath != null) {
context.setProjectFileDirectory(defaultPath);
context.setProjectName(defaultPath.substring(FileUtil.toSystemIndependentName(defaultPath).lastIndexOf("/") + 1));
}
return context;
}
@Nullable
public static Sdk getNewProjectJdk(WizardContext context) {
if (context.getProjectJdk() != null) {
return context.getProjectJdk();
}
return getProjectSdkByDefault(context);
}
public static Sdk getProjectSdkByDefault(WizardContext context) {
final Project project = context.getProject() == null ? ProjectManager.getInstance().getDefaultProject() : context.getProject();
final Sdk projectJdk = ProjectRootManager.getInstance(project).getProjectSdk();
if (projectJdk != null) {
return projectJdk;
}
return null;
}
@NotNull
public String getNewProjectFilePath() {
if (myWizardContext.getProjectStorageFormat() == StorageScheme.DEFAULT) {
return myWizardContext.getProjectFileDirectory() + File.separator + myWizardContext.getProjectName() + ProjectFileType.DOT_DEFAULT_EXTENSION;
}
else {
return myWizardContext.getProjectFileDirectory();
}
}
@NotNull
public StorageScheme getStorageScheme() {
return myWizardContext.getProjectStorageFormat();
}
public ProjectBuilder getProjectBuilder() {
return myWizardContext.getProjectBuilder();
}
public String getProjectName() {
return myWizardContext.getProjectName();
}
@Nullable
public Sdk getNewProjectJdk() {
return getNewProjectJdk(myWizardContext);
}
@NotNull
public String getNewCompileOutput() {
final String projectFilePath = myWizardContext.getProjectFileDirectory();
@NonNls String path = myWizardContext.getCompilerOutputDirectory();
if (path == null) {
path = StringUtil.endsWithChar(projectFilePath, '/') ? projectFilePath + "out" : projectFilePath + "/out";
}
return path;
}
@Override
protected void updateStep() {
if (!mySteps.isEmpty()) {
getCurrentStepObject().updateStep();
}
super.updateStep();
myIcon.setIcon(null);
}
@Override
protected void dispose() {
StepSequence sequence = getSequence();
if (sequence != null) {
for (ModuleWizardStep step : sequence.getAllSteps()) {
step.disposeUIResources();
}
}
super.dispose();
}
@Override
protected final void doOKAction() {
if (!doFinishAction()) return;
super.doOKAction();
}
public boolean doFinishAction() {
int idx = getCurrentStep();
try {
do {
final ModuleWizardStep step = mySteps.get(idx);
if (step != getCurrentStepObject()) {
step.updateStep();
}
if (!commitStepData(step)) {
return false;
}
step.onStepLeaving();
try {
step._commit(true);
}
catch (CommitStepException e) {
handleCommitException(e);
return false;
}
if (!isLastStep(idx)) {
idx = getNextStep(idx);
}
else {
for (ModuleWizardStep wizardStep : mySteps) {
try {
wizardStep.onWizardFinished();
}
catch (CommitStepException e) {
handleCommitException(e);
return false;
}
}
break;
}
} while (true);
}
finally {
myCurrentStep = idx;
updateStep();
}
return true;
}
private void handleCommitException(CommitStepException e) {
String message = e.getMessage();
if (message != null) {
Messages.showErrorDialog(getCurrentStepComponent(), message);
}
}
protected boolean commitStepData(final ModuleWizardStep step) {
try {
if (!step.validate()) {
return false;
}
}
catch (ConfigurationException e) {
Messages.showErrorDialog(myContentPanel, e.getMessage(), e.getTitle());
return false;
}
step.updateDataModel();
return true;
}
@Override
public void doNextAction() {
final ModuleWizardStep step = getCurrentStepObject();
if (!commitStepData(step)) {
return;
}
step.onStepLeaving();
super.doNextAction();
}
@Override
protected String getHelpID() {
ModuleWizardStep step = getCurrentStepObject();
if (step != null) {
return step.getHelpId();
}
return null;
}
@TestOnly
public boolean isLast() {
return isLastStep();
}
@NonNls
public String getModuleFilePath() {
return myWizardContext.getProjectFileDirectory() + File.separator + myWizardContext.getProjectName() + ModuleFileType.DOT_DEFAULT_EXTENSION;
}
@Override
protected void doPreviousAction() {
final ModuleWizardStep step = getCurrentStepObject();
step.onStepLeaving();
super.doPreviousAction();
}
@Override
public void doCancelAction() {
final ModuleWizardStep step = getCurrentStepObject();
step.onStepLeaving();
super.doCancelAction();
}
private boolean isLastStep(int step) {
return getNextStep(step) == step;
}
@Override
protected final int getNextStep(final int step) {
ModuleWizardStep nextStep = null;
final StepSequence stepSequence = getSequence();
if (stepSequence != null) {
ModuleWizardStep current = mySteps.get(step);
nextStep = stepSequence.getNextStep(current);
while (nextStep != null && !nextStep.isStepVisible()) {
nextStep = stepSequence.getNextStep(nextStep);
}
}
return nextStep == null ? step : mySteps.indexOf(nextStep);
}
@Override
protected final int getPreviousStep(final int step) {
ModuleWizardStep previousStep = null;
final StepSequence stepSequence = getSequence();
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);
}
}