var deferred = Deferred();
function StartCtrl(){
}
function CommCtrl($scope, $rootScope){
$scope.valor = 123;
$scope.getSource = function(){
return JSON.stringify($rootScope.getSource());
}
$scope.getEvaluation = function(){
return $rootScope.getEvaluation();
}
}
function IvProgCreateCtrl($scope, $rootScope, IvProgSource, $filter){
$rootScope.trackAction = function(action){
$.post(ilaParams.MA_PARAM_addresPOST+"&track=1", { trackingData: "html=1;"+action }, function(d){
});
}
$rootScope.getSource = function(){
$rootScope.trackAction("getSource");
return {
mapping: $rootScope.mapping,
src: $scope.program,
testCases: $scope.testCases
};
}
$rootScope.getEvaluation = function(){
$rootScope.trackAction("getEvaluation");
$scope.run(true);
}
$rootScope.itemCount = 0;
$scope.vars = [];
$scope.params = [];
$scope.testCases = [];
$scope.addTestCase = function(){
$rootScope.trackAction("addTestCase");
$scope.testCases.push({ input: "", output: "", currentIndex: 0 });
}
$scope.removeTestCase = function(i){
$rootScope.trackAction("removeTestCase");
$scope.testCases.splice(i, 1);
}
$rootScope.mapping = {};
$scope.getTeste = function(){
return 1;
}
// undo - redo control
$scope.historyStack = -1;
$scope.actionsHistory = [];
$scope.addSnap = true;
$scope.takeSnap = function(friendlyName, applying, sp){
if(sp){
$scope.actionsHistory.splice($scope.historyStack, $scope.actionsHistory.length-$scope.historyStack);
}
$scope.actionsHistory.push({name: friendlyName, src: JSON.stringify($scope.program)});
$scope.historyStack = $scope.actionsHistory.length;
}
$rootScope.snapshot = function(friendlyName, applying){
if(!applying){
$scope.$apply(function(){
$scope.takeSnap(friendlyName, applying, true);
});
}else{
$scope.takeSnap(friendlyName, applying, true);
}
$scope.addSnap = true;
}
$scope.undo = function(){
if($scope.historyStack>0){
if($scope.addSnap){
// salvando o estado atual
$scope.takeSnap('', 1);
$scope.historyStack--;
$scope.addSnap = false;
}
$scope.historyStack--;
var obj = JSON.parse($scope.actionsHistory[$scope.historyStack].src);
$scope.program = obj;
}
}
$scope.redo = function(){
if($scope.historyStack < $scope.actionsHistory.length-1){
$scope.historyStack++;
var obj = JSON.parse($scope.actionsHistory[$scope.historyStack].src);
$scope.program = obj;
}
}
$scope.currentFunction = 0;
$scope.program = {
programName: "firstProgram",
functions: [
{
isMain: true,
name: "Principal",
vars: {},
params: {},
type: "main", // int, void, float
nodes:[]
}/*,
{
isMain: false,
name: "fatorial",
vars: {},
varss: {
"var_1":
{ name: 'newVar1', type: 'int', initialValue: 0, id: "var_1" }
},
params: {},
type: "int", // int, void, float
nodes:[],
nodess: [
{
id: "attr_1",
type: "attr",
name: "attr",
parent: null,
variable: "",
exp: []
}
]
}*/
]
};
$scope.setCurrentFunction = function(ind){
$scope.currentFunction = ind;
}
$scope.addElVar = function(v){
v.push({
t: "var",
v: "",
o: "",
p: ''//v
});
}
$scope.addElVal = function(v){
v.push({
t: "val",
v: 0,
o: "",
p: ''//v
});
}
$scope.addElExpB = function(v){
v.push({
t: "expB",
v: {
op1: {
t: "v",
v: ""
},
op2: {
t: "v",
v: ""
},
op: ">"
},
o: "&&",
p: ''//v
});
}
$scope.isolar = function(item){
item.t = "exp";
item.v = "";
item.exp = [];
}
$scope.addExp = function(parent){
parent.push({ t: "val", v: "a", o: "+"});
}
$scope.getTemplate = function(x){
return 'partials/elements/'+x.type+'.html'+"?t="+cacheTime;
}
$scope.addParam = function(){
//var ind = $scope.params.length;
var ind = $scope.programs[$scope.currentProgram].functions[0].params.length;
//$scope.params.push({ name: 'newParam'+ind, type: 'int', initialValue: 0 } );
$scope.programs[$scope.currentProgram].functions[0].params.push({ name: 'newParam'+ind, type: 'int', initialValue: 0 } );
}
$scope.removeParam = function(v){
$scope.params.splice($scope.params.indexOf(v), 1);
}
$scope.varSetType = function(v, type){
$rootScope.trackAction("changeVarType");
var previousType = v.type;
v.type = type;
if(type=="string"){
v.initialValue = "Olá mundo!";
}else if(type=="float"){
v.initialValue = 1.0;
}else if(type=="int"){
v.initialValue = 1;
}else if(type=="boolean"){
v.initialValue = true;
}
$scope.checkChangeTypeConsequences(v, $scope.program.functions[$scope.currentFunction].nodes, previousType);
}
// quando alterar o tipo de uma variavel, checar as consequencias
$scope.checkChangeTypeConsequences = function(variable, where, previous){
angular.forEach(where, function(item, key){
if(item.type=="attr"){
if(item.variable==variable.id){
if(variable.type!=previous){
var compatibility = ["int", "float"];
if((compatibility.indexOf(variable.type)==-1)||(compatibility.indexOf(previous)==-1)){
if(where[key].exp.length>0){
where[key].exp = [];
}
}
}
}
}
if(item.nodes && item.nodes.length>0){
$scope.checkChangeTypeConsequences(variable, item.nodes);
}
});
}
$scope.addVar = function(){
$rootScope.trackAction("addVar");
// TODO: checar se alterou o valor
$rootScope.snapshot('Variável adicionada', true);
var ind = $scope.itemCount;
var id = "var"+$scope.itemCount++;
$scope.program.functions[$scope.currentFunction].vars[id] = ({ name: 'newVar'+ind, type: 'int', initialValue: 1, id: id });
}
$scope.removeVarRec = function(nodes, id){
$rootScope.trackAction("removeVar");
angular.forEach(nodes, function(node, key){
if(node.type=="write"){
if(node.variable==id){
node.variable = '';
}
}
if(node.type!="attr"){
if(node.nodes.length>0){
$scope.removeVarRec(node.nodes, id);
}
}
});
}
$scope.removeVar = function(v){
$rootScope.trackAction("removeVar");
$rootScope.snapshot('Variável removida', true);
$scope.removeVarRec($scope.program.functions[$scope.currentFunction].nodes, v.id);
delete $scope.program.functions[$scope.currentFunction].vars[v.id];
}
$scope.removeItem = function(parent, item){
$rootScope.trackAction("removeItem");
parentId = parent;
// TODO: tratar para os outros functions
if(parent=="root_0"){
parent = $scope.program.functions[0].nodes;
}else{
parent = $rootScope.mapping[parent].nodes;
}
if($.isArray(parent)) {
parent.splice(parent.indexOf(item),1);
}
if($rootScope.mapping[parentId]){
var p1 = $rootScope.mapping[parentId].nodes1;
if($.isArray(p1)) {
p1.splice(p1.indexOf(item),1);
}
var p2 = $rootScope.mapping[parentId].nodes2;
if($.isArray(p2)) {
p2.splice(p2.indexOf(item),1);
}
}
delete $rootScope.mapping[item.id];
}
$scope.isValidAttr = function(attr){
var isValid = true;
angular.forEach(attr, function(a, k){
if(a.type=="var"){
}
});
return false;
}
$scope.sortableOptions = {
handle: '.handle',
placeholder: "apps",
connectWith: ".apps-container"
};
$scope.delete = function(data) {
$rootScope.trackAction("delete");
data.nodes = [];
};
$scope.run = function(useTestCases){
cleanOutput();
$rootScope.trackAction("run="+useTestCases);
if(!$scope.validateEverything($scope.program)){
writer(" Existem campos vazios. Preencha os campos com borda vermelha para executar o algoritmo corretamente.", false);
}else{
if(useTestCases){
totalCasesEvaluated = 0;
totalCasesPassed = 0;
totalTestCases = $scope.testCases.length;
angular.forEach($scope.testCases, function(item, key){
$scope.testCases[key].currentIndex = 0;
})
testCases = $scope.testCases;
var code = "";
angular.forEach($scope.testCases, function(item, key){
code += $scope.genCode($scope.program, true, key);
});
console.log(code);
window.eval(code);
}else{
$rootScope.trackAction("run");
var code = $scope.genCode($scope.program, false, 0);
window.eval(code);
}
$("#valor").unbind('keydown');
$("#valor").keydown(function( event ) {
if ( event.which == 13 ) {
$('#readData').modal('hide');
var valor = $("#valor").val();
$("#valor").val("");
deferred.call(valor);
event.preventDefault();
}
});
$("#btnOk").unbind('click');
$("#btnOk").click(function(){
$('#readData').modal('hide');
var valor = $("#valor").val();
$("#valor").val("");
deferred.call(valor);
});
}
}
$scope.clearOutput = function(){
$rootScope.trackAction("cleanOutput");
$(".output").html("");
}
$scope.validateEverything = function(funcs){
$(".node-with-error").removeClass("node-with-error");
var ret = true;
angular.forEach(funcs.functions, function(func, key){
ret = ret && $scope.validateNode(func.nodes, func.vars);
});
return ret;
}
$scope.validateNode = function(nodes, vars){
var ret = true;
angular.forEach(nodes, function(node, key){
if (node.type=="write"){
if(node.variable==""){
$("#node"+node.id).find(".select").addClass("node-with-error");
ret = false;
}
}
if(node.type=="read"){
if(node.variable==""){
$("#node"+node.id).find(".select").addClass("node-with-error");
ret = false;
}
}
if(node.type=="for"){
if(node.forType==1){
if((node.limitType=="var")&&(node.limit=="")){
$("#node"+node.id).find(".for1").find(".select").addClass("node-with-error");
ret = false;
}
}
if(node.forType==2){
if((node.limitType=="var")&&(node.limit=="")){
$("#node"+node.id).find(".for1").find(".select").addClass("node-with-error");
ret = false;
}
if(node.using==""){
$("#node"+node.id).find(".for2").addClass("node-with-error");
ret = false;
}
}
if(node.forType==3){
if((node.limitType=="var")&&(node.limit=="")){
$("#node"+node.id).find(".for1").find(".select").addClass("node-with-error");
ret = false;
}
if(node.using==""){
$("#node"+node.id).find(".for2").addClass("node-with-error");
ret = false;
}
if((node.initialType=="var")&&(node.initial=="")){
ret = false;
}
if((node.initialType=="val")&&(node.limitType=="val")&&(node.initial>node.limit)){
ret = false;
}
if((node.stepType=="var")&&(node.step=="")){
$("#node"+node.id).find(".for3").find(".select").addClass("node-with-error");
ret = false;
}
}
}
});
return ret;
}
$scope.genCode = function(funcs, useTestCases, testCaseIndex){
var strCode = "var t"+testCaseIndex+" = function(){";
var i = 0;
angular.forEach(funcs.functions, function(func, key){
if(i++==0){
strCode+= "function "+func.name+"(){";
angular.forEach(func.vars, function(variable, key){
if(variable.type=="string"){
strCode+="var var_"+variable.id+" = \""+variable.initialValue+"\";";
}else{
strCode+="var var_"+variable.id+" = "+variable.initialValue+";";
}
});
strCode+= 'next(function(){';
strCode+='/*return deferred;*/';
strCode+='})';
// correcao automatica - false
strCode+=$scope.genNode(useTestCases, func.nodes, func.vars, testCaseIndex);
if(useTestCases){
// correcao automatica
strCode+= '.next(function(){';
//strCode+=' console.log("OUT "+getOutput());'
strCode+=' endTest('+testCaseIndex+');'
strCode+='});';
}
strCode+= "}";
if(func.type=="main"){
strCode+=func.name+"()";
}
}
});
strCode+="}; t"+testCaseIndex+"();";
return strCode;
}
$scope.genNode = function(isEvaluating, nodes, vars, testCaseIndex){
var strCode = "";
angular.forEach(nodes, function(node, key){
if(node.type=="write"){
if(node.variable!=''){
var v = $scope.program.functions[$scope.currentFunction].vars[node.variable];
strCode += ".next(function(){";
if(v.type=="boolean"){
strCode+="if(var_"+node.variable+"){ writer('Verdadeiro', "+isEvaluating+"); }else{ writer('Falso', "+isEvaluating+"); }";
}else{
strCode += "writer(";
strCode += "var_"+node.variable;
strCode += ","+isEvaluating+");";
}
strCode += "})";
}
}
if(node.type=="while"){
// while
strCode+= '.next(function(){';
//strCode+= 'var i'+node.id+ ' = 0;';
strCode+= 'function loop'+node.id+'(){';
strCode+= ' return next(function(){})'; // apenas para poder encadear
if(node.nodes.length>0){
strCode+= $scope.genNode(isEvaluating, node.nodes, vars);
}
strCode+=' .next(function(){';
//strCode+=' ++i'+node.id+';';
strCode+=' if('+$scope.genExp(node.exp, 'boolean')+'){';
strCode+=' return loop'+node.id+'();';
strCode+=' }'
strCode+=' });';
strCode+='}';
strCode+=' if('+$scope.genExp(node.exp, 'boolean')+'){';
strCode+='return loop'+node.id+'();';
strCode+='}';
strCode+='})';
}
if(node.type=="for"){
if(node.forType==1){
// for simples
strCode+= '.next(function(){';
strCode+= 'var i'+node.id+ ' = 0;';
strCode+= 'function loop'+node.id+'(){';
strCode+= ' return next(function(){})'; // apenas para poder encadear
if(node.nodes.length>0){
strCode+= $scope.genNode(isEvaluating, node.nodes, vars);
}
strCode+=' .next(function(){';
strCode+=' ++i'+node.id+';';
if(node.limitType=="val"){
strCode+=' if(i'+node.id+'<'+node.limit+'){';
}else{
strCode+=' if(i'+node.id+'<'+' var_'+node.limit+'){';
}
strCode+=' return loop'+node.id+'();';
strCode+=' }'
strCode+=' });';
strCode+='}';
if(node.limitType=="val"){
strCode+=' if(i'+node.id+'<'+node.limit+'){';
}else{
strCode+=' if(i'+node.id+'<'+' var_'+node.limit+'){';
}
strCode+='return loop'+node.id+'();';
strCode+='}';
strCode+='})';
}else if(node.forType==2){
// for mediano
strCode+= '.next(function(){';
strCode+= ' var_'+node.using+ ' = 0;';
strCode+= 'function loop'+node.id+'(){';
strCode+= ' return next(function(){})'; // apenas para poder encadear
if(node.nodes.length>0){
strCode+= $scope.genNode(isEvaluating, node.nodes, vars);
}
strCode+=' .next(function(){';
strCode+=' ++var_'+node.using+';';
if(node.limitType=="val"){
strCode+=' if(var_'+node.using+'<'+node.limit+'){';
}else{
strCode+=' if(var_'+node.using+'<'+' var_'+node.limit+'){';
}
strCode+=' return loop'+node.id+'();';
strCode+=' }'
strCode+=' });';
strCode+='}';
if(node.limitType=="val"){
strCode+=' if(var_'+node.using+'<'+node.limit+'){';
}else{
strCode+=' if(var_'+node.using+'<'+' var_'+node.limit+'){';
}
strCode+='return loop'+node.id+'();';
strCode+='}';
strCode+='})';
}else if(node.forType==3){
// for hard rs
strCode+= '.next(function(){';
if(node.initialType=="val"){
strCode+= ' var_'+node.using+ ' = '+node.initial+';';
}else{
strCode+= ' var_'+node.using+ ' = var_'+node.initial+';';
}
strCode+= 'function loop'+node.id+'(){';
strCode+= ' return next(function(){})'; // apenas para poder encadear
if(node.nodes.length>0){
strCode+= $scope.genNode(isEvaluating, node.nodes, vars);
}
strCode+=' .next(function(){';
if(node.stepType=="val"){
strCode+=' var_'+node.using+'+= '+node.step+';';
}else{
strCode+=' var_'+node.using+'+= var_'+node.step+';';
}
if(node.limitType=="val"){
strCode+=' if(var_'+node.using+'<'+node.limit+'){';
}else{
strCode+=' if(var_'+node.using+'<'+' var_'+node.limit+'){';
}
strCode+=' return loop'+node.id+'();';
strCode+=' }'
strCode+=' });';
strCode+='}';
if(node.limitType=="val"){
strCode+=' if(var_'+node.using+'<'+node.limit+'){';
}else{
strCode+=' if(var_'+node.using+'<'+' var_'+node.limit+'){';
}
strCode+='return loop'+node.id+'();';
strCode+='}';
strCode+='})';
}
}
if(node.type=="attr"){
if(node.variable!=""){
strCode+= '.next(function () {';
strCode+=" var_"+node.variable+"=";
strCode+=" ("+$scope.genExp(node.exp, vars[node.variable].type)+")";
strCode+=" ;";
strCode+= '})';
}
}
if(node.type=="read"){
var v = $scope.program.functions[$scope.currentFunction].vars[node.variable];
if(!isEvaluating){
strCode+= '.next(function () {';
strCode+= ' $("#msgRead").html("'+node.message+'");';
strCode+= ' $("#readData").modal();';
strCode+= ' $("#valor").focus();';
strCode+= ' return deferred;';
strCode+= '}).';
strCode+= 'next(function(a){';
strCode+= ' console.log("Valor lido: "+a);';
strCode+= '/* '+v.type+' */';
}else{
strCode+= '.next(function () {';
strCode+= ' var a = "'+readerInput(testCaseIndex)+'";';
}
if(v.type=="int"){
strCode+= " var_"+node.variable +" = parseInt(a);";
}else if(v.type=="float"){
strCode+= " var_"+node.variable +" = parseFloat(a); /* pq cai aqui */";
}else if(v.type=="boolean"){
// tratar boolean depois
strCode+= " var_"+node.variable +" = a;";
}else if(v.type=="string"){
// tratar boolean depois
strCode+= " var_"+node.variable +" = a;";
}else{
strCode+= " var_"+node.variable +" = a; ";
}
strCode+= '})';
}
if(node.type=="if"){
strCode+= '.next(function () {';
strCode+= 'if('+$scope.genExp(node.exp, 'boolean')+'){';
strCode+= 'return next(function () {})'+$scope.genNode(isEvaluating, node.nodes1, vars);
strCode+= '}else{';
strCode+= 'return next(function () {})'+$scope.genNode(isEvaluating, node.nodes2, vars);
strCode+= '}';
strCode+= '})';
}
});
return strCode;
}
$scope.genExp = function(exp, type){
var strCode = "";
console.log(exp);
angular.forEach(exp, function(ex, key){
if(ex.t == "var"){
strCode+=" var_"+ex.v+" ";
}else if(ex.t == "val"){
if(type=="string"){
strCode+=" \" "+ex.v+"\" ";
}else{
strCode+=" "+ex.v+" ";
}
}else if(ex.t=="exp"){
strCode+=" ( "+$scope.genExp(ex.v, type)+" ) ";
}else if(ex.t=="expB"){
strCode+=" ( "+$scope.genExp(ex.v, type)+" ) ";
}else if(ex.t=="op"){
strCode+= ex.v;
}else if(ex.t=="opB"){
strCode+= ex.v;
}
});
return strCode;
}
$scope.changeForType = function(node, v){
node.forType +=v;
}
$scope.changeForValue = function(node){
node.isValue = !node.isValue;
if(!node.isValue){
node.simpleVariable = "";
}
writer(node.isValue, false);
}
$scope.childrenVisible = function(node){
node.isChildrenVisible = !node.isChildrenVisible;
}
$scope.add = function(parent, parentId, type, name) {
$rootScope.trackAction("add;type="+type);
var newNode = {
id: $scope.itemCount++,
type: type,
name: name,
nodes: [],
parent: parentId
};
// especifico de cada estrutura
if(type=="if"){
newNode.id = "if_"+newNode.id;
newNode.exp = [/*
{ t: 'expB',
v: [{"t":"val","v":""},{"t":"opB","v":""},{"t":"val","v":""}]
}*/
];
newNode.isChildrenVisible = true;
newNode.nodes1 = [];
newNode.nodes2 = [];
}
if(type=="read"){
newNode.id = "read_"+newNode.id;
newNode.message = "Por favor digite um valor:";
newNode.variable = "";
}
if(type=="write"){
newNode.id = "write_"+newNode.id;
newNode.variable = "";
}
if(type=="while"){
newNode.id = "while_"+newNode.id;
newNode.exp = [];
newNode.isChildrenVisible = true;
newNode.nodes = [];
}
if(type=="for"){
newNode.id = "for_"+newNode.id;
newNode.forType = 1; // 1 SIMPLE, 2 +-, 3 COMPLETE
newNode.initial = 1;
newNode.initialType = "val";
newNode.limit = 5;
newNode.limitType = "val";
newNode.using = "";
newNode.step = 1;
newNode.stepType = "val";
newNode.isChildrenVisible = true;
newNode.times = 5;
newNode.timesType = 5;
newNode.simple = true;
newNode.isValue = true;
newNode.simpleVariable = "";
newNode.initialValue = 0;
newNode.endValue = 5;
newNode.increment = 1;
newNode.variable = "";
}
if(type=="attr"){
newNode.id = "attr_"+newNode.id;
newNode.variable = "";
//newNode.exp = [];
/*newNode.exp = {
op1: '',
op1T : '',
op: '',
op2: '',
op2T: ''
};*/
delete newNode.nodes;
newNode.exp = [];
newNode.isLocked = false;
}
parent.push(newNode);
$rootScope.mapping[newNode.id] = newNode;
};
$scope.save = function(){
$.post('save.php', { src: JSON.stringify($scope.program) }, function(id) {
$("body").append("");
});
}
if(ilaParams.MA_PARAM_Proposition!=null){
$.get(ilaParams.MA_PARAM_Proposition, function(d){
if(d!=null){
$scope.mapping = d.mapping;
$scope.program = d.src;
$scope.testCases = d.testCases;
$scope.$apply()
}
}, "json");
}
}
function IvProgAbertoCtrl($scope){
$scope.delete = function(data) {
data.nodes = [];
};
$scope.add = function(data) {
var post = data.nodes.length + 1;
var newName = data.name + '-' + post;
data.nodes.push({name: newName,nodes: []});
};
$scope.tree = [{name: "Node", nodes: []}];
}