package nl.uva.sc.encoders.qlsruntime.ui;
import static nl.uva.sc.encoders.qlruntime.ui.Main.DEFAULT_QL_INPUT_FILE_DIRECTORY;
import static nl.uva.sc.encoders.qlruntime.ui.Main.DEFAULT_QL_INPUT_FILE_NAME;
import java.util.List;
import java.util.Properties;
import java.util.stream.Collectors;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Pagination;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
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.QuestionnaireGridPane;
import nl.uva.sc.encoders.qlruntime.ui.ValidationsGridPane;
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.InputFileTextCallback;
import nl.uva.sc.encoders.qlruntime.ui.handler.ParseQLButtonHandler.ParseResultCallback;
import nl.uva.sc.encoders.qlruntime.ui.handler.QuestionnaireToRuntimeQuestions;
import nl.uva.sc.encoders.qls.ast.Page;
import nl.uva.sc.encoders.qls.ast.Stylesheet;
import nl.uva.sc.encoders.qls.parser.StylesheetParsingResult;
import nl.uva.sc.encoders.qlsruntime.ui.handler.CombinedParsingResult;
import nl.uva.sc.encoders.qlsruntime.ui.handler.QLSParseButtonHandler;
public class Main extends Application {
private static final String DEFAULT_QLS_INPUT_FILE_DIRECTORY = "qls/";
private static final String DEFAULT_QLS_INPUT_FILE_NAME = "stylesheet.qls";
private static final int WIDTH = 850;
private static final int HEIGHT = 500;
public static void main(String[] args) {
launch(args);
}
private Questionnaire questionnaire = null;
private Stylesheet stylesheet = null;
@Override
public void start(Stage primaryStage) throws Exception {
Properties uiProperties = new UIProperties().getUIProperties();
String propertyWindowName = uiProperties.getProperty("windowName");
String propertyInitializationImage = uiProperties.getProperty("initializationImage");
primaryStage.setTitle(propertyWindowName);
primaryStage.getIcons().add(new Image(propertyInitializationImage));
GridPane grid = new GridPane();
grid.getStyleClass().add("grid");
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 defaultQlsLocation = DEFAULT_QLS_INPUT_FILE_DIRECTORY + DEFAULT_QLS_INPUT_FILE_NAME;
String defaultQlLocation = DEFAULT_QL_INPUT_FILE_DIRECTORY + DEFAULT_QL_INPUT_FILE_NAME;
final TextField qlInputFileTextField = new TextField(defaultQlLocation);
final TextField qlsInputFileTextField = new TextField(defaultQlsLocation);
Button qlChooseInputButton = new Button("Choose ql file...");
Button qlsChooseInputButton = new Button("Choose qls file...");
Button parseButton = new Button("Parse");
Button showButton = new Button("Show");
grid.add(qlInputFileTextField, 0, 0);
grid.add(qlChooseInputButton, 1, 0);
grid.add(qlsInputFileTextField, 0, 1);
grid.add(qlsChooseInputButton, 1, 1);
grid.add(parseButton, 2, 1);
grid.add(showButton, 3, 1);
showButton.setVisible(false);
PathSelectedCallback qlPathSelectedCallback = path -> qlInputFileTextField.setText(path);
PathSelectedCallback qlsPathSelectedCallback = path -> qlsInputFileTextField.setText(path);
qlChooseInputButton.setOnAction(new ChooseInputButtonHandler(qlPathSelectedCallback, defaultQlLocation));
qlsChooseInputButton.setOnAction(new ChooseInputButtonHandler(qlsPathSelectedCallback, defaultQlsLocation));
StackPane stackPane = new StackPane();
ValidationsGridPane validationsGridPane = new ValidationsGridPane();
InputFileTextCallback inputQLFileTextCallback = () -> qlInputFileTextField.getText();
InputFileTextCallback inputQLSFileTextCallback = () -> qlsInputFileTextField.getText();
ParseResultCallback parseCombinedResultCallback = parsingResult -> {
CombinedParsingResult combinedParsingResult = (CombinedParsingResult) parsingResult;
QuestionnaireParsingResult questionnaireParsingResult = combinedParsingResult.getQuestionnaireParsingResult();
showNode(stackPane, validationsGridPane);
ValidationResult validationResult = combinedParsingResult.validate();
showButton.setVisible(!validationResult.containsErrors());
validationsGridPane.showValidations(validationResult.getValidationMessages());
questionnaire = questionnaireParsingResult.getQuestionnaire();
StylesheetParsingResult stylesheetParsingResult = combinedParsingResult.getStylesheetParsingResult();
stylesheet = stylesheetParsingResult.getStylesheet();
};
parseButton.setOnAction(new QLSParseButtonHandler(inputQLFileTextCallback, inputQLSFileTextCallback,
parseCombinedResultCallback));
showButton.setOnAction(event -> {
QuestionnaireToRuntimeQuestions questionnaireToRuntimeQuestions = new QuestionnaireToRuntimeQuestions();
List<RuntimeQuestion> runtimeQuestions = questionnaireToRuntimeQuestions.createRuntimeQuestions(questionnaire);
List<Page> pages = stylesheet.getPages();
Pagination pagination = new Pagination(pages.size());
pagination.setPageFactory(pageIndex -> {
Page page = pages.get(pageIndex);
List<RuntimeQuestion> questionsOnThisPage = runtimeQuestions.stream()
.filter(rq -> page.containsQuestion(rq.getQuestion().getName())).collect(Collectors.toList());
QuestionnaireGridPane questionnaireGridPane = new StyledQuestionnaireGridPane(page);
questionnaireGridPane.showQuestions(runtimeQuestions, questionsOnThisPage);
return new ScrollPane(questionnaireGridPane);
});
AnchorPane anchor = new AnchorPane();
AnchorPane.setTopAnchor(pagination, 10.0);
AnchorPane.setRightAnchor(pagination, 10.0);
AnchorPane.setBottomAnchor(pagination, 10.0);
AnchorPane.setLeftAnchor(pagination, 10.0);
anchor.getChildren().addAll(pagination);
showNode(stackPane, anchor);
});
grid.add(stackPane, 0, 2, 4, 1);
Scene scene = new Scene(grid, WIDTH, HEIGHT);
scene.getStylesheets().add(getClass().getResource("UIElements.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
private void showNode(StackPane stackPane, Node nodeToShow) {
ObservableList<Node> stackPaneChildren = stackPane.getChildren();
stackPaneChildren.clear();
stackPaneChildren.add(nodeToShow);
}
}