package com.uxebu.swfparser.dump.generators;
import com.jswiff.swfrecords.ButtonCondAction;
import com.jswiff.swfrecords.actions.ActionBlockReader;
import com.jswiff.swfrecords.tags.DefineButton2;
import com.uxebu.swfparser.dump.actions.ButtonCondActionFlag;
import com.uxebu.swfparser.dump.actions.ButtonCondActionFlagMapper;
import com.uxebu.swfparser.dump.output.Writer;
import org.swfparser.ActionBlockContext;
import org.swfparser.CodeUtil;
import org.swfparser.ExecutionContext;
import org.swfparser.Operation;
import org.swfparser.StatementBlock;
import org.swfparser.exception.StatementBlockException;
import org.swfparser.operation.ByteCodeOperation;
import java.util.ArrayList;
import java.util.List;
public class DefineButton2Generator implements CodeGenerator
{
private Writer writer;
private DefineButton2 defineButton2;
public DefineButton2Generator(Writer writer)
{
this.writer = writer;
}
public void generate(ActionBlockContext context)
{
defineButton2 = (DefineButton2) context.getTag();
ButtonCondAction[] buttonActions = defineButton2.getActions();
context.setActionBlockNum(0);
if (buttonActions != null)
{
for (ButtonCondAction buttonAction : buttonActions)
{
processActions(context, buttonAction.getActions());
context.setActionBlockNum(context.getActionBlockNum() + 1);
}
}
context.setActionBlockNum(ActionBlockContext.NO_ACTION_BLOCK_NUM);
}
private void processActions(ActionBlockContext context, ActionBlockReader actionBlock)
{
StatementBlock statementBlock = CodeUtil.getStatementBlockReader();
ExecutionContext executionContext = CodeUtil.getExecutionContext();
executionContext.setTag(context.getTag());
executionContext.setFrameNumber(context.getFrameNum());
statementBlock.setExecutionContext(executionContext);
List<Operation> operations;
try
{
statementBlock.read(actionBlock.getActions());
operations = statementBlock.getOperations();
}
catch (StatementBlockException e)
{
operations = new ArrayList<Operation>();
operations.add(new ByteCodeOperation(actionBlock.getData()));
}
processOperations(context, operations);
}
private void processOperations(ActionBlockContext context, List<Operation> operations)
{
StringBuffer sourceCode = new StringBuffer();
for (Operation op : operations)
{
String endOfStatement = CodeUtil.endOfStatement(op);
String writeOp = op.getStringValue(0) + endOfStatement + "\n";
sourceCode.append(writeOp);
}
int actionBlockNumber = context.getActionBlockNum();
ButtonCondAction buttonCondAction = defineButton2.getActions()[actionBlockNumber];
ButtonCondActionFlagMapper mapper = new ButtonCondActionFlagMapper(buttonCondAction);
for (ButtonCondActionFlag buttonCondActionFlag : mapper.map())
{
writer.addButton(defineButton2.getCharacterId(), buttonCondActionFlag, sourceCode.toString());
}
}
}