blob: d3236031859ed717cd7c9ab7e82163e4be987dc8 [file] [log] [blame]
/*
* Copyright 2016 The Bazel Authors. All rights reserved.
*
* 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.google.idea.blaze.clwb.wizard2;
import com.google.idea.blaze.base.help.BlazeHelpHandler;
import com.google.idea.blaze.base.settings.Blaze;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.ide.wizard.AbstractWizard;
import com.intellij.ide.wizard.CommitStepException;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.DumbModePermission;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Ref;
import java.awt.event.ActionListener;
import javax.annotation.Nullable;
/** Largely copied from AbstractProjectWizard / AddModuleWizard (which aren't in the CLion SDK). */
abstract class BlazeNewProjectWizard extends AbstractWizard<ProjectImportWizardStep> {
final WizardContext context;
final BlazeProjectImportBuilder builder;
public BlazeNewProjectWizard() {
super("Import Project from " + Blaze.defaultBuildSystemName(), (Project) null);
builder = new BlazeProjectImportBuilder();
context = new WizardContext(null, getDisposable());
context.setWizard(this);
context.setProjectBuilder(builder);
for (ProjectImportWizardStep step : getSteps(context)) {
addStep(step);
}
init();
}
protected abstract ProjectImportWizardStep[] getSteps(WizardContext context);
@Override
protected void helpAction() {
doHelpAction();
}
@Override
protected void doHelpAction() {
String helpId = getHelpID();
BlazeHelpHandler helpHandler = BlazeHelpHandler.getInstance();
if (helpId != null && helpHandler != null) {
helpHandler.handleHelp(helpId);
}
}
@Nullable
@Override
protected String getHelpID() {
ProjectImportWizardStep step = getCurrentStepObject();
if (step != null) {
return step.getHelpId();
}
return null;
}
// Swallow the escape key
@Nullable
@Override
protected ActionListener createCancelAction() {
return null;
}
@Override
protected void updateStep() {
if (!mySteps.isEmpty()) {
getCurrentStepObject().updateStep();
}
super.updateStep();
myIcon.setIcon(null);
}
@Override
protected final void doOKAction() {
final Ref<Boolean> result = Ref.create(false);
DumbService.allowStartingDumbModeInside(
DumbModePermission.MAY_START_BACKGROUND,
new Runnable() {
@Override
public void run() {
result.set(doFinishAction());
}
});
if (!result.get()) {
return;
}
super.doOKAction();
}
private boolean doFinishAction() {
int idx = getCurrentStep();
try {
do {
ProjectImportWizardStep step = mySteps.get(idx);
if (step != getCurrentStepObject()) {
step.updateStep();
}
if (!commitStepData(step)) {
return false;
}
try {
step._commit(true);
} catch (CommitStepException e) {
handleCommitException(e);
return false;
}
if (!isLastStep(idx)) {
idx = getNextStep(idx);
} else {
for (ProjectImportWizardStep wizardStep : mySteps) {
try {
wizardStep.onWizardFinished();
} catch (CommitStepException e) {
handleCommitException(e);
return false;
}
}
break;
}
} while (true);
} finally {
myCurrentStep = idx;
updateStep();
}
return true;
}
private boolean commitStepData(ProjectImportWizardStep 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() {
if (!commitStepData(getCurrentStepObject())) {
return;
}
super.doNextAction();
}
private void handleCommitException(CommitStepException e) {
String message = e.getMessage();
if (message != null) {
Messages.showErrorDialog(getCurrentStepComponent(), message);
}
}
@Override
protected boolean isLastStep() {
return isLastStep(getCurrentStep());
}
private boolean isLastStep(int step) {
return getNextStep(step) == step;
}
@Override
protected int getNextStep(int stepIndex) {
int nextIndex = stepIndex + 1;
while (nextIndex < mySteps.size()) {
ProjectImportWizardStep nextStep = mySteps.get(nextIndex);
if (nextStep.isStepVisible()) {
return nextIndex;
}
nextIndex++;
}
return stepIndex;
}
@Override
protected int getPreviousStep(int stepIndex) {
int prevIndex = stepIndex - 1;
while (prevIndex >= 0) {
ProjectImportWizardStep prevStep = mySteps.get(prevIndex);
if (prevStep.isStepVisible()) {
return prevIndex;
}
prevIndex--;
}
return stepIndex;
}
}