package jp.ac.aiit.jointry.services.broker.app;
import jp.ac.aiit.jointry.services.broker.core.DInfo;
import javafx.scene.Node;
import jp.ac.aiit.jointry.models.Sprite;
import jp.ac.aiit.jointry.models.blocks.Block;
import jp.ac.aiit.jointry.models.blocks.expression.Condition;
import jp.ac.aiit.jointry.models.blocks.expression.Variable;
import jp.ac.aiit.jointry.models.blocks.statement.Statement;
import jp.ac.aiit.jointry.models.blocks.statement.codeblock.CodeBlock;
import jp.ac.aiit.jointry.models.blocks.statement.procedure.Assign;
import jp.ac.aiit.jointry.models.blocks.statement.procedure.Calculate;
import jp.ac.aiit.jointry.models.blocks.statement.procedure.Speech;
import jp.ac.aiit.jointry.util.BlockUtil;
import jp.ac.aiit.jointry.util.JsonUtil;
public class BlockDialog extends JointryDialogBase {
@Override
public void onAnswer(int event, DInfo dinfo) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void onQuery(int event, DInfo dinfo) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void onNotify(int event, DInfo dinfo) {
if (mainController == null) {
return;
}
if (event == M_BLOCK_VARIABLE_CREATE) {
mBlockVariableCreate(dinfo);
}
final Sprite sprite = getTargetSprite(dinfo);
if (sprite == null) {
return; //該当なし
}
//新規block作成
switch (event) {
case M_BLOCK_CREATE:
mBlockCreate(sprite, dinfo);
return;
}
//基本blockの操作
Block myBlock = getTargetBlock(sprite, dinfo.get(K_BLOCK_ID));
if (myBlock == null) {
return;
}
switch (event) {
case M_BLOCK_REMOVE:
mBlockRemove(myBlock, dinfo);
break;
case M_BLOCK_MOVE:
mBlockMove(myBlock, dinfo);
break;
case M_BLOCK_ADDLINK:
mBlockAddLink(sprite, myBlock, dinfo);
break;
case M_BLOCK_ADDCHILD:
mBlockAddChild(sprite, myBlock, dinfo);
break;
case M_BLOCK_CHANGE_STATE:
mBlockChangeState(myBlock, dinfo);
break;
case M_BLOCK_ADDEMBRYO:
mBlockAddEmbryo(sprite, myBlock, dinfo);
break;
case M_BLOCK_ADDVARIABLE:
mBlockAddVariable(sprite, myBlock, dinfo);
break;
default:
break;
}
}
private Block mBlockCreate(Sprite sprite, DInfo dinfo) {
Block newBlock = BlockUtil.create(dinfo.get(K_BLOCK_CLASS_NAME));
newBlock.setUUID(dinfo.get(K_BLOCK_ID));
if (newBlock instanceof Variable) {
((Variable) newBlock).setName(dinfo.get(K_BLOCK_LABEL_NAME));
}
sprite.getScriptPane().getChildren().add(newBlock);
return newBlock;
}
private void mBlockVariableCreate(final DInfo dinfo) {
mainController.getBlocksController().addVariable(dinfo.get(K_BLOCK_LABEL_NAME), false);
}
private void mBlockRemove(Block myBlock, DInfo dinfo) {
myBlock.remove();
}
private void mBlockMove(Block myBlock, DInfo dinfo) {
myBlock.toFront(); //クライアント状態に関わらず前面に
myBlock.initializeLink();
myBlock.move(dinfo.getInt(K_X1), dinfo.getInt(K_Y1));
}
private void mBlockAddLink(final Sprite sprite, final Block myBlock, final DInfo dinfo) {
Statement prevBlock = (Statement) getTargetBlock(sprite, dinfo.get(K_PREV_BLOCK_ID));
if (!myBlock.getUUID().equals(prevBlock.getUUID())) {
prevBlock.addLink((Statement) myBlock);
myBlock.move(dinfo.getInt(K_X1), dinfo.getInt(K_Y1));
}
}
private void mBlockAddChild(Sprite sprite, Block myBlock, DInfo dinfo) {
CodeBlock parentBlock = (CodeBlock) getTargetBlock(sprite, dinfo.get(K_PARENT_BLOCK_ID));
parentBlock.addChild((Statement) myBlock);
Statement next = ((Statement) myBlock).nextBlock;
while (next != null) {
parentBlock.addChild(next);
next = next.nextBlock;
}
parentBlock.move(parentBlock.getLayoutX(), parentBlock.getLayoutY());
parentBlock.resize();
}
private void mBlockAddEmbryo(Sprite sprite, Block myBlock, DInfo dinfo) {
CodeBlock mothorBlock = (CodeBlock) getTargetBlock(sprite, dinfo.get(K_PARENT_BLOCK_ID));
mothorBlock.addEmbryo((Condition) myBlock);
myBlock.move(dinfo.getInt(K_X1), dinfo.getInt(K_Y1));
}
private void mBlockAddVariable(Sprite sprite, Block myBlock, DInfo dinfo) {
Block mothorBlocks = getTargetBlock(sprite, dinfo.get(K_PARENT_BLOCK_ID));
if (mothorBlocks instanceof Condition) {
switch (dinfo.get(K_VALUE_POS)) {
case K_LEFT_VALUE:
((Condition) mothorBlocks).setLeftVariable((Variable) myBlock);
break;
case K_RIGHT_VALUE:
((Condition) mothorBlocks).setRightVariable((Variable) myBlock);
break;
}
myBlock.move(dinfo.getInt(K_X1), dinfo.getInt(K_Y1));
} else if (mothorBlocks instanceof Assign) {
switch (dinfo.get(K_VALUE_POS)) {
case K_LEFT_VALUE:
((Assign) mothorBlocks).setLeftVariable((Variable) myBlock);
myBlock.move(dinfo.getInt(K_X1), dinfo.getInt(K_Y1));
break;
case K_RIGHT_VALUE:
((Assign) mothorBlocks).setRightVariable((Variable) myBlock);
break;
}
myBlock.move(dinfo.getInt(K_X1), dinfo.getInt(K_Y1));
} else if (mothorBlocks instanceof Calculate) {
switch (dinfo.get(K_VALUE_POS)) {
case K_VALUE:
((Calculate) mothorBlocks).setVariable((Variable) myBlock);
break;
case K_LEFT_VALUE:
((Calculate) mothorBlocks).setLeftVariable((Variable) myBlock);
break;
}
myBlock.move(dinfo.getInt(K_X1), dinfo.getInt(K_Y1));
} else if (mothorBlocks instanceof Speech) {
if (dinfo.get(K_VALUE_POS).equals(K_LEFT_VALUE)) {
((Speech) mothorBlocks).setVariable((Variable) myBlock);
}
myBlock.move(dinfo.getInt(K_X1), dinfo.getInt(K_Y1));
}
}
private void mBlockChangeState(Block myBlock, DInfo dinfo) {
myBlock.setStatus(JsonUtil.parseJSONString(dinfo.get(K_BLOCK_STATUS)));
}
public static void sendMessage(int event, String value) {
if (mainController.getAgent() != null) {
DInfo dinfo = new DInfo(D_BLOCK);
dinfo.set(K_METHOD, event);
dinfo.set(USER_ID, mainController.getUserName());
dinfo.set(K_BLOCK_LABEL_NAME, value);
mainController.getAgent().sendNotify(dinfo);
}
}
public static void sendMessage(int event, Block block) {
BlockDialog.sendMessage(event, block, null);
}
public static void sendMessage(int event, Block block, DInfo dinfo) {
if (mainController.getAgent() != null) {
if (dinfo == null) {
dinfo = new DInfo(D_BLOCK);
}
dinfo.set(K_METHOD, event);
dinfo.set(USER_ID, mainController.getUserName());
dinfo.set(K_SPRITE_NAME, mainController.getFrontStageController().getCurrentSprite().getName());
dinfo.set(K_BLOCK_CLASS_NAME, block.getClass().getSimpleName());
dinfo.set(K_BLOCK_ID, block.getUUID());
dinfo.set(K_X1, (int) block.getLayoutX());
dinfo.set(K_Y1, (int) block.getLayoutY());
if (block instanceof Statement) {
setStatementBlock(dinfo, (Statement) block);
} else if (block instanceof Condition) {
setConditionBlock(dinfo, (Condition) block);
} else if (block instanceof Variable) {
setVariableBlock(dinfo, (Variable) block);
}
dinfo.set(K_BLOCK_STATUS, JsonUtil.convertObjectToJsonString(block.getStatus()));
mainController.getAgent().sendNotify(dinfo);
}
}
private static void setStatementBlock(DInfo dinfo, Statement statement) {
if (statement.parentBlock != null) {
dinfo.set(K_PARENT_BLOCK_ID, statement.parentBlock.getUUID());
}
if (statement.prevBlock != null) {
dinfo.set(K_PREV_BLOCK_ID, statement.prevBlock.getUUID());
}
}
private static void setConditionBlock(DInfo dinfo, Condition condition) {
if (condition.mother != null) {
dinfo.set(K_PARENT_BLOCK_ID, condition.mother.getUUID());
}
}
private static void setVariableBlock(DInfo dinfo, Variable variable) {
if (variable.mother != null) {
dinfo.set(K_PARENT_BLOCK_ID, variable.mother.getUUID());
}
dinfo.set(K_BLOCK_LABEL_NAME, variable.getName());
}
private Block getTargetBlock(Sprite sprite, String id) {
if (mainController == null) {
return null;
}
for (Node node : sprite.getScriptPane().getChildrenUnmodifiable()) {
Block block = (Block) node;
if (block.getUUID().equals(id)) {
return block;
}
}
return null;
}
}