package ch.fhnw.oop2.calculator; import ch.fhnw.oop2.calculator.operator.*; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; /** * the application user interface (and even logic! :-P) */ public class ApplicationUI extends GridPane implements ApplicationView { private Label label; private Button clearButton; private Button signButton; private Button divideButton; private Button multiplyButton; private Button substractButton; private Button periodButton; private Button addButton; private Button equalButton; private final Presenter presenter; /** * creates a new ApplicationUI */ public ApplicationUI() { initializeControls(); layoutControls(); addEventHandlers(); addValueChangeListeners(); addBindings(); presenter = new Presenter(this); } private void initializeControls() { label = new Label("0"); label.setId("label"); clearButton = getButton("C"); signButton = getButton("+/-"); divideButton = getButton("/"); multiplyButton = getButton("*"); substractButton = getButton("-"); addButton = getButton("+"); periodButton = getButton("."); equalButton = getButton("="); } private void layoutControls() { label.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); add(label, 0, 0, 4, 1); add(clearButton, 0, 1); add(signButton, 1, 1); add(divideButton, 2, 1); add(multiplyButton, 3, 1); add(getNumberButton("7"), 0, 2); add(getNumberButton("8"), 1, 2); add(getNumberButton("9"), 2, 2); add(substractButton, 3, 2); add(getNumberButton("4"), 0, 3); add(getNumberButton("5"), 1, 3); add(getNumberButton("6"), 2, 3); add(addButton, 3, 3); add(getNumberButton("1"), 0, 4); add(getNumberButton("2"), 1, 4); add(getNumberButton("3"), 2, 4); equalButton.getStyleClass().add("equal-button"); add(equalButton, 3, 4, 1, 2); add(getNumberButton("0"), 0, 5, 2, 1); add(periodButton, 2, 5); } private void addEventHandlers() { setOnKeyTyped(e -> { String character = e.getCharacter(); switch (e.getCharacter()) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": presenter.enterDigit(character); break; case ".": presenter.enterPeriod(); break; case "+": presenter.add(); break; case "-": presenter.subtract(); break; case "*": presenter.multiply(); break; case "/": presenter.divide(); break; case "=": presenter.calculate(null); break; } }); setOnKeyPressed(e -> { switch (e.getCode()) { case BACK_SPACE: presenter.removeLast(); break; case ENTER: presenter.calculate(null); break; case DELETE: presenter.clear(); break; } }); clearButton.setOnAction(e -> presenter.clear()); signButton.setOnAction(e -> presenter.flipSign()); periodButton.setOnAction(e -> presenter.enterPeriod()); addButton.setOnAction(e -> presenter.add()); substractButton.setOnAction(e -> presenter.subtract()); multiplyButton.setOnAction(e -> presenter.multiply()); divideButton.setOnAction(e -> presenter.divide()); equalButton.setOnAction(e -> presenter.calculate(null)); } private Button getNumberButton(String text) { Button button = getButton(text); button.setOnAction(e -> presenter.enterDigit(text)); return button; } private Button getButton(String text) { Button button = new Button(text); button.setPrefSize(60, 60); button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); button.setAlignment(Pos.CENTER); GridPane.setHgrow(button, Priority.ALWAYS); GridPane.setVgrow(button, Priority.ALWAYS); return button; } private void addValueChangeListeners() { } private void addBindings() { } }