package jp.ac.aiit.jointry.models.blocks.statement.procedure;
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 Speech extends Procedure {
private TextField tf;
public Connector variableCon;
public Variable variable;
public Speech() {
super();
rect.setFill(getColor());
this.tf = new TextField();
tf.setPrefWidth(50.0);
AnchorPane.setTopAnchor(tf, 10.0);
AnchorPane.setLeftAnchor(tf, 10.0);
setChangeListener(tf);
getChildren().add(tf);
makeConnectors();
}
public static Color getColor() {
return Color.LAVENDER;
}
@Override
protected void makeConnectors() {
super.makeConnectors();
// Variable
variableCon = new Connector();
variableCon.setFill(Color.TRANSPARENT);
variableCon.setWidth(50);
variableCon.setHeight(2);
variableCon.setHolder(this);
variableCon.setPosition(Connector.Position.INSIDE_LEFT);
AnchorPane.setTopAnchor(variableCon, 10.0);
AnchorPane.setLeftAnchor(variableCon, 10.0);
variableCon.toFront();
getChildren().addAll(variableCon);
}
@Override
public Label getLabel() {
return new Label("はなす");
}
@Override
public String intern() {
StringBuilder sb = new StringBuilder();
String content = "";
if (variable != null) {
content = variable.intern();
} else {
content = " \"" + tf.getText() + "\"";
}
sb.append("speech ").append(content).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());
} else {
status.put("variable", tf.getText());
}
return status;
}
@Override
public void setStatus(Status status) {
changeable = false; //一時的にリスナーを無効化
this.setUUID((String) status.get("id"));
Object value = status.get("variable");
if (value instanceof String) {
tf.setText((String) value);
} else {
//変数ブロック
Variable val = (Variable) BlockUtil.create("Variable");
val.setStatus(BlockUtil.convertMapToStatus(value));
val.setSprite(getSprite());
setVariable(val);
}
changeable = true;
}
@Override
public void show() {
super.show();
if (variable != null) {
variable.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);
}
super.move(dx, dy);
}
@Override
public void toFront() {
super.toFront();
if (variable != null) {
variable.toFront();
}
}
}