blob: 4e172350d636cac0c1fc56987b91f1609d4acfab [file] [log] [blame]
/*
* Copyright 2000-2009 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.ui.wizard;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
public class WizardModel {
private final List<WizardStep> mySteps = new ArrayList<WizardStep>();
private WizardStep myCurrentStep;
private WizardNavigationState myCurrentState;
private JComponent myCurrentComponent;
private WizardCallback myCallback;
private boolean myDropped = false;
private boolean myAchieved = false;
private final String myTitle;
public WizardModel(String title) {
myTitle = title;
}
public final WizardStep add(WizardStep step) {
mySteps.add(step);
return step;
}
public final WizardStep addBefore(WizardStep beforeWhat, WizardStep toAdd) {
int i = mySteps.indexOf(beforeWhat);
mySteps.add(i, toAdd);
return toAdd;
}
public final WizardStep addAfter(WizardStep afterWhat, WizardStep toAdd) {
int i = mySteps.indexOf(afterWhat);
mySteps.add(i + 1, toAdd);
return toAdd;
}
public final void next() {
checkModel();
WizardStep nextStep = getCurrentStep().onNext(this);
if (nextStep == WizardStep.FORCED_GOAL_DROPPED) {
cancel();
return;
}
if (nextStep == WizardStep.FORCED_GOAL_ACHIEVED) {
finish();
return;
}
if (nextStep == null) {
nextStep = getNextFor(getCurrentStep());
}
changeToStep(nextStep);
}
public final void previous() {
checkModel();
WizardStep previousStep = getCurrentStep().onPrevious(this);
if (previousStep == null) {
previousStep = getPreviousFor(getCurrentStep());
}
changeToStep(previousStep);
}
private void changeToStep(WizardStep step) {
prepareCurrentStep(step);
getCallback().onStepChanged();
}
public final void finish() {
checkModel();
setFinishedAs(getCurrentStep().onFinish());
if (isWizardGoalAchieved()) {
getCallback().onWizardGoalAchieved();
} else {
getCallback().onWizardGoalDropped();
}
}
public final void cancel() {
checkModel();
boolean canCancel = getCurrentStep().onCancel();
if (!canCancel) return;
getCallback().onWizardGoalDropped();
setFinishedAs(false);
}
public final WizardStep getCurrentStep() {
checkModel();
if (myCurrentStep == null) {
prepareCurrentStep(mySteps.get(0));
}
return myCurrentStep;
}
public final JComponent getCurrentComponent() {
checkModel();
getCurrentStep();
return myCurrentComponent;
}
public final WizardNavigationState getCurrentNavigationState() {
checkModel();
getCurrentStep();
return myCurrentState;
}
public boolean isFirst(WizardStep step) {
return mySteps.indexOf(step) == 0;
}
public boolean isLast(WizardStep step) {
return mySteps.indexOf(step) == mySteps.size() - 1;
}
public final WizardStep getNextFor(WizardStep wizardStep) {
return mySteps.get(mySteps.indexOf(wizardStep) + 1);
}
public final WizardStep getPreviousFor(WizardStep wizardStep) {
return mySteps.get(mySteps.indexOf(wizardStep) - 1);
}
private void checkModel() {
if (mySteps.size() == 0) {
throw new IllegalStateException("Not steps were added");
}
}
private void prepareCurrentStep(WizardStep currentStep) {
myCurrentStep = currentStep;
if (myCurrentState == null) {
myCurrentState = new WizardNavigationState(this);
}
myCurrentState.NEXT.setEnabled(!isLast(myCurrentStep));
myCurrentState.PREVIOUS.setEnabled(!isFirst(myCurrentStep));
myCurrentState.FINISH.setEnabled(isLast(myCurrentStep));
myCurrentState.CANCEL.setEnabled(true);
myCurrentComponent = myCurrentStep.prepare(myCurrentState);
}
void setCallback(WizardCallback callback) {
myCallback = callback;
}
private WizardCallback getCallback() {
return myCallback != null ? myCallback : WizardCallback.EMPTY;
}
public final boolean isWizardGoalDropped() {
return myDropped;
}
public final boolean isWizardGoalAchieved() {
return myAchieved;
}
private void setFinishedAs(boolean goalAchieved) {
myAchieved = goalAchieved;
myDropped = !goalAchieved;
}
public boolean isDone() {
return myAchieved || myDropped;
}
public String getTitle() {
return myTitle;
}
public int getStepIndex(WizardStep step) {
return mySteps.indexOf(step);
}
}