jafea7-ctbrec-v5.3.0-based/client/src/main/java/ctbrec/ui/controls/Wizard.java

103 lines
3.0 KiB
Java

package ctbrec.ui.controls;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Wizard extends BorderPane {
private static final transient Logger LOG = LoggerFactory.getLogger(Wizard.class);
private Pane[] pages;
private StackPane stack;
private Stage stage;
private int page = 0;
private Button next;
private Button prev;
private Button finish;
private boolean cancelled = true;
private Runnable validator;
public Wizard(Stage stage, Runnable validator, Pane... pages) {
this.stage = stage;
this.validator = validator;
this.pages = pages;
if (pages.length == 0) {
throw new IllegalArgumentException("Provide at least one page");
}
createUi();
}
private void createUi() {
stack = new StackPane();
setCenter(stack);
next = new Button("Next");
next.setOnAction(evt -> nextPage());
prev = new Button("Back");
prev.setOnAction(evt -> prevPage());
prev.visibleProperty().bind(next.visibleProperty());
next.setVisible(pages.length > 1);
Button cancel = new Button("Cancel");
cancel.setOnAction(evt -> stage.close());
finish = new Button("Finish");
finish.setOnAction(evt -> {
if(validator != null) {
try {
validator.run();
} catch(IllegalStateException e) {
Dialogs.showError("Settings invalid", e.getMessage(), null);
return;
}
}
cancelled = false;
stage.close();
});
HBox buttons = new HBox(5, prev, next, cancel, finish);
buttons.setAlignment(Pos.BASELINE_RIGHT);
setBottom(buttons);
BorderPane.setMargin(buttons, new Insets(10));
if (pages.length != 0) {
prevPage();
}
}
private void prevPage() {
page = Math.max(0, --page);
stack.getChildren().clear();
stack.getChildren().add(pages[page]);
updateState();
}
private void nextPage() {
page = Math.min(pages.length - 1, ++page);
stack.getChildren().clear();
stack.getChildren().add(pages[page]);
updateState();
}
private void updateState() {
prev.setDisable(page == 0);
next.setDisable(page == pages.length - 1);
finish.setDisable(page != pages.length - 1);
LOG.debug("Setting border");
pages[page].setStyle(
"-fx-background-color: -fx-inner-border, -fx-background;"+
"-fx-background-insets: 0 0 -1 0, 0, 1, 2;");
}
public boolean isCancelled() {
return cancelled;
}
}