package jp.ac.aiit.jointry.models;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.SequentialTransition;
import javafx.concurrent.Task;
import javafx.scene.Node;
import jp.ac.aiit.jointry.controllers.BackStageController;
import jp.ac.aiit.jointry.services.lang.ast.ASTree;
import jp.ac.aiit.jointry.services.lang.ast.NullStmnt;
import jp.ac.aiit.jointry.services.lang.parser.Environment;
import jp.ac.aiit.jointry.services.lang.parser.JointryParser;
import jp.ac.aiit.jointry.services.lang.parser.LangReader;
import jp.ac.aiit.jointry.services.lang.parser.Lexer;
import jp.ac.aiit.jointry.services.lang.parser.ParseException;
import jp.ac.aiit.jointry.services.lang.parser.Token;
import jp.ac.aiit.jointry.models.blocks.statement.Statement;
public class SpriteTask extends Task {
private Sprite sprite;
private double speed;
private SequentialTransition st;
public void setSprite(Sprite sprite) {
this.sprite = sprite;
}
public String getCode() {
StringBuilder code = new StringBuilder();
for (Node node : sprite.getScriptPane().getChildrenUnmodifiable()) {
if (node instanceof Statement) {
Statement block = (Statement) node;
if (block.isTopLevelBlock()) {
code.append(block.intern());
}
}
}
// Debug
System.out.println(code);
return code.toString();
}
@Override
protected Object call() throws Exception {
String code = getCode();
Lexer lexer = new Lexer(new LangReader(code));
JointryParser parser = new JointryParser();
Environment env = new Environment();
env.setSprite(sprite);
env.setSpeed(speed);
st = new SequentialTransition();
env.setSequentialTransition(st);
Object retval = null;
try {
while (lexer.peek(0) != Token.EOF) {
ASTree t = parser.parse(lexer);
if (!(t instanceof NullStmnt)) {
retval = t.eval(env);
}
}
} catch (ParseException ex) {
Logger.getLogger(BackStageController.class.getName()).log(Level.SEVERE, null, ex);
}
st.play();
return retval;
}
public void setSpeed(double speed) {
this.speed = speed;
}
public void finish() {
if (st != null) {
st.stop();
}
}
}