package nl.uva.sc.encoders.qlruntime.ui;
import java.util.List;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import nl.uva.sc.encoders.ql.ast.Questionnaire;
import nl.uva.sc.encoders.ql.parser.QuestionnaireParsingResult;
import nl.uva.sc.encoders.ql.validation.ValidationResult;
import nl.uva.sc.encoders.qlruntime.model.RuntimeQuestion;
import nl.uva.sc.encoders.qlruntime.ui.handler.ChooseInputButtonHandler;
import nl.uva.sc.encoders.qlruntime.ui.handler.ChooseInputButtonHandler.PathSelectedCallback;
import nl.uva.sc.encoders.qlruntime.ui.handler.ParseQLButtonHandler;
import nl.uva.sc.encoders.qlruntime.ui.handler.ParseQLButtonHandler.InputFileTextCallback;
import nl.uva.sc.encoders.qlruntime.ui.handler.ParseQLButtonHandler.ParseResultCallback;
import nl.uva.sc.encoders.qlruntime.ui.handler.QuestionnaireToRuntimeQuestions;
public class Main extends Application {
public static final String DEFAULT_QL_INPUT_FILE_DIRECTORY = "ql/";
public static final String DEFAULT_QL_INPUT_FILE_NAME = "input_form.ql";
private static final int WIDTH = 750;
private static final int HEIGHT = 600;
public static void main(String[] args) {
launch(args);
}
private Questionnaire questionnaire = null;
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Questionnaire");
primaryStage.getIcons().add(new Image("questionnaire.png"));
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(25, 25, 25, 25));
ColumnConstraints columnConstraints = new ColumnConstraints();
columnConstraints.setFillWidth(true);
columnConstraints.setHgrow(Priority.ALWAYS);
grid.getColumnConstraints().add(columnConstraints);
RowConstraints rowConstraints = new RowConstraints();
rowConstraints.setFillHeight(true);
rowConstraints.setVgrow(Priority.ALWAYS);
grid.getRowConstraints().add(new RowConstraints());
grid.getRowConstraints().add(new RowConstraints());
grid.getRowConstraints().add(rowConstraints);
String defaultLocation = DEFAULT_QL_INPUT_FILE_DIRECTORY + DEFAULT_QL_INPUT_FILE_NAME;
final TextField inputFileTextField = new TextField(defaultLocation);
Button chooseInputButton = new Button("Choose input file...");
Button parseButton = new Button("Parse");
Button showButton = new Button("Show");
grid.add(inputFileTextField, 0, 0);
grid.add(chooseInputButton, 1, 0);
grid.add(parseButton, 2, 0);
grid.add(showButton, 3, 0);
showButton.setVisible(false);
PathSelectedCallback pathSelectedCallback = path -> inputFileTextField.setText(path);
chooseInputButton.setOnAction(new ChooseInputButtonHandler(pathSelectedCallback, defaultLocation));
StackPane stackPane = new StackPane();
ValidationsGridPane validationsGridPane = new ValidationsGridPane();
InputFileTextCallback inputFileTextCallback = () -> inputFileTextField.getText();
ParseResultCallback parseResultCallback = parsingResult -> {
QuestionnaireParsingResult qlParsingResult = (QuestionnaireParsingResult) parsingResult;
showNode(stackPane, validationsGridPane);
ValidationResult validationResult = qlParsingResult.validate();
showButton.setVisible(!validationResult.containsErrors());
validationsGridPane.showValidations(validationResult.getValidationMessages());
questionnaire = qlParsingResult.getQuestionnaire();
};
parseButton.setOnAction(new ParseQLButtonHandler(inputFileTextCallback, parseResultCallback));
showButton.setOnAction(event -> {
QuestionnaireToRuntimeQuestions questionnaireToRuntimeQuestions = new QuestionnaireToRuntimeQuestions();
List<RuntimeQuestion> runtimeQuestions = questionnaireToRuntimeQuestions.createRuntimeQuestions(questionnaire);
QuestionnaireGridPane questionnaireGridPane = new QuestionnaireGridPane();
questionnaireGridPane.showQuestions(runtimeQuestions, runtimeQuestions);
ScrollPane scrollPane = new ScrollPane(questionnaireGridPane);
showNode(stackPane, scrollPane);
});
grid.add(stackPane, 0, 1, 4, 1);
Scene scene = new Scene(grid, WIDTH, HEIGHT);
primaryStage.setScene(scene);
primaryStage.show();
}
private void showNode(StackPane stackPane, Node nodeToShow) {
ObservableList<Node> stackPaneChildren = stackPane.getChildren();
stackPaneChildren.clear();
stackPaneChildren.add(nodeToShow);
}
}