package jp.ac.aiit.jointry.models.blocks.statement.procedure; import javafx.collections.FXCollections; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import jp.ac.aiit.jointry.models.Status; import jp.ac.aiit.jointry.models.blocks.Connector; import jp.ac.aiit.jointry.models.blocks.expression.Variable; import jp.ac.aiit.jointry.util.BlockUtil; public class Calculate extends Procedure { protected Variable arg1; protected Variable arg2; protected TextField tf1; protected TextField tf2; protected ChoiceBox cb; public Connector variableCon; public Variable variable; public Connector leftVariableCon; public Variable leftVariable; public Calculate() { super(); rect.setFill(getColor()); tf1 = new TextField(); tf1.setPrefWidth(50.0); AnchorPane.setTopAnchor(tf1, 10.0); AnchorPane.setLeftAnchor(tf1, 80.0); setChangeListener(tf1); cb = new ChoiceBox(FXCollections.observableArrayList( "+", "-", "×", "÷", "%")); AnchorPane.setTopAnchor(cb, 10.0); AnchorPane.setLeftAnchor(cb, 135.0); tf2 = new TextField(); tf2.setPrefWidth(50.0); AnchorPane.setTopAnchor(tf2, 10.0); AnchorPane.setLeftAnchor(tf2, 190.0); setChangeListener(tf2); Label wa = new Label("は"); AnchorPane.setTopAnchor(wa, 15.0); AnchorPane.setLeftAnchor(wa, 63.0); getChildren().addAll(wa, tf1, cb, tf2); getChildren().remove(lb); // コネクタを全面に出すために rect.toBack(); makeConnectors(); } @Override protected void makeConnectors() { super.makeConnectors(); // Variable variableCon = new Connector(); variableCon.detouch(); variableCon.setWidth(50); variableCon.setHeight(2); variableCon.setHolder(this); variableCon.setPosition(Connector.Position.LEFT); AnchorPane.setTopAnchor(variableCon, 10.0); AnchorPane.setLeftAnchor(variableCon, 10.0); variableCon.toFront(); leftVariableCon = new Connector(); leftVariableCon.detouch(); leftVariableCon.setWidth(50); leftVariableCon.setHeight(2); leftVariableCon.setHolder(this); leftVariableCon.setPosition(Connector.Position.INSIDE_LEFT); AnchorPane.setTopAnchor(leftVariableCon, 10.0); AnchorPane.setLeftAnchor(leftVariableCon, 80.0); leftVariableCon.toFront(); getChildren().addAll(variableCon, leftVariableCon); } public static Color getColor() { return Color.web("F6D7B3"); } @Override public final Label getLabel() { return new Label("けいさん"); } @Override public String intern() { StringBuilder sb = new StringBuilder(); sb.append(variable.intern()); sb.append(" = ("); StringBuilder v = new StringBuilder(); if (leftVariable != null) { v.append(leftVariable.intern()); } else { if (arg1 != null) { v.append(arg1); } else { try { // As number v.append(Integer.parseInt(tf1.getText())); } catch (NumberFormatException nfe) { // As String v.append("\""); v.append(tf1.getText()); v.append("\""); } } } v.append(" "); v.append(cb.getValue()); v.append(" "); if (arg2 != null) { v.append(arg2); } else { try { // As number v.append(Integer.parseInt(tf2.getText())); } catch (NumberFormatException nfe) { // As String v.append("\""); v.append(tf2.getText()); v.append("\""); } } sb.append(v.toString()); sb.append(")\n"); if (nextBlock != null) { sb.append(nextBlock.intern()); } return sb.toString(); } @Override public Status getStatus() { Status status = new Status(); status.put("id", this.getUUID()); if (variable != null) { status.put("variable", variable.getStatus()); } if (leftVariable != null) { status.put("left", leftVariable.getStatus()); } else if (arg1 != null) { status.put("left", arg1.getStatus()); } else { status.put("left", tf1.getText()); } status.put("op", cb.getValue()); if (arg2 != null) { status.put("right", arg2.getStatus()); } else { status.put("right", tf2.getText()); } return status; } @Override public void setStatus(Status status) { changeable = false; //一時的にリスナーを無効化 this.setUUID((String) status.get("id")); for (Object key : status.keySet()) { if (key.equals("variable")) { //変数ブロック Variable val = (Variable) BlockUtil.create("Variable"); val.setSprite(getSprite()); val.setStatus(BlockUtil.convertMapToStatus(status.get(key))); setVariable(val); } else if (key.equals("left")) { Object value = status.get(key); if (value instanceof String) { tf1.setText((String) value); //テキスト } else { //変数ブロック Variable val = (Variable) BlockUtil.create("Variable"); val.setSprite(getSprite()); val.setStatus(BlockUtil.convertMapToStatus(status.get(key))); setLeftVariable(val); } } else if (key.equals("op")) { cb.setValue(status.get(key)); } else if (key.equals("right")) { Object value = status.get(key); if (value instanceof String) { tf2.setText((String) status.get(key)); //テキスト } else { //変数ブロック arg2 = (Variable) BlockUtil.create("Variable"); arg2.setSprite(getSprite()); arg2.setStatus(BlockUtil.convertMapToStatus(status.get(key))); } } } changeable = true; } @Override public void show() { super.show(); if (variable != null) { variable.show(); } if (leftVariable != null) { leftVariable.show(); } } public void setVariable(Variable v) { this.variable = v; if (v != null) { v.mother = this; } } @Override public void move(double dx, double dy) { if (variable != null) { variable.toFront(); variable.move(dx + 10, dy + 10); } if (leftVariable != null) { leftVariable.toFront(); leftVariable.move(dx + 80, dy + 10); } super.move(dx, dy); } public void setLeftVariable(Variable v) { this.leftVariable = v; if (v != null) { v.mother = this; } } @Override public void toFront() { super.toFront(); if (variable != null) { variable.toFront(); } if (leftVariable != null) { leftVariable.toFront(); } } }