import javafx.application.Application; import javafx.scene.control.Alert; import javafx.stage.FileChooser; import javafx.stage.Stage; import ql.ast.form.Form; import ql.gen.QLLexer; import ql.gen.QLParser; import ql.ast.AstBuilder; import ql.gui.Modeler; import ql.gui.Renderer; import ql.gui.SimpleModeler; import ql.gui.canvas.Canvas; import ql.semantics.*; import qls.semantics.TypeChecker; import ql.semantics.errors.Messages; import qls.ast.Stylesheet; import qls.gen.QLSLexer; import qls.gen.QLSParser; import qls.gui.StyledModeler; import qls.semantics.*; import org.antlr.v4.runtime.ANTLRFileStream; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.ParserRuleContext; import java.io.File; import java.io.IOException; import java.util.List; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { if (!(this.isQlFileSpecified())) { this.showErrorAlert("No QL file specified"); System.exit(1); } String qlFile = getParameter(0); CharStream qlStream = getStream(qlFile); QLLexer qlLexer = new QLLexer(qlStream); QLParser qlParser = new QLParser(new CommonTokenStream(qlLexer)); ParserRuleContext qlContext = qlParser.form(); AstBuilder qlBuilder = new AstBuilder(); Form form = (Form)qlBuilder.visit(qlContext); Messages ms = ql.semantics.TypeChecker.check(form); if (ms.containsError()) { this.showErrorAlert(ms.toString()); System.exit(1); } CondQuestionTable condQuestionTable = CondQuestionTableBuilder.build(form); Modeler modeler = new SimpleModeler(condQuestionTable); if (this.isQlsFileSpecified()) { String qlsFile = getParameter(1); CharStream qlsStream = getStream(qlsFile); QLSLexer qlsLexer = new QLSLexer(qlsStream); QLSParser qlsParser = new QLSParser(new CommonTokenStream(qlsLexer)); ParserRuleContext qlsContext = qlsParser.stylesheet(); qls.ast.AstBuilder qlsBuilder = new qls.ast.AstBuilder(); Stylesheet stylesheet = (Stylesheet)qlsBuilder.visit(qlsContext); Messages qlsMs = TypeChecker.check(stylesheet, form); if (qlsMs.containsError()) { this.showErrorAlert(qlsMs.toString()); System.exit(1); } QuestionStyles questionStyles = StyleMerger.getStyles(stylesheet, form); modeler = new StyledModeler(condQuestionTable, stylesheet, questionStyles); } ValueTable valueTable = ValueTableBuilder.build(form); Canvas canvas = modeler.buildCanvas(); canvas.setSubmitAction(e -> this.saveAction(primaryStage, condQuestionTable, valueTable)); Renderer.display(valueTable, canvas, primaryStage); } private void saveAction(Stage primaryStage, CondQuestionTable condQuestionTable, ValueTable valueTable) { FileChooser.ExtensionFilter filter = new FileChooser.ExtensionFilter("XML files (*.xml)", "*.xml"); FileChooser fileChooser = new FileChooser(); fileChooser.getExtensionFilters().add(filter); File file = fileChooser.showSaveDialog(primaryStage); if (file != null) { DataStore dataStore = new FileStore(condQuestionTable, valueTable, file); try { dataStore.save(); } catch (Exception ex) { this.showErrorAlert("Saving failed!"); } } } private CharStream getStream(String file) { try { return new ANTLRFileStream(file); } catch (IOException ex) { System.err.print(ex.toString()); System.exit(1); } return null; } private String getParameter(int n) { List<String> parameters = getParameters().getRaw(); return parameters.get(n); } private boolean isQlFileSpecified() { return getParameters().getRaw().size() > 0; } private boolean isQlsFileSpecified() { return getParameters().getRaw().size() > 1; } private void showErrorAlert(String msg) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setHeaderText(msg); alert.showAndWait(); } }