package jp.ac.aiit.jointry.controllers;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import jp.ac.aiit.jointry.models.Costume;
import jp.ac.aiit.jointry.models.Sprite;
import jp.ac.aiit.jointry.models.SpriteTask;
import static jp.ac.aiit.jointry.services.broker.app.JointryCommon.M_COSTUME_SYNC;
import jp.ac.aiit.jointry.services.broker.app.SpriteDialog;
import jp.ac.aiit.jointry.services.picture.camera.CameraApplication;
import jp.ac.aiit.jointry.services.picture.paint.PaintApplication;
import jp.ac.aiit.jointry.services.picture.paint.views.PtCamera;
import jp.ac.aiit.jointry.util.StageUtil;
import jp.ac.aiit.jointry.util.StringUtil;
public class BackStageController {
@FXML
private ScrollPane costumeList;
@FXML
private ResizePane scriptContent;
@FXML
private Label codeArea;
private MainController mainController;
private final List<SpriteTask> spriteTasks = new ArrayList(); //停止用
@FXML
protected void handlePaintBtnAct(ActionEvent event) throws Exception {
final PaintApplication app = new PaintApplication();
Stage stage = app.start(null, costumeList.getScene().getWindow());
stage.setOnHidden(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
if (app.getResult() != null) {
Sprite sprite = mainController.getFrontStageController().getCurrentSprite();
sprite.setSpriteCostume(sprite.addCostume("costume", app.getResult()));
showCostumes(sprite);
sendMessage();
}
}
});
}
@FXML
protected void handleCamBtnAct(ActionEvent event) throws Exception {
final CameraApplication app = new CameraApplication();
try {
Stage stage = app.start(costumeList.getScene().getWindow());
stage.setOnHidden(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
if (app.getResult() != null) {
Sprite sprite = mainController.getFrontStageController().getCurrentSprite();
sprite.setSpriteCostume(sprite.addCostume("costume", app.getResult()));
showCostumes(sprite);
sendMessage();
}
}
});
} catch (Exception ex) {
Logger.getLogger(PtCamera.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void showCostumes(Sprite sprite) {
VBox vbox = new VBox();
for (Costume costume : sprite.getCostumes()) {
URL fxml = getClass().getResource("Costume.fxml"); //表示するfxml
StageUtil costumeStage = new StageUtil(null, null, fxml, costume);
CostumeCntroller controller = (CostumeCntroller) costumeStage.getController();
controller.setMainController(mainController);
vbox.getChildren().add(costumeStage.getParent());
}
costumeList.setContent(vbox);
}
@FXML
protected void handleCostumeSelected(Event event) {
Sprite sprite = mainController.getFrontStageController().getCurrentSprite();
setCurrentSprite(sprite);
}
private String codeFormat(String code) {
StringBuilder result = new StringBuilder();
//1行単位で処理
int tabCount = 0;
String tabs = "";
for (String line : code.split("\n")) {
if (line.endsWith("}")) {
tabs = StringUtil.multply("\t", --tabCount);
}
result.append(tabs);
result.append(line);
result.append("\n");
if (line.endsWith("{")) {
tabs = StringUtil.multply("\t", ++tabCount);
}
}
return result.toString();
}
public void setCurrentSprite(Sprite sprite) {
showCostumes(sprite);
showBlocks(sprite);
}
@FXML
protected void handleCodeSelected(Event event) {
codeArea.setText(null);
Sprite sprite = mainController.getFrontStageController().getCurrentSprite();
double speed = mainController.getFrontStageController().getSpeed();
SpriteTask task = new SpriteTask();
task.setSprite(sprite);
task.setSpeed(speed);
codeArea.setText(codeFormat(task.getCode()));
}
public void start() {
double speed = mainController.getFrontStageController().getSpeed();
for (Sprite sprite : mainController.getFrontStageController().getSprites()) {
SpriteTask task = new SpriteTask();
task.setSprite(sprite);
task.setSpeed(speed);
spriteTasks.add(task);
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
}
}
public void stop() {
for (SpriteTask task : spriteTasks) {
task.finish();
}
spriteTasks.clear();
}
public void setMainController(MainController controller) {
this.mainController = controller;
}
private void showBlocks(Sprite sprite) {
//組み立てたブロックを表示
scriptContent.setContent(sprite.getScriptPane());
}
private void sendMessage() {
Sprite sprite = mainController.getFrontStageController().getCurrentSprite();
SpriteDialog.sendAllMessage(M_COSTUME_SYNC, sprite);
}
}