Browse Source

Merge branch 'improveTextualView' of LInE/ivprog into master

Lucas de Souza 5 years ago
parent
commit
f6dbaf57d9

+ 3 - 0
css/ivprog-editor.css

@@ -0,0 +1,3 @@
+.CodeMirror {
+  height: 100% !important;
+}

+ 18 - 1
css/ivprog-visual-1.0.css

@@ -20,6 +20,12 @@ body {
 	overflow-x: auto;
 }
 
+.ivprog_textual_panel {
+	height: 95%;
+	overflow: auto;
+	overflow-x: auto;
+}
+
 .ivprog_textual_code {
 	width: 100%;
 	min-height: 500px;
@@ -478,8 +484,10 @@ div.function_name_div_updated:active,
 }
 
 .character_equals {
-	vertical-align: sub;
     font-size: 150%;
+    display: inline;
+    margin-left: 3px;
+    margin-right: -2px;
 }
 
 .yellow.icon.times.remove_global,
@@ -996,4 +1004,13 @@ div.ui.checkbox.transition.visible {
 	font-style: italic;
 	margin-left: 1px;
 	margin-right: 1px;
+}
+
+.disabled {
+	pointer-events: none;
+}
+
+.dimmer_content_message {
+	color: white;
+	display: none;
 }

+ 2 - 1
grammar/en/ivprog.g4

@@ -129,7 +129,8 @@ COMMA
   ;
 
 EQUAL
-  : '='
+  : '<-'
+  | '←'
   ;
 
 SUM_OP

+ 2 - 1
grammar/es/ivprog.g4

@@ -129,7 +129,8 @@ COMMA
   ;
 
 EQUAL
-  : '='
+  : '<-'
+  | '←'
   ;
 
 SUM_OP

+ 2 - 1
grammar/pt/ivprog.g4

@@ -129,7 +129,8 @@ COMMA
   ;
 
 EQUAL
-  : '='
+  : '<-'
+  | '←'
   ;
 
 SUM_OP

+ 7 - 0
i18n/en/ui.json

@@ -25,6 +25,7 @@
   "new_variable": "variable",
   "new_global": "global",
   "new_function": "new_function",
+  "matrix": "matrix",
   "vector": "vector",
   "text_comment_start": "Initial comment of function...",
   "text_comment_main": "This is the main function...",
@@ -43,9 +44,15 @@
   "text_command_do":"do",
   "text_code_switch": "switch",
   "text_code_case": "case",
+  "text_config_programming":"Programming",
+  "text_config_programming_both":"Visual and textual",
+  "text_config_programming_textual":"Textual",
+  "text_config_programming_visual":"Visual",
   "text_logic_expression": "Logic Expression",
   "text_arithmetic_expression": "Relational Expression",
   "text_iftrue": "If true then",
+  "text_message_error_activity_file": "There was an error processing the activity. <br>Please reload the page and try again.",
+  "text_message_error_activity_reload": "Reload",
   "text_receives": "receives",
   "text_repeatNtimes": "Repeat N times",
   "text_return":"return",

+ 7 - 0
i18n/es/ui.json

@@ -25,6 +25,7 @@
   "new_variable": "variable",
   "new_global": "global",
   "new_function": "new_function",
+  "matrix": "matrix",
   "vector": "vector",
   "text_comment_start": "Initial comment of function...",
   "text_comment_main": "This is the main function...",
@@ -43,9 +44,15 @@
   "text_command_do":"do",
   "text_code_switch": "switch",
   "text_code_case": "case",
+  "text_config_programming":"Programming",
+  "text_config_programming_both":"Visual and textual",
+  "text_config_programming_textual":"Textual",
+  "text_config_programming_visual":"Visual",
   "text_logic_expression": "Logic Expression",
   "text_arithmetic_expression": "Relational Expression",
   "text_iftrue": "If true then",
+  "text_message_error_activity_file": "There was an error processing the activity. <br>Please reload the page and try again.",
+  "text_message_error_activity_reload": "Reload",
   "text_receives": "receives",
   "text_repeatNtimes": "Repeat N times",
   "text_return":"return",

+ 6 - 1
i18n/pt/error.json

@@ -88,5 +88,10 @@
   "test_case_failed_exception": "Caso de teste $0 falhou: $1",
   "invalid_type_conversion": "O valor $0 não pode ser convertido para o tipo $1",
   "invalid_read_type":"A entrada \"$0\" não é do tipo $1, que é o tipo da variável <span class='ivprog-error-varname'>$2</span>.",
-  "invalid_read_type_array":"A entrada \"$0\" não é do tipo $1, que é o tipo aceito pela variável <span class='ivprog-error-varname'>$2</span> que é um $3."
+  "invalid_read_type_array":"A entrada \"$0\" não é do tipo $1, que é o tipo aceito pela variável <span class='ivprog-error-varname'>$2</span> que é um $3.",
+  "inform_valid_identifier": "Informe um nome válido! O nome não pode ser uma palavra reservadoa e deve começar com letras e conter apenas letras, números e _",
+  "inform_valid_global_duplicated": "Já existe uma variável global com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.",
+  "inform_valid_variable_duplicated" : "Já existe uma variável com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos.",
+  "inform_valid_function_duplicated" : "Já existe uma função com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.",
+  "inform_valid_param_duplicated" : "Já existe um parâmetro com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos."
 }

+ 28 - 57
i18n/pt/ui.json

@@ -10,24 +10,25 @@
   "btn_break":"Pare",
   "btn_case":"Caso",
   "start": "inicio",
-  "void": "vazio",
-  "integer": "inteiro",
-  "and": "E",
-  "or": "OU",
-  "not": "nao",
-  "real": "real",
+  "type_void": "vazio",
+  "type_integer": "inteiro",
+  "logic_operator_and": "E",
+  "logic_operator_or": "OU",
+  "logic_operator_not": "nao",
+  "type_real": "real",
   "program": "programa",
-  "text": "cadeia",
-  "text_start": "texto",
-  "boolean": "logico",
-  "true": "verdadeiro",
-  "false": "falso",
+  "type_text": "cadeia",
+  "textvar_default_value": "texto",
+  "type_boolean": "logico",
+  "logic_value_true": "verdadeiro",
+  "logic_value_false": "falso",
   "variable": "Variável",
   "command": "Comando",
   "new_parameter": "parametro",
   "new_variable": "variavel",
   "new_global": "global",
   "new_function": "nova_funcao",
+  "matrix": "matriz",
   "vector": "vetor",
   "text_comment_start": "Comentário inicial da função...",
   "text_comment_main": "Esta é a função principal...",
@@ -38,9 +39,9 @@
   "text_return":"retorne",
   "text_btn_return":"Retorno",
   "text_comment": "Comentário",
-  "join_or": "ou",
-  "matrix_string": "matriz de $0",
-  "vector_string": "vetor de $0",
+  "string_join_or": "ou",
+  "matrix_info_string": "matriz de $0",
+  "vector_info_string": "vetor de $0",
   "text_attribution": "Atribuição",
   "text_if":"se",
   "text_break":"pare",
@@ -51,9 +52,15 @@
   "text_command_do":"faça",
   "text_code_switch": "escolha",
   "text_code_case": "caso",
+  "text_config_programming":"Programação",
+  "text_config_programming_both":"Visual e textual",
+  "text_config_programming_textual":"Textual",
+  "text_config_programming_visual":"Visual",
   "text_logic_expression": "Expressão Lógica",
   "text_arithmetic_expression": "Expressão Relacional",
   "text_iftrue": "Se verdadeiro então",
+  "text_message_error_activity_file": "Aconteceu um erro ao processar a atividade. <br> Recarregue a página para tentar novamente.",
+  "text_message_error_activity_reload": "Recarregar",
   "text_repeatNtimes": "Repita N vezes",
   "text_receives": "recebe",
   "text_whiletrue": "Enquanto verdadeiro",
@@ -80,10 +87,10 @@
   "text_header_ivprog_functions": "Funções do iVProg",
   "text_menu_functions_math":"Matemática",
   "text_menu_functions_text":"Texto",
-  "text_menu_functions_arrangement":"Arranjo",
+  "text_menu_functions_array":"Arranjo",
   "text_menu_functions_conversion":"Conversão",
-  "text_none_variable":"Nenhuma variável declarada",
-  "text_none_variable_instruction":"Antes de utilizar uma variável, é necessário criá-la",
+  "text_no_variable":"Nenhuma variável declarada",
+  "text_no_variable_instruction":"Antes de utilizar uma variável, é necessário criá-la",
   "text_ivprog_description":"Programação Visual interativa na Internet",
   "tooltip_visual": "Programação visual",
   "tooltip_textual": "Programação textual",
@@ -95,51 +102,15 @@
   "tooltip_evaluate": "Avaliar o programa",
   "tooltip_help": "Ajuda",
   "tooltip_add_global": "Adicionar variável global",
-  "tooltip_minimize": "Ocultar os elementos da função",
-  "tooltip_console": "Abrir/fechar o terminal",
+  "tooltip_hide_function": "Ocultar os elementos da função",
   "var_menu_select_var": "Selecione uma variável",
   "var_menu_select_all": "Selecione",
   "var_menu_select_function": "Selecione uma função",
   "expression_menu_select": "Construir uma expressão lógica",
-  "math": "Matematica",
-  "text_t": "Texto",
-  "inform_valid_name": "Informe um nome válido!",
   "inform_valid_content": "Informe o conteúdo!",
   "inform_valid_expression": "Construa uma expressão lógica!",
-  "inform_valid_name_duplicated": "Este nome já está em uso por outra função!",
-  "inform_valid_global_duplicated": "Já existe uma variável global com o nome informado.",
-  "inform_valid_variable_duplicated" : "Já existe uma variável local com o nome informado.",
-  "arrangement": "Arranjo",
-  "conversion": "Conversao",
-  "terminal_clear":"Limpa o terminal removendo todos os textos",
-  "terminal_show":"Exibe o terminal caso esteja escondido",
-  "terminal_hide":"Esconde o terminal caso não esteja escondido",
-  "$sin": "seno",
-  "$cos": "cosseno",
-  "$tan": "tangente",
-  "$sqrt": "raiz_quadrada",
-  "$pow": "potencia",
-  "$log": "logaritmo",
-  "$abs": "modulo",
-  "$negate": "trocar_sinal",
-  "$invert": "inverter_valor",
-  "$max": "maximo",
-  "$min": "minimo",
-  "$rand": "numero_aleatorio",
-  "$substring": "subcadeia",
-  "$length": "comprimento",
-  "$uppercase": "caixa_alta",
-  "$lowercase": "caixa_baixa",
-  "$charAt": "texto_na_posicao",
-  "$numElements": "total_de_elementos",
-  "$matrixLines": "total_de_linhas",
-  "$matrixColumns": "total_de_colunas",
-  "$isReal": "e_real",
-  "$isInt": "e_inteiro",
-  "$isBool": "e_logico",
-  "$castReal": "como_real",
-  "$castInt": "como_inteiro",
-  "$castBool": "como_logico",
-  "$castString": "como_cadeia",
+  "tooltip_terminal_clear":"Limpa o terminal removendo todos os textos",
+  "tooltip_terminal_show":"Exibe o terminal caso esteja escondido",
+  "tooltip_terminal_hide":"Esconde o terminal caso não esteja escondido",
   "text_ivprog_version":"Versão"
 }

+ 1 - 0
js/ast/ivprogParser.js

@@ -95,6 +95,7 @@ export class IVProgParser {
   }
 
   parseProgram () {
+    this.consumeNewLines();
     const token = this.getToken();
     let globalVars = [];
     let functions = [];

+ 64 - 16
js/iassign-integration-functions.js

@@ -30,13 +30,18 @@ function getAnswer () {
   if (iLMparameters.iLM_PARAM_SendAnswer == 'false') {
     // Montar o retorno com a resposta do aluno
     var contentToSend = previousContent.split("\n::algorithm::")[0];
-    contentToSend += '\n::algorithm::\n';
-    contentToSend += JSON.stringify(window.program_obj, function(key, value) {
-      if (key == 'dom_object') {
-          return;
-      }
-      return value; 
-    });
+    contentToSend += '\n::algorithm::';
+
+    if (settingsProgrammingTypes == "textual") {
+      contentToSend +=  ivprogCore.CodeEditor.getCode();
+    } else {
+      contentToSend += JSON.stringify(window.program_obj, function(key, value) {
+        if (key == 'dom_object') {
+            return;
+        }
+        return value; 
+      });
+    }
 
     contentToSend += '\n::logs::';
     contentToSend += getTrackingLogs();
@@ -45,14 +50,15 @@ function getAnswer () {
 
   } else {
     // Montar o retorno com a criação da atividade do professor
-    var ret = ' { ' + prepareTestCases() 
+    var ret = ' { ' + prepareTestCases()
+        + ',\n"settings_programming_type": \n' + JSON.stringify($('form[name="settings_programming_type"]').serializeArray()) 
         + ',\n"settings_data_types": \n' + JSON.stringify($('form[name="settings_data_types"]').serializeArray()) 
         + ',\n"settings_commands": \n' + JSON.stringify($('form[name="settings_commands"]').serializeArray()) 
         + ',\n"settings_functions": \n' + JSON.stringify($('form[name="settings_functions"]').serializeArray()) 
         + ' } ';
 
     if ($("input[name='include_algo']").is(':checked')) {
-      ret += '\n::algorithm::\n';
+      ret += '\n::algorithm::';
       ret += JSON.stringify(window.program_obj, function(key, value) {
           
           if (key == 'dom_object') {
@@ -114,11 +120,11 @@ function getEvaluation () {
   }
 }
 
-
-//var testCases = null;
+//var testCases = null
 var settingsDataTypes = null;
 var settingsCommands = null;
 var settingsFunctions = null;
+var settingsProgrammingTypes = null;
 var algorithm_in_ilm = null;
 var previousContent = null;
 
@@ -152,6 +158,8 @@ function prepareActivityToEdit (ilm_cont) {
   // Ver arquivo js/util/iassignHelpers.js
   var content = ivprogCore.prepareActivityToStudentHelper(ilm_cont);
   var testCases = ivprogCore.getTestCases();
+
+  settingsProgrammingTypes = content.settingsProgrammingType;
   settingsDataTypes = content.settingsDataTypes;
   settingsCommands = content.settingsCommands;
   settingsFunctions = content.settingsFunctions;
@@ -166,6 +174,8 @@ function prepareActivityToEdit (ilm_cont) {
     includePreviousAlgorithm();
     renderAlgorithm();
   }
+
+  ivprogTextualOrVisual();
 }
 
 function parsePreviousAlgorithm () {
@@ -174,6 +184,10 @@ function parsePreviousAlgorithm () {
 }
 
 function includePreviousAlgorithm () {
+  if (settingsProgrammingTypes == "textual") {
+    return;
+  }
+
   parsePreviousAlgorithm();
 
   window.watchW.watch(window.program_obj.globals, function(){
@@ -224,6 +238,7 @@ function prepareActivityToStudent (ilm_cont) {
     var content = ivprogCore.prepareActivityToStudentHelper(ilm_cont);
     // Casos de testes agora são delegados ao tratamento apropriado pela função acima
     // var testCases = content.testcases;
+    settingsProgrammingTypes = content.settingsProgrammingType;
     settingsDataTypes = content.settingsDataTypes;
     settingsCommands = content.settingsCommands;
     settingsFunctions = content.settingsFunctions;
@@ -234,6 +249,8 @@ function prepareActivityToStudent (ilm_cont) {
     }
     $('.assessment_button').removeClass('disabled');
     renderAlgorithm();
+
+    ivprogTextualOrVisual();
 }
 
 // Função para organizar se para criação, visualização ou resolução de atividade
@@ -275,6 +292,27 @@ function prepareEnvironment () {
   }
 }
 
+function ivprogTextualOrVisual () {
+
+  if (settingsProgrammingTypes) {
+    if (settingsProgrammingTypes == "textual") {
+      $('.ivprog_visual_panel').css('display', 'none'); 
+      $('.ivprog_textual_panel').css('display', 'block');
+      $('.ivprog_textual_panel').removeClass('loading');
+
+      $('.visual_coding_button').removeClass('active');
+      $('.textual_coding_button').addClass('active'); 
+      $('.visual_coding_button').addClass('disabled');
+
+      ivprogCore.CodeEditor.setCode(algorithm_in_ilm);
+      ivprogCore.CodeEditor.disable(false);
+    }
+    if (settingsProgrammingTypes == "visual") {
+      
+    }
+  }
+}
+
 function iassingIntegration () {
 
   // Disable by default...
@@ -406,15 +444,22 @@ function updateTestCaseCounter () {
     });
 }
 
+
 function prepareTableSettings (div_el) {
 
+  div_el.append('<h4 class="ui header">'+LocalizedStrings.getUI('text_config_programming')+'</h4>');
+  div_el.append('<form name="settings_programming_type"><div class="ui stackable five column grid">'
+    +'<div class="column"><div class="ui radio"><input type="radio" name="programming_type" id="programming_textual" value="textual" tabindex="0" class="hidden small"><label for="programming_textual">'+LocalizedStrings.getUI('text_config_programming_textual')+'</label></div></div>'
+    +'<div class="column"><div class="ui radio"><input type="radio" name="programming_type" id="programming_visual" value="visual" checked tabindex="0" class="hidden small"><label for="programming_visual">'+LocalizedStrings.getUI('text_config_programming_visual')+'</label></div></div>'
+    +'</div></form>');
+
   div_el.append('<h4 class="ui header">'+LocalizedStrings.getUI('text_teacher_data_types')+'</h4>');
   div_el.append('<form name="settings_data_types"><div class="ui stackable five column grid">'
-    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="integer_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('integer')+'</label></div></div>'
-    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="real_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('real')+'</label></div></div>'
-    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="text_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('text')+'</label></div></div>'
-    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="boolean_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('boolean')+'</label></div></div>'
-    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="void_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('void')+'</label></div></div>'
+    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="integer_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('type_integer')+'</label></div></div>'
+    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="real_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('type_real')+'</label></div></div>'
+    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="text_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('type_text')+'</label></div></div>'
+    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="boolean_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('type_boolean')+'</label></div></div>'
+    +'<div class="column"><div class="ui checkbox"><input type="checkbox" name="void_data_type" checked tabindex="0" class="hidden small"><label>'+LocalizedStrings.getUI('type_void')+'</label></div></div>'
     +'</div></form>');
 
   div_el.append('<h4 class="ui header">'+LocalizedStrings.getUI('text_teacher_commands')+'</h4>');
@@ -526,6 +571,7 @@ function teacherAutoEval (data) {
     var content = ivprogCore.prepareActivityToStudentHelper(data);
     // Casos de testes agora são delegados ao tratamento apropriado pela função acima
     // var testCases = content.testcases;
+    settingsProgrammingTypes = content.settingsProgrammingType; 
     settingsDataTypes = content.settingsDataTypes;
     settingsCommands = content.settingsCommands;
     settingsFunctions = content.settingsFunctions;
@@ -535,5 +581,7 @@ function teacherAutoEval (data) {
       parsePreviousAlgorithm();
       ivprogCore.autoEval(originalData, parent.getEvaluationCallback);
     }
+
+    ivprogTextualOrVisual();
   });
 }

+ 15 - 8
js/io/domConsole.js

@@ -39,7 +39,8 @@ export class DOMConsole {
     return 3;
   }
 
-  constructor (elementID) {
+  constructor (elementID, disableMarginTop = false) {
+    this.disableMarginTop = disableMarginTop;
     this.input = null;
     this.cursorInterval = null;
     this.idleInterval = null;
@@ -119,9 +120,9 @@ export class DOMConsole {
     this.showBtn = bashNode.querySelector('#ivprog-console-showbtn');
     this._setupCursor();
     //Jquery tooltips....
-    $(this.clearBtn).popup({content:LocalizedStrings.getUI("terminal_clear")});
-    $(this.showBtn).popup({content:LocalizedStrings.getUI("terminal_show")});
-    $(this.hideBtn).popup({content:LocalizedStrings.getUI("terminal_hide")});
+    $(this.clearBtn).popup({content:LocalizedStrings.getUI("tooltip_terminal_clear")});
+    $(this.showBtn).popup({content:LocalizedStrings.getUI("tooltip_terminal_show")});
+    $(this.hideBtn).popup({content:LocalizedStrings.getUI("tooltip_terminal_hide")});
   }
 
   _setupCursor () {
@@ -198,10 +199,16 @@ export class DOMConsole {
   }
 
   getOutputText (text) {
+    if(text.trim().length == 0) {
+      text = "&nbsp;";
+    }
     return `<span>${text}</span>`;
   }
 
   getUserInputText (text) {
+    if(text.trim().length == 0) {
+      text = "&nbsp;";
+    }
     return `<i class="icon keyboard outline" style="float:left"></i><span>${text}</span>`;
   }
 
@@ -213,8 +220,7 @@ export class DOMConsole {
   focus () {
     this.termDiv.style.display = 'block';
     // Is in draggable mode?
-    console.log(this.parent.style.top.length);
-    if(this.parent.style.top.length == 0) {
+    if(!this.disableMarginTop && this.parent.style.top.length == 0) {
       this.parent.style.marginTop = "-160px";
     }
     if(!isElementInViewport(this.termDiv))
@@ -224,7 +230,7 @@ export class DOMConsole {
 
   hide () {
     // Is in draggable mode?
-    if(this.parent.style.top.length == 0) {
+    if(!this.disableMarginTop && this.parent.style.top.length == 0) {
       this.parent.style.marginTop = "0";
     }
     this.termDiv.style.display = 'none';
@@ -297,7 +303,8 @@ export class DOMConsole {
   sendOutput (text) {
     const output = ""+text;
     output.split("\n").forEach(t => {
-      t = t.replace(/\t/g,'&#9;');
+      t = t.replace(/\t/g,'&nbsp;&nbsp;');
+      t = t.replace(/\s/g,"&nbsp;");
       this.write(t)
     });
   }

+ 10 - 1
js/main.js

@@ -6,6 +6,14 @@ import * as LocalizedStringsService from './services/localizedStringsService';
 import { i18nHelper } from "./services/i18nHelper";
 import { ActionTypes, getLogs, getLogsAsString, registerClick, registerUserEvent, parseLogs } from "./services/userLog";
 import { prepareActivityToStudentHelper, autoEval } from "./util/iassignHelpers";
+import * as CodeEditorAll from "./visualUI/text_editor";
+
+const CodeEditor = {
+  setCode: CodeEditorAll.setCode,
+  getCode: CodeEditorAll.getCode,
+  updateEditor: CodeEditorAll.updateEditor,
+  disable: CodeEditorAll.disable
+};
 
 const i18n = i18nHelper.i18n
 const LocalizedStrings = LocalizedStringsService.getInstance();
@@ -27,5 +35,6 @@ export {
   registerClick,
   registerUserEvent,
   parseLogs,
-  ActionTypes
+  ActionTypes,
+  CodeEditor
 }

+ 3 - 1
js/processor/semantic/semanticAnalyser.js

@@ -467,8 +467,10 @@ export class SemanticAnalyser {
       }
       if(cmd.ifFalse instanceof IfThenElse) {
         return this.checkCommands(type, cmd.ifTrue.commands, optional) && this.checkCommand(type, cmd.ifFalse, optional);
-      } else {
+      } else if(cmd.ifFalse != null) {
         return this.checkCommands(type, cmd.ifTrue.commands, optional) && this.checkCommands(type, cmd.ifFalse.commands,optional);
+      } else {
+        return this.checkCommands(type, cmd.ifTrue.commands, optional);
       }
 
     } else if (cmd instanceof FunctionCall) {

+ 2 - 1
js/runner.js

@@ -20,7 +20,8 @@ const ivprogLexer = LanguageService.getCurrentLexer();
 // }
 // const anaSin = new IVProgParser(input, ivprogLexer);
 const editor = new JsonEditor('#json-renderer', {});
-const domConsole = new DOMConsole("#console");
+const domConsole = new DOMConsole("#console", true);
+domConsole.hide();
 // proc.interpretAST().then( sto => {
 //   console.log(sto.applyStore('a'));
 // }).catch(e => console.log(e));

+ 15 - 6
js/services/localizedStringsService.js

@@ -1,5 +1,6 @@
-import { LanguageService } from "./languageService";
 import line_i18n from 'line-i18n';
+import { LanguageService } from "./languageService";
+import { LanguageDefinedFunction } from "./../processor/definedFunctions";
 import Langs from './../../i18n';
 import { Operators } from "./../ast/operators";
 
@@ -12,13 +13,13 @@ class IVProgLocalizedStrings extends line_i18n.LocalizedStrings {
   translateType (type, dim) {
     switch (dim) {
       case 0:
-        return this.getUI(type);
+        return this.getUI(`type_${type}`);
       default:
-        const transType = this.getUI(type);
+        const transType = this.getUI(`type_${type}`);
         if(dim === 1)
-          return this.getUI("vector_string", [transType])
+          return this.getUI("matrix_info_string", [transType])
         else
-          return this.getUI("matrix_string", [transType])
+          return this.getUI("vector_info_string", [transType])
     }
   }
   
@@ -27,11 +28,19 @@ class IVProgLocalizedStrings extends line_i18n.LocalizedStrings {
       case Operators.AND.ord:
       case Operators.OR.ord:
       case Operators.NOT.ord:
-        return this.getUI(op.value);
+        return this.getUI(`logic_operator_${op.value}`);
       default:
         return op.value;
     }
   }
+
+  translateInternalFunction (name, category = null) {
+    if (category == null) {
+      return LanguageDefinedFunction.getLocalName(name);
+    } else {
+      return LanguageDefinedFunction.getLocalName(`${category}.${name}`);
+    }
+  }
 }
 
 export const LocalizedStrings = Object.freeze(new IVProgLocalizedStrings(LanguageService, Langs, true));

+ 113 - 0
js/util/editorMode.js

@@ -0,0 +1,113 @@
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("codemirror/lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["codemirror/lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.defineMode("ivprog", function() {
+  function words(str) {
+    var obj = {}, words = str.split(" ");
+    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+    return obj;
+  }
+  var keywords = words(
+    "programa E OU nao senao se " +
+    "enquanto faca pare para retorne funcao const " +
+    "contrario caso escolha");
+  var atoms = words("verdadeiro falso");
+  var types = words("inteiro logico cadeia real vazio")
+
+  var isOperatorChar = /[+\-*%=<>!\/]/;
+
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == "#" && state.startOfLine) {
+      stream.skipToEnd();
+      return "meta";
+    }
+    if (ch == '"') {
+      state.tokenize = tokenString(ch);
+      return state.tokenize(stream, state);
+    }
+    if (ch == "/" && stream.eat("*")) {
+      state.tokenize = tokenComment;
+      return tokenComment(stream, state);
+    }
+    if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
+      return null;
+    }
+    if (/\d/.test(ch)) {
+      stream.eatWhile(/[\w\.]/);
+      return "number";
+    }
+    if (ch == "/") {
+      if (stream.eat("/")) {
+        stream.skipToEnd();
+        return "comment";
+      }
+    }
+    if (isOperatorChar.test(ch)) {
+      stream.eatWhile(isOperatorChar);
+      return "operator";
+    }
+    stream.eatWhile(/[\w\$_]/);
+    var cur = stream.current();
+    if (keywords.propertyIsEnumerable(cur)) return "keyword";
+    if (types.propertyIsEnumerable(cur)) return "type";
+    if (atoms.propertyIsEnumerable(cur)) return "atom";
+    return "variable";
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, next, end = false;
+      while ((next = stream.next()) != null) {
+        if (next == quote && !escaped) {end = true; break;}
+        escaped = !escaped && next == "\\";
+      }
+      if (end || !escaped) state.tokenize = null;
+      return "string";
+    };
+  }
+
+  function tokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = null;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return "comment";
+  }
+
+  // Interface
+
+  return {
+    startState: function() {
+      return {tokenize: null};
+    },
+
+    token: function(stream, state) {
+      if (stream.eatSpace()) return null;
+      var style = (state.tokenize || tokenBase)(stream, state);
+      if (style == "comment" || style == "meta") return style;
+      return style;
+    },
+
+    electricChars: "{}",
+    blockCommentStart: "/*",
+    blockCommentEnd: "*/",
+    blockCommentContinue: " * ",
+    lineComment: "//",
+  };
+});
+
+CodeMirror.defineMIME("text/x-ivprog", "ivprog");
+
+});

+ 317 - 0
js/util/editorMode2.js

@@ -0,0 +1,317 @@
+import { getCodeEditorModeConfig } from "./utils";
+
+export function CodeEditorMode (CodeMirror) {
+  "use strict";
+
+  function Context(indented, column, type, info, align, prev) {
+    this.indented = indented;
+    this.column = column;
+    this.type = type;
+    this.info = info;
+    this.align = align;
+    this.prev = prev;
+  }
+  function pushContext(state, col, type, info) {
+    var indent = state.indented;
+    if (state.context && state.context.type == "statement" && type != "statement")
+      indent = state.context.indented;
+    return state.context = new Context(indent, col, type, info, null, state.context);
+  }
+  function popContext(state) {
+    var t = state.context.type;
+    if (t == ")" || t == "]" || t == "}")
+      state.indented = state.context.indented;
+    return state.context = state.context.prev;
+  }
+
+  function typeBefore(stream, state, pos) {
+    if (state.prevToken == "variable" || state.prevToken == "type") return true;
+    if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true;
+    if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;
+  }
+
+  function isTopScope(context) {
+    for (; ;) {
+      if (!context || context.type == "top") return true;
+      if (context.type == "}" && context.prev.info != "namespace") return false;
+      context = context.prev;
+    }
+  }
+
+  CodeMirror.defineMode("ivprog", function (config, parserConfig) {
+    var indentUnit = config.indentUnit,
+      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,
+      dontAlignCalls = parserConfig.dontAlignCalls,
+      keywords = parserConfig.keywords || {},
+      switchKeyword = parserConfig.switchKeyword,
+      caseKeyword = parserConfig.caseKeyword,
+      defaultKeyword = parserConfig.defaultKeyword,
+      caseRegex = new RegExp(`^\s*(?:${caseKeyword} .*?:|${defaultKeyword}:|\{\}?|\})$`),////,
+      types = parserConfig.types || {},
+      builtin = parserConfig.builtin || {},
+      blockKeywords = parserConfig.blockKeywords || {},
+      defKeywords = parserConfig.defKeywords || {},
+      atoms = parserConfig.atoms || {},
+      hooks = parserConfig.hooks || {},
+      multiLineStrings = parserConfig.multiLineStrings,
+      indentStatements = false,
+      namespaceSeparator = null,
+      isPunctuationChar = /[\[\]{}\(\),;\:\n]/,
+      numberStart = /[\d\.]/,
+      number = /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)/i,
+      isOperatorChar = /[+\-*%=<>!\/]/,
+      isIdentifierChar = /[a-zA-Z0-9_]/,
+      // An optional function that takes a {string} token and returns true if it
+      // should be treated as a builtin.
+      isReservedIdentifier = parserConfig.isReservedIdentifier || false;
+
+    var curPunc, isDefKeyword;
+
+    function tokenBase(stream, state) {
+      var ch = stream.next();
+      if (hooks[ch]) {
+        var result = hooks[ch](stream, state);
+        if (result !== false) return result;
+      }
+      if (ch == '"') {
+        state.tokenize = tokenString(ch);
+        return state.tokenize(stream, state);
+      }
+      if (isPunctuationChar.test(ch)) {
+        curPunc = ch;
+        return null;
+      }
+      if (numberStart.test(ch)) {
+        stream.backUp(1)
+        if (stream.match(number)) return "number"
+        stream.next()
+      }
+      if (ch == "/") {
+        if (stream.eat("*")) {
+          state.tokenize = tokenComment;
+          return tokenComment(stream, state);
+        }
+        if (stream.eat("/")) {
+          stream.skipToEnd();
+          return "comment";
+        }
+      }
+      if (isOperatorChar.test(ch)) {
+        while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) { }
+        return "operator";
+      }
+      stream.eatWhile(isIdentifierChar);
+      if (namespaceSeparator) while (stream.match(namespaceSeparator))
+        stream.eatWhile(isIdentifierChar);
+
+      var cur = stream.current();
+      if (contains(keywords, cur)) {
+        if (contains(blockKeywords, cur)) curPunc = "newstatement";
+        if (contains(defKeywords, cur)) isDefKeyword = true;
+        return "keyword";
+      }
+      if (contains(types, cur)) return "type";
+      if (contains(builtin, cur)
+        || (isReservedIdentifier && isReservedIdentifier(cur))) {
+        if (contains(blockKeywords, cur)) curPunc = "newstatement";
+        return "builtin";
+      }
+      if (contains(atoms, cur)) return "atom";
+      return "variable";
+    }
+
+    function tokenString(quote) {
+      return function (stream, state) {
+        var escaped = false, next, end = false;
+        while ((next = stream.next()) != null) {
+          if (next == quote && !escaped) { end = true; break; }
+          escaped = !escaped && next == "\\";
+        }
+        if (end || !(escaped || multiLineStrings))
+          state.tokenize = null;
+        return "string";
+      };
+    }
+
+    function tokenComment(stream, state) {
+      var maybeEnd = false, ch;
+      while (ch = stream.next()) {
+        if (ch == "/" && maybeEnd) {
+          state.tokenize = null;
+          break;
+        }
+        maybeEnd = (ch == "*");
+      }
+      return "comment";
+    }
+
+    function maybeEOL(stream, state) {
+      if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))
+        state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)
+    }
+
+    // Interface
+
+    return {
+      startState: function (basecolumn) {
+        return {
+          tokenize: null,
+          context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false),
+          indented: 0,
+          startOfLine: true,
+          prevToken: null
+        };
+      },
+
+      token: function (stream, state) {
+        var ctx = state.context;
+        if (stream.sol()) {
+          if (ctx.align == null) ctx.align = false;
+          state.indented = stream.indentation();
+          state.startOfLine = true;
+        }
+        if (stream.eatSpace()) { maybeEOL(stream, state); return null; }
+        curPunc = isDefKeyword = null;
+        var style = (state.tokenize || tokenBase)(stream, state);
+        if (style == "comment" || style == "meta") return style;
+        if (ctx.align == null) ctx.align = true;
+
+        if (curPunc == ";" || curPunc == ":" || (curPunc == "," && stream.match(/^\s*(?:\/\/.*)?$/, false)))
+          while (state.context.type == "statement") popContext(state);
+        else if (curPunc == "{") pushContext(state, stream.column(), "}");
+        else if (curPunc == "[") pushContext(state, stream.column(), "]");
+        else if (curPunc == "(") pushContext(state, stream.column(), ")");
+        else if (curPunc == "}") {
+          while (ctx.type == "statement") ctx = popContext(state);
+          if (ctx.type == "}") ctx = popContext(state);
+          while (ctx.type == "statement") ctx = popContext(state);
+        }
+        else if (curPunc == ctx.type) popContext(state);
+        else if (indentStatements &&
+          (((ctx.type == "}" || ctx.type == "top") && curPunc != ";")  ||
+            (ctx.type == "statement" && curPunc == "newstatement"))) {
+          pushContext(state, stream.column(), "statement", stream.current());
+        }
+
+        if (style == "variable" &&
+          ((state.prevToken == "def" ||
+            (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&
+              isTopScope(state.context) && stream.match(/^\s*\(/, false)))))
+          style = "def";
+
+        if (hooks.token) {
+          var result = hooks.token(stream, state, style);
+          if (result !== undefined) style = result;
+        }
+
+        if (style == "def" && parserConfig.styleDefs === false) style = "variable";
+
+        state.startOfLine = false;
+        state.prevToken = isDefKeyword ? "def" : style || curPunc;
+        maybeEOL(stream, state);
+        return style;
+      },
+
+      indent: function (state, textAfter) {
+        if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;
+        var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
+        var closing = firstChar == ctx.type;
+        if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev;
+        if (parserConfig.dontIndentStatements)
+          while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info))
+            ctx = ctx.prev
+        if (hooks.indent) {
+          var hook = hooks.indent(state, ctx, textAfter, indentUnit);
+          if (typeof hook == "number") return hook
+        }
+        var switchBlock = ctx.prev && ctx.prev.info == switchKeyword;
+        if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {
+          while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev
+          return ctx.indented
+        }
+        if (ctx.type == "statement")
+          return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit);
+        if (ctx.align && (!dontAlignCalls || ctx.type != ")"))
+          return ctx.column + (closing ? 0 : 1);
+        if (ctx.type == ")" && !closing)
+          return ctx.indented + statementIndentUnit;
+        var caseTestRegex = new RegExp(`^(?:${caseKeyword}|${defaultKeyword})\b`)
+        return ctx.indented + (closing ? 0 : indentUnit) +
+          (!closing && switchBlock && !caseTestRegex.test(textAfter) ? indentUnit : 0);
+      },
+
+      electricInput: caseRegex,
+      blockCommentStart: "/*",
+      blockCommentEnd: "*/",
+      blockCommentContinue: " * ",
+      lineComment: "//",
+      fold: "brace"
+    };
+  });
+
+  function words(str) {
+    var obj = {}, words = str.split(" ");
+    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+    return obj;
+  }
+  function contains(words, word) {
+    if (typeof words === "function") {
+      return words(word);
+    } else {
+      return words.propertyIsEnumerable(word);
+    }
+  }
+  const codeConfig = getCodeEditorModeConfig();
+
+  var ivprogKeywords =  codeConfig.keywords.join(" ");
+
+  // Do not use this. Use the cTypes function below. This is global just to avoid
+  // excessive calls when cTypes is being called multiple times during a parse.
+  var basicTypes = words(codeConfig.types.join(" "));
+
+  // Returns true if identifier is a "C" type.
+  // C type is defined as those that are reserved by the compiler (basicTypes),
+  // and those that end in _t (Reserved by POSIX for types)
+  // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html
+  function ivprogTypes(identifier) {
+    return contains(basicTypes, identifier);
+  }
+
+  var ivprogBlockKeywords = codeConfig.blocks.join(" ");
+  var ivprogDefKeywords = "funcao const";
+
+  function def(mimes, mode) {
+    if (typeof mimes == "string") mimes = [mimes];
+    var words = [];
+    function add(obj) {
+      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))
+        words.push(prop);
+    }
+    add(mode.keywords);
+    add(mode.types);
+    add(mode.builtin);
+    add(mode.atoms);
+    if (words.length) {
+      mode.helperType = mimes[0];
+      CodeMirror.registerHelper("hintWords", mimes[0], words);
+    }
+
+    for (var i = 0; i < mimes.length; ++i)
+      CodeMirror.defineMIME(mimes[i], mode);
+  }
+  
+  def(["text/x-ivprog"], {
+    name: "ivprog",
+    keywords: words(ivprogKeywords),
+    types: ivprogTypes,
+    blockKeywords: words(ivprogBlockKeywords),
+    defKeywords: words(ivprogDefKeywords),
+    typeFirstDefinitions: true,
+    atoms: words(codeConfig.atoms.join(" ")),
+    switchKeyword: codeConfig.switchString,
+    caseKeyword: codeConfig.case_default[0],
+    defaultKeyword: codeConfig.case_default[1],
+    modeProps: { fold: ["brace"] }
+  });
+
+}

+ 28 - 3
js/util/iassignHelpers.js

@@ -3,6 +3,7 @@ import { generate } from "../visualUI/code_generator";
 import { IVProgAssessment } from "../assessment/ivprogAssessment";
 import { TestConsole } from "./testConsole";
 import { parseLogs } from "./../services/userLog";
+import { LocalizedStrings } from './../services/localizedStringsService';
 
 function parseActivityData (data) {
   let algorithm_in_ilm = null;
@@ -13,8 +14,21 @@ function parseActivityData (data) {
       parseLogs(logs);
     }
   }
-  let content = JSON.parse(data.split('\n::algorithm::')[0]);
-  content['algorithm_in_ilm'] = algorithm_in_ilm;
+  let content;
+  try {
+    content = JSON.parse(data.split('\n::algorithm::')[0]);
+    content['algorithm_in_ilm'] = algorithm_in_ilm;
+  } catch (e) {
+    $('.ui.height_100.add_accordion').dimmer({
+      closable: false
+    });
+    $('.dimmer_content_message h3').html(LocalizedStrings.getUI('text_message_error_activity_file'));
+    $('.dimmer_content_message button').text(LocalizedStrings.getUI('text_message_error_activity_reload'));
+    $('.dimmer_content_message').css('display', 'block');
+    $('.ui.height_100.add_accordion').dimmer('add content', '.dimmer_content_message');
+    $('.ui.height_100.add_accordion').dimmer('show');
+    console.error(e);
+  }
   return content;
 }
 
@@ -23,7 +37,15 @@ export function prepareActivityToStudentHelper (ilm_cont) {
   const testCases = content.testcases;
   setTestCases(testCases);
 
+  let prog_type = null;
+  if (content.settings_programming_type) {
+    prog_type = content.settings_programming_type[0].value;
+  } else {
+    prog_type = "visual";
+  }
+
   return {
+    settingsProgrammingType: prog_type,
     settingsDataTypes: content.settings_data_types,
     settingsCommands: content.settings_commands,
     settingsFunctions: content.settings_functions,
@@ -41,7 +63,10 @@ export function autoEval (originalData, callback) {
       return callback(-2);
     }
     const autoAssessment = new IVProgAssessment(code, getTestCases(), new TestConsole([]));
-    autoAssessment.runTest().then( grade => callback(grade)).catch(err => console.log(err))
+    autoAssessment.runTest().then( grade => callback(grade)).catch(err => {
+      console.log(err);
+      callback(0);
+    });
   }
 }
 

+ 121 - 0
js/util/utils.js

@@ -1,3 +1,6 @@
+import { LanguageService } from "./../services/languageService";
+import { LocalizedStrings } from "./../services/localizedStringsService";
+import { Operators } from "./../ast/operators";
 
 /** 
  * source: https://pawelgrzybek.com/page-scroll-in-vanilla-javascript/ 
@@ -94,3 +97,121 @@ export function isElementInViewport (el) {
     rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
     rect.top < (window.innerHeight || document.documentElement.clientHeight);
 }
+let cacheMainList = null;
+let cacheOp = null;
+export function isKeyword (text) {
+  fillCache();
+  for (let key = 0; key < cacheMainList.length; ++key) {
+    const keyword = cacheMainList[key];
+    if(keyword == text) {
+      return true;
+    }
+  }
+  // not in main list, check op
+  for (let op = 0; op < cacheOp.length; op++) {
+    const lOp = cacheOp[op];
+    if(lOp == text) {
+      return true;
+    }
+  }
+  return false;
+}
+
+export function isValidIdentifier (identifier_str) {
+  const validRegex = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
+  if(!validRegex) {
+    return false;
+  }
+	return !isKeyword(identifier_str);
+}
+
+function fillCache () {
+  if(cacheMainList == null) {
+    cacheMainList = [];
+    const mainList = ["RK_PROGRAM","RK_REAL","RK_VOID","RK_BOOLEAN","RK_STRING",
+      "RK_INTEGER","RK_CHARACTER","RK_SWITCH","RK_CASE","RK_DEFAULT","RK_CONST",
+      "RK_FUNCTION","RK_RETURN","RK_FOR","RK_BREAK","RK_DO","RK_WHILE","RK_IF",
+      "RK_ELSE","RK_FALSE","RK_TRUE"];
+    const lexerClass = LanguageService.getCurrentLexer();
+    const nullLexer = new lexerClass();
+    for (let key = 0; key < mainList.length; ++key) {
+      const word = mainList[key];
+      const keyword = nullLexer.literalNames[lexerClass[word]];
+      cacheMainList.push(keyword.substring(1, keyword.length-1));
+    }
+  }
+  if(cacheOp == null) {
+    cacheOp = []
+    const logicOpList = [Operators.AND.value, Operators.OR.value, Operators.NOT.value];
+    for (let op = 0; op < logicOpList.length; ++op) {
+      const lOp = `logic_operator_${logicOpList[op]}`;
+      cacheOp.push(LocalizedStrings.getUI(lOp))
+    }
+  }
+}
+
+export function getCodeEditorModeConfig () {
+  const blockList = ["RK_SWITCH", "RK_PROGRAM","RK_CASE","RK_DEFAULT","RK_FOR",
+    "RK_FUNCTION","RK_DO","RK_WHILE","RK_IF","RK_ELSE"]
+  const keywordsList = [,"RK_CONST","RK_RETURN","RK_BREAK"];
+  const typeList = ["RK_REAL","RK_VOID","RK_BOOLEAN","RK_STRING","RK_INTEGER"];
+  const atomList = ["RK_FALSE", "RK_TRUE"];
+
+  const case_default = [];
+  const blocks = [];
+  const keywords = [];
+  const types = [];
+  const atoms = []
+  let switchString = "";
+
+  cacheMainList = [];
+  const lexerClass = LanguageService.getCurrentLexer();
+  const nullLexer = new lexerClass();
+  blockList.forEach( v => {
+    const keyword = nullLexer.literalNames[lexerClass[v]];
+    const value = keyword.substring(1, keyword.length-1);
+    cacheMainList.push(value);
+    keywords.push(value);
+    blocks.push(value);
+    if(v == "RK_SWITCH") {
+      switchString = value;
+    } else if (v == "RK_CASE" || v == "RK_DEFAULT") {
+      case_default.push(value);
+    }
+  });
+  keywordsList.forEach( v => {
+    const keyword = nullLexer.literalNames[lexerClass[v]];
+    const value = keyword.substring(1, keyword.length-1);
+    cacheMainList.push(value);
+    keywords.push(value);
+  });
+  typeList.forEach(v => {
+    const keyword = nullLexer.literalNames[lexerClass[v]];
+    const value = keyword.substring(1, keyword.length-1);
+    cacheMainList.push(value);
+    types.push(value);
+  })
+  atomList.forEach( v => {
+    const keyword = nullLexer.literalNames[lexerClass[v]];
+    const value = keyword.substring(1, keyword.length-1);
+    cacheMainList.push(value);
+    atoms.push(value);
+  })
+  
+  cacheOp = []
+  const logicOpList = [Operators.AND.value, Operators.OR.value, Operators.NOT.value];
+  for (let op = 0; op < logicOpList.length; ++op) {
+    const lOp = `logic_operator_${logicOpList[op]}`;
+    const value = LocalizedStrings.getUI(lOp);
+    cacheOp.push(value)
+    keywords.push(value);
+  }
+  return {
+    case_default: case_default,
+    atoms: atoms,
+    keywords: keywords,
+    switchString: switchString,
+    types: types,
+    blocks: blocks
+  }
+}

+ 60 - 60
js/visualUI/code_generator.js

@@ -41,19 +41,19 @@ function functionsCode (function_obj) {
 
 	switch (function_obj.return_type) {
 		case Types.INTEGER:
-			ret += LocalizedStrings.getUI('integer');
+			ret += LocalizedStrings.getUI('type_integer');
 			break;
 		case Types.REAL:
-			ret += LocalizedStrings.getUI('real');
+			ret += LocalizedStrings.getUI('type_real');
 			break;
 		case Types.TEXT:
-			ret += LocalizedStrings.getUI('text');
+			ret += LocalizedStrings.getUI('type_text');
 			break;
 		case Types.BOOLEAN:
-			ret += LocalizedStrings.getUI('boolean');
+			ret += LocalizedStrings.getUI('type_boolean');
 			break;
 		case Types.VOID:
-			ret += LocalizedStrings.getUI('void');
+			ret += LocalizedStrings.getUI('type_void');
 			break;
 	}
 	ret += ' ';
@@ -241,7 +241,7 @@ function repeatNtimesCode (command_obj, indentation) {
 
 	if (command_obj.var_attribution) {
 		ret += variableValueMenuCode(command_obj.var_attribution);
-		ret += ' = ';
+		ret += ' <- ';
 		ret += variableValueMenuCode(command_obj.expression1);
 	}
 	ret += ' ; ';
@@ -264,7 +264,7 @@ function repeatNtimesCode (command_obj, indentation) {
 
 	if (command_obj.var_incrementation) {
 		ret += variableValueMenuCode(command_obj.var_incrementation);
-		ret += ' = ';
+		ret += ' <- ';
 		ret += variableValueMenuCode(command_obj.expression3.itens[0]);
 
 		switch (command_obj.expression3.itens[1]) {
@@ -547,7 +547,7 @@ function attributionsCode (command_obj, indentation) {
 		ret += '\t';
 	}
 
-	ret += variableValueMenuCode(command_obj.variable) + ' = ';
+	ret += variableValueMenuCode(command_obj.variable) + ' <- ';
 
 	/*for (var i = 0; i < command_obj.expression.length; i++) {
 		ret += elementExpressionCode(command_obj.expression[i]);
@@ -597,15 +597,15 @@ function elementExpressionCode (expression_obj) {
 					break;
 
 				case Models.LOGIC_COMPARISON.and:
-					ret += ' ' + LocalizedStrings.getUI('and') + ' ';
+					ret += ' ' + LocalizedStrings.getUI('logic_operator_and') + ' ';
 					break;
 
 				case Models.LOGIC_COMPARISON.or:
-					ret += ' ' + LocalizedStrings.getUI('or') + ' ';
+					ret += ' ' + LocalizedStrings.getUI('logic_operator_or') + ' ';
 					break;
 
 				case Models.LOGIC_COMPARISON.not:
-					ret += ' ' + LocalizedStrings.getUI('not') + ' ';
+					ret += ' ' + LocalizedStrings.getUI('logic_operator_not') + ' ';
 					break;
 
 				case Models.ARITHMETIC_COMPARISON.greater_than:
@@ -673,7 +673,7 @@ function variableValueMenuCode (variable_obj, is_return = false) {
 			if (variable_obj.function_called.name) {
 				ret += variable_obj.function_called.name + ' ( ';
 			} else {
-				ret += LocalizedStrings.getUI(variable_obj.function_called.category)+'.'+LocalizedStrings.getUI(variable_obj.function_called.identifier) + ' ( ';
+				ret += LocalizedStrings.translateInternalFunction(variable_obj.function_called.identifier,variable_obj.function_called.category) + ' ( ';
 			}
 
 			if (variable_obj.parameters_list) {
@@ -759,16 +759,16 @@ function parametersCode (parameter_obj) {
 	var ret = '';
 	switch (parameter_obj.type) {
 		case Types.INTEGER:
-			ret += ' '+LocalizedStrings.getUI('integer')+' ';
+			ret += ' '+LocalizedStrings.getUI('type_integer')+' ';
 			break;
 		case Types.REAL:
-			ret += ' '+LocalizedStrings.getUI('real')+' ';
+			ret += ' '+LocalizedStrings.getUI('type_real')+' ';
 			break;
 		case Types.TEXT:
-			ret += ' '+LocalizedStrings.getUI('text')+' ';
+			ret += ' '+LocalizedStrings.getUI('type_text')+' ';
 			break;
 		case Types.BOOLEAN:
-			ret += ' '+LocalizedStrings.getUI('boolean')+' ';
+			ret += ' '+LocalizedStrings.getUI('type_boolean')+' ';
 			break;
 	}
 	ret += parameter_obj.name + '';
@@ -793,16 +793,16 @@ function variablesCode (variable_obj) {
 	}
 	switch (temp.type) {
 		case Types.INTEGER:
-			ret += LocalizedStrings.getUI('integer')+' ';
+			ret += LocalizedStrings.getUI('type_integer')+' ';
 			break;
 		case Types.REAL:
-			ret += LocalizedStrings.getUI('real')+' ';
+			ret += LocalizedStrings.getUI('type_real')+' ';
 			break;
 		case Types.TEXT:
-			ret += LocalizedStrings.getUI('text')+' ';
+			ret += LocalizedStrings.getUI('type_text')+' ';
 			break;
 		case Types.BOOLEAN:
-			ret += LocalizedStrings.getUI('boolean')+' ';
+			ret += LocalizedStrings.getUI('type_boolean')+' ';
 			break;
 	}
 	ret += temp.name + ' ';
@@ -812,7 +812,7 @@ function variablesCode (variable_obj) {
 
 		switch (temp.type) {
 			case Types.INTEGER:
-				ret += '= {';
+				ret += '<- {';
 				for (var j = 0; j < temp.value.length; j++) {
 					ret += temp.value[j];
 					if ((j + 1) < temp.value.length) {
@@ -822,7 +822,7 @@ function variablesCode (variable_obj) {
 				ret += '}';
 				break;
 			case Types.REAL:
-				ret += '= {';
+				ret += '<- {';
 				for (var j = 0; j < temp.value.length; j++) {
 					ret += temp.value[j].toFixed(2);
 					if ((j + 1) < temp.value.length) {
@@ -832,7 +832,7 @@ function variablesCode (variable_obj) {
 				ret += '}';
 				break;
 			case Types.TEXT:
-				ret += '= {';
+				ret += '<- {';
 				for (var j = 0; j < temp.value.length; j++) {
 					ret += '"'+temp.value[j]+'"';
 					if ((j + 1) < temp.value.length) {
@@ -842,12 +842,12 @@ function variablesCode (variable_obj) {
 				ret += '}';
 				break;
 			case Types.BOOLEAN:
-				ret += '= {';
+				ret += '<- {';
 				for (var j = 0; j < temp.value.length; j++) {
 					if (temp.value[j]) {
-						ret += LocalizedStrings.getUI("true");
+						ret += LocalizedStrings.getUI('logic_value_true');
 					} else {
-						ret += LocalizedStrings.getUI("false");
+						ret += LocalizedStrings.getUI('logic_value_false');
 					}
 					if ((j + 1) < temp.value.length) {
 						ret += ', ';
@@ -862,7 +862,7 @@ function variablesCode (variable_obj) {
 
 		switch (temp.type) {
 			case Types.INTEGER:
-				ret += '= {';
+				ret += '<- {';
 
 				for (var j = 0; j < temp.rows; j++) {
 					ret += '{';
@@ -884,7 +884,7 @@ function variablesCode (variable_obj) {
 				ret += '}';
 				break;
 			case Types.REAL:
-				ret += '= {';
+				ret += '<- {';
 
 				for (var j = 0; j < temp.rows; j++) {
 					ret += '{';
@@ -906,7 +906,7 @@ function variablesCode (variable_obj) {
 				ret += '}';
 				break;
 			case Types.TEXT:
-				ret += '= {';
+				ret += '<- {';
 
 				for (var j = 0; j < temp.rows; j++) {
 					ret += '{';
@@ -927,16 +927,16 @@ function variablesCode (variable_obj) {
 				ret += '}';
 				break;
 			case Types.BOOLEAN:
-				ret += '= {';
+				ret += '<- {';
 				for (var j = 0; j < temp.rows; j++) {
 					ret += '{';
 
 					for (var k = 0; k < temp.columns; k++) {
 						
 						if (temp.value[j][k]) {
-							ret += LocalizedStrings.getUI("true");
+							ret += LocalizedStrings.getUI('logic_value_true');
 						} else {
-							ret += LocalizedStrings.getUI("false");
+							ret += LocalizedStrings.getUI('logic_value_false');
 						}
 
 						if ((k + 1) < temp.columns) {
@@ -956,20 +956,20 @@ function variablesCode (variable_obj) {
 
 		switch (temp.type) {
 			case Types.INTEGER:
-				ret += '= ' + temp.value;
+				ret += '<- ' + temp.value;
 				break;
 			case Types.REAL:
-				ret += '= ' + temp.value.toFixed(2);
+				ret += '<- ' + temp.value.toFixed(2);
 				break;
 			case Types.TEXT:
-				ret += '= "' + temp.value + '"';
+				ret += '<- "' + temp.value + '"';
 				break;
 			case Types.BOOLEAN:
-				ret += '= ';
+				ret += '<- ';
 				if (temp.value) {
-					ret += LocalizedStrings.getUI("true");
+					ret += LocalizedStrings.getUI('logic_value_true');
 				} else {
-					ret += LocalizedStrings.getUI("false");
+					ret += LocalizedStrings.getUI('logic_value_false');
 				}
 				break;
 		}
@@ -994,16 +994,16 @@ function globalsCode () {
 			}
 			switch (temp.type) {
 				case Types.INTEGER:
-					ret += LocalizedStrings.getUI('integer');
+					ret += LocalizedStrings.getUI('type_integer');
 					break;
 				case Types.REAL:
-					ret += LocalizedStrings.getUI('real');
+					ret += LocalizedStrings.getUI('type_real');
 					break;
 				case Types.TEXT:
-					ret += LocalizedStrings.getUI('text');
+					ret += LocalizedStrings.getUI('type_text');
 					break;
 				case Types.BOOLEAN:
-					ret += LocalizedStrings.getUI('boolean');
+					ret += LocalizedStrings.getUI('type_boolean');
 					break;
 			}
 			ret += ' ' + temp.name + ' ';
@@ -1013,7 +1013,7 @@ function globalsCode () {
 
 				switch (temp.type) {
 					case Types.INTEGER:
-						ret += '= {';
+						ret += '<- {';
 						for (var j = 0; j < temp.value.length; j++) {
 							ret += temp.value[j];
 							if ((j + 1) < temp.value.length) {
@@ -1023,7 +1023,7 @@ function globalsCode () {
 						ret += '}';
 						break;
 					case Types.REAL:
-						ret += '= {';
+						ret += '<- {';
 						for (var j = 0; j < temp.value.length; j++) {
 							ret += temp.value[j].toFixed(2);
 							if ((j + 1) < temp.value.length) {
@@ -1033,7 +1033,7 @@ function globalsCode () {
 						ret += '}';
 						break;
 					case Types.TEXT:
-						ret += '= {';
+						ret += '<- {';
 						for (var j = 0; j < temp.value.length; j++) {
 							ret += '"'+temp.value[j]+'"';
 							if ((j + 1) < temp.value.length) {
@@ -1043,12 +1043,12 @@ function globalsCode () {
 						ret += '}';
 						break;
 					case Types.BOOLEAN:
-						ret += '= {';
+						ret += '<- {';
 						for (var j = 0; j < temp.value.length; j++) {
 							if (temp.value[j]) {
-								ret += LocalizedStrings.getUI("true");
+								ret += LocalizedStrings.getUI('logic_value_true');
 							} else {
-								ret += LocalizedStrings.getUI("false");
+								ret += LocalizedStrings.getUI('logic_value_false');
 							}
 							if ((j + 1) < temp.value.length) {
 								ret += ', ';
@@ -1063,7 +1063,7 @@ function globalsCode () {
 
 				switch (temp.type) {
 					case Types.INTEGER:
-						ret += '= {';
+						ret += '<- {';
 
 						for (var j = 0; j < temp.rows; j++) {
 							ret += '{';
@@ -1085,7 +1085,7 @@ function globalsCode () {
 						ret += '}';
 						break;
 					case Types.REAL:
-						ret += '= {';
+						ret += '<- {';
 
 						for (var j = 0; j < temp.rows; j++) {
 							ret += '{';
@@ -1107,7 +1107,7 @@ function globalsCode () {
 						ret += '}';
 						break;
 					case Types.TEXT:
-						ret += '= {';
+						ret += '<- {';
 
 						for (var j = 0; j < temp.rows; j++) {
 							ret += '{';
@@ -1128,16 +1128,16 @@ function globalsCode () {
 						ret += '}';
 						break;
 					case Types.BOOLEAN:
-						ret += '= {';
+						ret += '<- {';
 						for (var j = 0; j < temp.rows; j++) {
 							ret += '{';
 
 							for (var k = 0; k < temp.columns; k++) {
 								
 								if (temp.value[j][k]) {
-									ret += LocalizedStrings.getUI("true");
+									ret += LocalizedStrings.getUI('logic_value_true');
 								} else {
-									ret += LocalizedStrings.getUI("false");
+									ret += LocalizedStrings.getUI('logic_value_false');
 								}
 
 								if ((k + 1) < temp.columns) {
@@ -1157,20 +1157,20 @@ function globalsCode () {
 
 				switch (temp.type) {
 					case Types.INTEGER:
-						ret += '= ' + temp.value;
+						ret += '<- ' + temp.value;
 						break;
 					case Types.REAL:
-						ret += '= ' + temp.value.toFixed(2);
+						ret += '<- ' + temp.value.toFixed(2);
 						break;
 					case Types.TEXT:
-						ret += '= "' + temp.value + '"';
+						ret += '<- "' + temp.value + '"';
 						break;
 					case Types.BOOLEAN:
-						ret += '= ';
+						ret += '<- ';
 						if (temp.value) {
-							ret += LocalizedStrings.getUI("true");;
+							ret += LocalizedStrings.getUI('logic_value_true');;
 						} else {
-							ret += LocalizedStrings.getUI("false");;
+							ret += LocalizedStrings.getUI('logic_value_false');;
 						}
 						break;
 				}

+ 1 - 1
js/visualUI/commands/attribution.js

@@ -6,7 +6,7 @@ import * as CommandsManagement from '../commands';
 import * as ExpressionManagement from './generic_expression';
 
 export function createFloatingCommand () {
-	return $('<div class="ui attribution created_element"> <i class="ui icon small arrow left"></i> <span> x = 1 + 1 </span></div>');
+	return $('<div class="ui attribution created_element"> <i class="ui icon small arrow left"></i> <span> x <&#8212; 1 + 1 </span></div>');
 }
 
 export function renderCommand (command, function_obj) {

+ 3 - 3
js/visualUI/commands/generic_expression.js

@@ -832,9 +832,9 @@ function getLogicOperators () {
 	var logic_operators;
 	logic_operators = '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.equals_to+'">==</div>';
 	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.not_equals_to+'">!=</div>';
-	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.and+'">'+LocalizedStrings.getUI('and')+'</div>';
-	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.or+'">'+LocalizedStrings.getUI('or')+'</div>';
-	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.not+'">'+LocalizedStrings.getUI('not')+'</div>';
+	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.and+'">'+LocalizedStrings.getUI('logic_operator_and')+'</div>';
+	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.or+'">'+LocalizedStrings.getUI('logic_operator_or')+'</div>';
+	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.not+'">'+LocalizedStrings.getUI('logic_operator_not')+'</div>';
 	return logic_operators;
 }
 

+ 8 - 8
js/visualUI/commands/variable_value_menu.js

@@ -277,7 +277,7 @@ function variableValueMenuCode (command, variable_obj, dom_object, function_obj,
 			if (variable_obj.function_called.name) {
 				parameters_menu = '<div class="parameters_function_called"> '+variable_obj.function_called.name+' <span> ( </span>';
 			} else {
-				parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.getUI(variable_obj.function_called.category)+'.'+LocalizedStrings.getUI(variable_obj.function_called.identifier)+'</i> <span> ( </span>';
+				parameters_menu = '<div class="parameters_function_called"> <i>'+ LocalizedStrings.translateInternalFunction(variable_obj.function_called.identifier, variable_obj.function_called.category)+'</i> <span> ( </span>';
 			}
 
 			parameters_menu += '<span> ) </span></div>';
@@ -336,7 +336,7 @@ function variableValueMenuCode (command, variable_obj, dom_object, function_obj,
 			if (variable_obj.function_called.name) {
 				parameters_menu = '<div class="parameters_function_called"> '+variable_obj.function_called.name+' <span> ( </span>';
 			} else {
-				parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.getUI(variable_obj.function_called.category)+'.'+LocalizedStrings.getUI(variable_obj.function_called.identifier)+'</i> <span> ( </span>';
+				parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.translateInternalFunction(variable_obj.function_called.identifier, variable_obj.function_called.category)+'</i> <span> ( </span>';
 			}
 
 			for (var j = 0; j < variable_obj.function_called.parameters_list.length; j++) {
@@ -659,7 +659,7 @@ function addIVProgFunctionsToMenu (function_obj, menu_var_or_value, ref_object,
 	sub_menu.append('<div class="divider"></div><div class="header">'+LocalizedStrings.getUI('text_header_ivprog_functions')+'</div>');
 	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_math')+'<div class="menu menu_math_functions"></div></div>');
 	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_text')+'<div class="menu menu_text_functions"></div></div>');
-	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_arrangement')+'<div class="menu menu_arrangement_functions"></div></div>');
+	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_array')+'<div class="menu menu_arrangement_functions"></div></div>');
 	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_conversion')+'<div class="menu menu_conversion_functions"></div></div>');
 
 	// Insert Math functions:
@@ -667,7 +667,7 @@ function addIVProgFunctionsToMenu (function_obj, menu_var_or_value, ref_object,
 		var t = $('<div class="item"></div>');
 		t.data('function_reference', window.system_functions[i]);
 		t.data('option', VAR_OR_VALUE_TYPES.only_function);
-		t.text(LocalizedStrings.getUI(window.system_functions[i].identifier));
+		t.text(LocalizedStrings.translateInternalFunction(window.system_functions[i].identifier));
 		
 		switch(window.system_functions[i].category) {
 			case Models.SYSTEM_FUNCTIONS_CATEGORIES.math:
@@ -742,8 +742,8 @@ function addVariablesToMenu (function_obj, menu_var_or_value, ref_object, expres
 		}
 	}
 	if (!is_there) {
-		sub_menu.append($('<div class="header">'+LocalizedStrings.getUI('text_none_variable')+'</div>'));
-		sub_menu.append($('<div class="item disabled">'+LocalizedStrings.getUI('text_none_variable_instruction')+'</div>'));
+		sub_menu.append($('<div class="header">'+LocalizedStrings.getUI('text_no_variable')+'</div>'));
+		sub_menu.append($('<div class="item disabled">'+LocalizedStrings.getUI('text_no_variable_instruction')+'</div>'));
 	}
 
 }
@@ -824,7 +824,7 @@ function openInputToFunction (command, ref_object, dom_object, menu_var_or_value
 		if (function_selected.name) {
 			parameters_menu = '<div class="parameters_function_called"> '+function_selected.name+' <span> ( </span>';
 		} else {
-			parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.getUI(function_selected.category)+'.'+LocalizedStrings.getUI(function_selected.identifier)+'</i> <span> ( </span>';
+			parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.translateInternalFunction(function_selected.identifier, function_selected.category)+'</i> <span> ( </span>';
 		}
 		for (var j = 0; j < function_selected.parameters_list.length; j++) {
 			parameters_menu += '<div class="render_style_param parameter_'+j+'"></div>';
@@ -900,7 +900,7 @@ function openInputToFunction (command, ref_object, dom_object, menu_var_or_value
 		if (function_selected.name) {
 			parameters_menu = '<div class="parameters_function_called"> '+function_selected.name+' <span> ( </span>';
 		} else {
-			parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.getUI(function_selected.category)+'.'+LocalizedStrings.getUI(function_selected.identifier)+'</i> <span> ( </span>';
+			parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.translateInternalFunction(function_selected.identifier, function_selected.category)+'</i> <span> ( </span>';
 		}
 		
 		parameters_menu += '<span> ) </span></div>';

+ 97 - 55
js/visualUI/functions.js

@@ -15,6 +15,8 @@ import * as AlgorithmManagement from './algorithm';
 import * as Utils from './utils';
 import { registerUserEvent, ActionTypes } from "./../services/userLog";
 import VersionInfo from './../../.ima_version.json';
+import * as TextEditor from "./text_editor";
+import { isValidIdentifier } from "./../util/utils";
 
 var counter_new_functions = 0;
 var counter_new_parameters = 0;
@@ -193,7 +195,7 @@ function addHandlers (function_obj, function_container) {
       selectOnKeydown: false
   });
 
-  function_container.find( ".name_function_updated" ).on('click', function(e){
+  function_container.find( ".function_name_div" ).on('click', function(e){
     enableNameFunctionUpdate(function_obj, function_container);
   });
 
@@ -251,38 +253,48 @@ function renderFunctionReturn (function_obj, function_element) {
 
   var ret = '<div class="ui dropdown function_return">';
     
-    if (function_obj.return_dimensions > 0) {
-      ret += '<div class="text">'+ LocalizedStrings.getUI("vector") +':'+ LocalizedStrings.getUI(function_obj.return_type);
-      if (function_obj.return_dimensions == 1) {
-        ret += ' [ ] ';
-      } else {
-        ret += ' [ ] [ ] ';
-      }
-      ret += '</div>';
+    if (function_obj.return_dimensions == 1) {
+      ret += '<div class="text">'+ LocalizedStrings.getUI("vector") +': '+ LocalizedStrings.getUI(`type_${function_obj.return_type.toLowerCase()}`);
+      ret += ' [ ] </div>';
+    } else if (function_obj.return_dimensions == 2) {
+      ret += '<div class="text">'+ LocalizedStrings.getUI("matrix") +': '+ LocalizedStrings.getUI(`type_${function_obj.return_type.toLowerCase()}`);
+      ret += ' [ ] [ ] </div>';
     } else {
-      ret += '<div class="text">'+LocalizedStrings.getUI(function_obj.return_type)+'</div>';
+      ret += '<div class="text">'+LocalizedStrings.getUI(`type_${function_obj.return_type.toLowerCase()}`)+'</div>';
     }
 
     ret += '<div class="menu">';
 
+    for (var tm in Types) {
+      ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase() && function_obj.return_dimensions < 1 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
+    }
+
+    ret += '<div class="item ' + (function_obj.return_dimensions == 1 ? ' selected ' : '') + '">'
+      + '<i class="dropdown icon"></i>' + LocalizedStrings.getUI('vector')
+      +  '<div class="menu">';
 
     for (var tm in Types) {
-      ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase()  && function_obj.return_dimensions < 1 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+      if (tm == Types.VOID.toUpperCase()) {
+        continue;
+      }
+
+      ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase() &&  function_obj.return_dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
     }
+    ret += '</div></div>';
+
+
+    ret += '<div class="item ' + (function_obj.return_dimensions == 2 ? ' selected ' : '') + '">'
+      + '<i class="dropdown icon"></i>' + LocalizedStrings.getUI('matrix')
+      +  '<div class="menu">';
 
     for (var tm in Types) {
       if (tm == Types.VOID.toUpperCase()) {
         continue;
       }
-      ret += '<div class="item">'
-        + '<i class="dropdown icon"></i>'
-        +  LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())
-          +  '<div class="menu">'
-            + '<div class="item '+(function_obj.return_type == tm.toLowerCase()  && function_obj.return_dimensions > 0 ? ' selected ' : '')+'" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1">[ ]</div>'
-            + '<div class="item '+(function_obj.return_type == tm.toLowerCase()  && function_obj.return_dimensions > 0 ? ' selected ' : '')+'" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] [ ] " data-type="'+tm+'" data-dimensions="2">[ ] [ ] </div>'
-          +  '</div>'
-        + '</div>'; 
+
+      ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase() &&  function_obj.return_dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
     }
+    ret += '</div></div>';
 
     ret += '</div></div>';
 
@@ -309,7 +321,7 @@ export function renderFunction (function_obj) {
   appender += '<div class="function_signature_div">'+LocalizedStrings.getUI("function")+' ';
 
   if (function_obj.is_main) {
-      appender += '<div class="function_name_div">  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' + LocalizedStrings.getUI('void') + ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="span_name_function" >'+function_obj.name+'</span> </div> '
+      appender += '<div class="function_name_div">  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' + LocalizedStrings.getUI('type_void') + ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="span_name_function" >'+function_obj.name+'</span> </div> '
         + ' <span class="parethesis_function">( </span> <div class="ui large labels parameters_list">';
   } else {
       appender += '<div class="ui function_return"></div>';
@@ -380,7 +392,7 @@ export function renderFunction (function_obj) {
     CommandsManagement.renderCommand(function_obj.commands[j], $(appender.find('.commands_list_div')[0]), 3, function_obj);
   }
   $('.minimize_function_button').popup({
-    content : LocalizedStrings.getUI("tooltip_minimize"),
+    content : LocalizedStrings.getUI("tooltip_hide_function"),
     delay: {
       show: 750,
       hide: 0
@@ -477,8 +489,6 @@ function updateProgramObjDrag () {
     }
   });
 
-  console.log(function_index);
-
   const path_target = [];
   $(evento_drag.item).parentsUntil(".all_functions").each(function () {
     if ($(this).hasClass('command_container')) {
@@ -854,7 +864,8 @@ export function initVisualUI () {
        updateSequenceGlobals(evt.oldIndex, evt.newIndex);
     }
   });
-  
+
+  TextEditor.initTextEditor("ivprog-text-editor");
 }
 
 export function setTestCases (testCases) {
@@ -890,8 +901,16 @@ function runCodeAssessment () {
     return;
   }
   
+  let strCode = null;
+
   window.studentGrade = null;
-  const strCode = CodeManagement.generate();
+
+  if (settingsProgrammingTypes == "textual") {
+    strCode = TextEditor.getCode();
+  } else {
+    strCode = CodeManagement.generate();
+  }
+
   if (strCode == null) {
     return;
   }
@@ -921,7 +940,14 @@ function runCode () {
   if (isRunning) {
     return;
   }
-  const strCode = CodeManagement.generate();
+  let strCode = null;
+
+  if (settingsProgrammingTypes == "textual") {
+    strCode = TextEditor.getCode();
+  } else {
+    strCode = CodeManagement.generate();
+  }
+
   if (strCode == null) {
     return;
   }
@@ -996,16 +1022,22 @@ function toggleConsole (is_running) {
 // }
 
 function toggleTextualCoding () {
-  var code = CodeManagement.generate();
-
-  if (code == null) {
-    return;
+  let code = null;
+  if (settingsProgrammingTypes != "textual") {
+    code = CodeManagement.generate();
+    if (code == null) {
+      return;
+    }
   }
 
+
   $('.ivprog_visual_panel').css('display', 'none');
   $('.ivprog_textual_panel').css('display', 'block');
   $('.ivprog_textual_panel').removeClass('loading');
-  $('.ivprog_textual_code').text(code);
+  TextEditor.updateEditor();
+  if (code != null)
+    TextEditor.setCode(code);
+  //$('.ivprog_textual_code').text(code);
 
   $('.visual_coding_button').removeClass('active');
   $('.textual_coding_button').addClass('active');
@@ -1050,7 +1082,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
   ret += '<div class="ui dropdown parameter_type">';
 
   if (parameter_obj.dimensions > 0) {
-    ret += '<div class="text">'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(parameter_obj.type);
+    ret += '<div class="text">'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${parameter_obj.type.toLowerCase()}`);
     if (parameter_obj.dimensions == 1) {
       ret += ' [ ] ';
     } else {
@@ -1058,7 +1090,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
     }
     ret += '</div>';
   } else {
-    ret += '<div class="text">'+LocalizedStrings.getUI(parameter_obj.type)+'</div>';
+    ret += '<div class="text">'+LocalizedStrings.getUI(`type_${parameter_obj.type.toLowerCase()}`)+'</div>';
   }
 
   ret += '<div class="menu">';
@@ -1068,22 +1100,36 @@ function renderParameter (function_obj, parameter_obj, function_container) {
       if (tm == Types.VOID.toUpperCase()) {
         continue;
       }
-      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() && parameter_obj.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
   }
 
-  for (const tm in Types) {
-    if (tm == Types.VOID.toUpperCase()) {
-      continue;
+
+  ret += '<div class="item ' + (parameter_obj.dimensions == 1 ? ' selected ' : '') + '">'
+    + '<i class="dropdown icon"></i>' + LocalizedStrings.getUI('vector')
+    +  '<div class="menu">';
+
+  for (var tm in Types) {
+      if (tm == Types.VOID.toUpperCase()) {
+        continue;
+      }
+
+      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() &&  parameter_obj.dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
     }
-    ret += '<div class="item">'
-      + '<i class="dropdown icon"></i>'
-      +  LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())
-        +  '<div class="menu">'
-          + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1">[ ]</div>'
-          + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] [ ] " data-type="'+tm+'" data-dimensions="2">[ ] [ ] </div>'
-        +  '</div>'
-      + '</div>'; 
+  ret += '</div></div>';
+
+
+  ret += '<div class="item ' + (parameter_obj.dimensions == 2 ? ' selected ' : '') + '">'
+    + '<i class="dropdown icon"></i>' + LocalizedStrings.getUI('matrix')
+    +  '<div class="menu">';
+
+  for (var tm in Types) {
+      if (tm == Types.VOID.toUpperCase()) {
+        continue;
+      }
+
+      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() &&  parameter_obj.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
   }
+  ret += '</div></div>';
 
   ret += '</div></div>';
 
@@ -1110,7 +1156,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
     selectOnKeydown: false
   });
 
-  ret.find('.label_enable_name_parameter').on('click', function(e){
+  ret.find('.parameter_div_edit').on('click', function(e){
     registerUserEvent(function_obj.name, ActionTypes.ENTER_CHANGE_PARAM_NAME, parameter_obj.name);
     enableNameParameterUpdate(parameter_obj, ret, function_obj);
   });
@@ -1126,13 +1172,13 @@ function updateParameterName (parameter_var, new_name, parameter_obj_dom, functi
 
   if (isValidIdentifier(new_name)) {
     if (variableNameAlreadyExists(new_name, function_obj)) {
-      Utils.renderErrorMessage(parameter_obj_dom.find('.parameter_div_edit'), LocalizedStrings.getUI('inform_valid_variable_duplicated'));
+      Utils.renderErrorMessage(parameter_obj_dom.find('.parameter_div_edit'), LocalizedStrings.getError('inform_valid_param_duplicated', [new_name, function_obj.name]));
     } else {
-      registerUserEvent(parameter_var.name, ActionTypes.RENAME_FUNCTION_PARAM, function_obj.name, new_name);
+      registerUserEvent(function_obj.name, ActionTypes.RENAME_FUNCTION_PARAM, parameter_var.name, new_name);
       parameter_var.name = new_name;
     }
   } else {
-    Utils.renderErrorMessage(parameter_obj_dom.find('.parameter_div_edit'), LocalizedStrings.getUI('inform_valid_name'));
+    Utils.renderErrorMessage(parameter_obj_dom.find('.parameter_div_edit'), LocalizedStrings.getError('inform_valid_identifier'));
   }
 }
 
@@ -1165,13 +1211,13 @@ function updateFunctionName (function_var, new_name, function_obj_dom) {
   
   if (isValidIdentifier(new_name)) {
     if (functionNameAlreadyExists(new_name)) {
-      Utils.renderErrorMessage(function_obj_dom.find('.function_name_div'), LocalizedStrings.getUI('inform_valid_name_duplicated'));
+      Utils.renderErrorMessage(function_obj_dom.find('.function_name_div'), LocalizedStrings.getError('inform_valid_function_duplicated', [new_name]));
     } else {
       registerUserEvent(function_var.name, ActionTypes.RENAME_FUNCTION, new_name);
       function_var.name = new_name;
     }
   } else {
-    Utils.renderErrorMessage(function_obj_dom.find('.function_name_div'), LocalizedStrings.getUI('inform_valid_name'));
+    Utils.renderErrorMessage(function_obj_dom.find('.function_name_div'), LocalizedStrings.getError('inform_valid_identifier'));
   }
 }
 
@@ -1184,10 +1230,6 @@ function functionNameAlreadyExists (function_name) {
   return false;
 }
 
-function isValidIdentifier (identifier_str) {
-  return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
-}
-
 var opened_name_parameter = false;
 var opened_input_parameter = null;
 function enableNameParameterUpdate (parameter_obj, parent_node, function_obj) {

+ 60 - 44
js/visualUI/globals.js

@@ -8,7 +8,7 @@ var counter_new_globals = 0;
 
 export function addGlobal (program, is_from_click = false) {
 
-	var new_global = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI('new_global') + '_' + counter_new_globals, 1);
+	var new_global = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI('new_global') + '_' + counter_new_globals, 0);
 	counter_new_globals ++;
 
 	program.addGlobal(new_global);
@@ -87,38 +87,38 @@ function removeGlobal (global_var, global_container) {
 function updateInitialValues (global_var) {
 	if (global_var.type == Types.INTEGER) {
 		if (global_var.dimensions == 0) {
-			global_var.value = 1;
+			global_var.value = 0;
 		}
 		if (global_var.dimensions == 1) {
-			global_var.value = [1, 1];
+			global_var.value = [0, 0];
 		}
 		if (global_var.dimensions == 2) {
-			global_var.value = [[1, 1], [1, 1]];
+			global_var.value = [[0, 0], [0, 0]];
 		}
 	}
 
 	if (global_var.type == Types.REAL) {
 		if (global_var.dimensions == 0) {
-			global_var.value = 1.0;
+			global_var.value = 0.0;
 		}
 		if (global_var.dimensions == 1) {
-			global_var.value = [1.0, 1.0];
+			global_var.value = [0.0, 0.0];
 		}
 		if (global_var.dimensions == 2) {
-			global_var.value = [[1.0, 1.0], [1.0, 1.0]];
+			global_var.value = [[0.0, 0.0], [0.0, 0.0]];
 		}
 	}
 
 	if (global_var.type == Types.TEXT) {
 		if (global_var.dimensions == 0) {
-			global_var.value = LocalizedStrings.getUI('text_start');
+			global_var.value = LocalizedStrings.getUI('textvar_default_value');
 		}
 		if (global_var.dimensions == 1) {
-			global_var.value = [LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')];
+			global_var.value = [LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')];
 		}
 		if (global_var.dimensions == 2) {
-			global_var.value = [[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')], 
-									[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')]];
+			global_var.value = [[LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')], 
+									[LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')]];
 		}
 	}
 
@@ -139,12 +139,12 @@ function updateInitialValues (global_var) {
 
 function alternateBooleanGlobalValue (global_var, value_container) {
 	global_var.value = !global_var.value;
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(global_var.value));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${global_var.value}`));
 }
 
 function alternateBooleanGlobalVectorValue (global_var, index, value_container) {
 	global_var.value[index] = !global_var.value[index];
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(global_var.value[index]));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${global_var.value[index]}`));
 }
 
 function removeGlobalColumnVector (global_var) {
@@ -160,13 +160,13 @@ function addGlobalColumnVector (global_var) {
 	global_var.columns ++;
 
 	if (global_var.type == Types.INTEGER) {
-		global_var.value.push(1);
+		global_var.value.push(0);
 	}
 	if (global_var.type == Types.REAL) {
-		global_var.value.push(1.0);
+		global_var.value.push(0.0);
 	}
 	if (global_var.type == Types.TEXT) {
-		global_var.value.push(LocalizedStrings.getUI('text_start'));
+		global_var.value.push(LocalizedStrings.getUI('textvar_default_value'));
 	}
 	if (global_var.type == Types.BOOLEAN) {
 		global_var.value.push(true);
@@ -190,17 +190,17 @@ function addColumnGlobalMatrix (global_var) {
 
 	if (global_var.type == Types.INTEGER) {
 		for (var i = 0; i < global_var.rows; i++) {
-			global_var.value[i].push(1);
+			global_var.value[i].push(0);
 		}
 	}
 	if (global_var.type == Types.REAL) {
 		for (var i = 0; i < global_var.rows; i++) {
-			global_var.value[i].push(1.0);
+			global_var.value[i].push(0.0);
 		}
 	}
 	if (global_var.type == Types.TEXT) {
 		for (var i = 0; i < global_var.rows; i++) {
-			global_var.value[i].push(LocalizedStrings.getUI('text_start'));
+			global_var.value[i].push(LocalizedStrings.getUI('textvar_default_value'));
 		}
 	}
 	if (global_var.type == Types.BOOLEAN) {
@@ -225,14 +225,14 @@ function addLineGlobalMatrix (global_var) {
 	if (global_var.type == Types.INTEGER) {
 		var n_l = [];
 		for (var i = 0; i < global_var.columns; i++) {
-			n_l.push(1);
+			n_l.push(0);
 		}
 		global_var.value.push(n_l);
 	}
 	if (global_var.type == Types.REAL) {
 		var n_l = [];
 		for (i = 0; i < global_var.columns; i++) {
-			n_l.push(1.0);
+			n_l.push(0.0);
 		}
 		global_var.value.push(n_l);
 	}
@@ -240,7 +240,7 @@ function addLineGlobalMatrix (global_var) {
 	if (global_var.type == Types.TEXT) {
 		var n_l = [];
 		for (i = 0; i < global_var.columns; i++) {
-			n_l.push(LocalizedStrings.getUI('text_start'));
+			n_l.push(LocalizedStrings.getUI('textvar_default_value'));
 		}
 		global_var.value.push(n_l);
 	}
@@ -256,7 +256,7 @@ function addLineGlobalMatrix (global_var) {
 
 function alternateBooleanGlobalMatrixValue (global_var, row, index, value_container) {
 	global_var.value[row][index] = !global_var.value[row][index];
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(global_var.value[row][index]));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${global_var.value[row][index]}`));
 }
 
 function renderValues (global_var, global_container) {
@@ -269,7 +269,7 @@ function renderValues (global_var, global_container) {
 			ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+global_var.value.toFixed(1)+'</span>  </div> ';
 		} else {
 			if (global_var.type == Types.BOOLEAN) {
-				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+LocalizedStrings.getUI(global_var.value)+'</span>  </div> ';
+				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+LocalizedStrings.getUI(`logic_value_${global_var.value}`)+'</span>  </div> ';
 			} else {
 				ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+global_var.value+'</span>  </div> ';
 			}
@@ -286,7 +286,7 @@ function renderValues (global_var, global_container) {
 			} else {
 				for (var k = 0; k < global_var.columns; k++) {
 					if (global_var.type == Types.BOOLEAN) {
-						ret += '<td><span class="span_value_variable boolean_vector_var" data-index="'+k+'">'+LocalizedStrings.getUI(global_var.value[k])+'</span></td>';
+						ret += '<td><span class="span_value_variable boolean_vector_var" data-index="'+k+'">'+LocalizedStrings.getUI(`logic_value_${global_var.value[k]}`)+'</span></td>';
 					} else {
 						ret += '<td><span class="span_value_variable vector_var" data-index="'+k+'">'+global_var.value[k]+'</span>'+'</td>';
 					}
@@ -314,7 +314,7 @@ function renderValues (global_var, global_container) {
     				ret += '<tr>';
     				for (var k = 0; k < global_var.columns; k++) {
     					if (global_var.type == Types.BOOLEAN) { 
-    						ret += '<td><span class="span_value_variable boolean_matrix_var" data-index="'+k+'" data-row="'+l+'">'+LocalizedStrings.getUI(global_var.value[l][k])+'</span></td>';
+    						ret += '<td><span class="span_value_variable boolean_matrix_var" data-index="'+k+'" data-row="'+l+'">'+LocalizedStrings.getUI(`logic_value_${global_var.value[l][k]}`)+'</span></td>';
     					} else {
     						ret += '<td><span class="span_value_variable matrix_var" data-index="'+k+'" data-row="'+l+'">'+global_var.value[l][k]+'</span></td>';
     					}
@@ -436,7 +436,7 @@ function addHandlers (global_container) {
 	});
 
 	// Manage global name: 
-	global_container.find( ".enable_edit_name_parameter" ).on('click', function(e){
+	global_container.find( ".editing_name_var" ).on('click', function(e){
 		registerUserEvent(global_var.name, ActionTypes.ENTER_CHANGE_GLOBAL_NAME);
 		enableNameUpdate(global_container);
 	});
@@ -485,14 +485,16 @@ export function renderGlobal (global_var) {
  	
  	element += '<div class="ui dropdown global_type">';
 
-  	if (global_var.dimensions > 0) {
-  		element += '<div class="text">'+ LocalizedStrings.getUI('vector')+ ':' + LocalizedStrings.getUI(global_var.type);
-  		for (var i = 0; i < global_var.dimensions; i ++) {
-  			element += ' [ <span class="dimensions_'+i+'"></span> ] ';
-  		}
+  	if (global_var.dimensions == 1) {
+  		element += '<div class="text">'+ LocalizedStrings.getUI('vector')+ ': ' + LocalizedStrings.getUI(`type_${global_var.type}`);
+  		element += ' [ <span class="dimensions_0"></span> ] ';
+  		element += '</div>';
+  	} else if (global_var.dimensions == 2) {
+  		element += '<div class="text">'+ LocalizedStrings.getUI('matrix')+ ': ' + LocalizedStrings.getUI(`type_${global_var.type}`);
+  		element += ' [ <span class="dimensions_0"></span> ] [ <span class="dimensions_1"></span> ] ';
   		element += '</div>';
   	} else {
-  		element += '<div class="text">' + LocalizedStrings.getUI(global_var.type.toLowerCase()) + '</div>';
+  		element += '<div class="text">' + LocalizedStrings.getUI(`type_${global_var.type.toLowerCase()}`) + '</div>';
   	}
 	element += '<div class="menu">';
 
@@ -500,24 +502,38 @@ export function renderGlobal (global_var) {
   		if (tm == Types.VOID.toUpperCase()) {
   			continue;
   		}
-  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() && global_var.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
 	}
 
-  	for (var tm in Types) {
+
+	element += '<div class="item ' + (global_var.dimensions == 1 ? ' selected ' : '') + '">'
+		+ '<i class="dropdown icon"></i>' + LocalizedStrings.getUI('vector')
+		+  '<div class="menu">';
+
+	for (var tm in Types) {
   		if (tm == Types.VOID.toUpperCase()) {
   			continue;
   		}
-  		element += '<div class="item">'
-	    	+ '<i class="dropdown icon"></i>'
-	    	+  LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())
-	      	+  '<div class="menu">'
-		        + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1">[ ]</div>'
-		        + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] [ ] " data-type="'+tm+'" data-dimensions="2">[ ] [ ] </div>'
-	      	+  '</div>'
-	    	+ '</div>';	
+
+  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() &&  global_var.dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
+  	}
+	element += '</div></div>';
+
+
+	element += '<div class="item ' + (global_var.dimensions == 2 ? ' selected ' : '') + '">'
+		+ '<i class="dropdown icon"></i>' + LocalizedStrings.getUI('matrix')
+		+  '<div class="menu">';
+
+	for (var tm in Types) {
+  		if (tm == Types.VOID.toUpperCase()) {
+  			continue;
+  		}
+
+  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() &&  global_var.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
   	}
+	element += '</div></div>';
 
-    element += '</div></div> <div class="editing_name_var"> <span class="span_name_variable enable_edit_name_parameter">'+global_var.name+'</span> </div> <span class="character_equals"> = </span> ';
+    element += '</div></div> <div class="editing_name_var"> <span class="span_name_variable enable_edit_name_parameter">'+global_var.name+'</span> </div> <span class="character_equals"> <&#8212; </span> ';
 
 	element += '<div class="ui div_valor_var">'+global_var.value+'</div>';    
 

+ 1 - 2
js/visualUI/ivprog_elements.js

@@ -1,4 +1,3 @@
-import * as VariableValueMenuManagement from './commands/variable_value_menu';
 import { Types } from './types';
 import WatchJS from 'melanke-watchjs';
 import * as AlgorithmManagement from './algorithm';
@@ -17,7 +16,7 @@ export const ARITHMETIC_COMPARISON = Object.freeze({greater_than:"greater_than",
 
 export const LOGIC_COMPARISON = Object.freeze({equals_to:"equals_to", not_equals_to:"not_equals_to", and:"and", or:"or", not:"not"});
 
-export const SYSTEM_FUNCTIONS_CATEGORIES = Object.freeze({math:"math", text:"text_t", arrangement:"arrangement", conversion:"conversion"});
+export const SYSTEM_FUNCTIONS_CATEGORIES = Object.freeze({math:'$mathLib', text:'$strLib', arrangement:'$arrayLib', conversion:'$langLib'});
 
 export class Variable {
 

+ 46 - 0
js/visualUI/text_editor.js

@@ -0,0 +1,46 @@
+import * as CodeMirror from "codemirror";
+import "codemirror/addon/edit/closebrackets";
+import "codemirror/addon/edit/matchbrackets";
+// import "codemirror/addon/hint/show-hint";
+// import "codemirror/addon/hint/anyword-hint";
+import "codemirror/addon/selection/active-line";
+import { CodeEditorMode } from "./../util/editorMode2"
+CodeEditorMode(CodeMirror);
+
+let codeEditor = null;
+
+export function initTextEditor (element) {
+  let id =  element;
+  if (element[0] == '#') {
+    id = element.substring(1);
+  }
+  codeEditor = CodeMirror.fromTextArea(document.getElementById(id), {
+    theme: "ttcn",
+    value: "",
+    mode: "text/x-ivprog",
+    indentUnit: 4,
+    lineNumbers: true,
+    matchBrackets: true,
+    autoCloseBrackets: true,
+    fixedGutter: true,
+    styleActiveLine: true,
+    readOnly: true
+  });
+}
+
+export function disable (flag) {
+  codeEditor.setOption("readOnly", flag);
+  updateEditor();
+}
+
+export function updateEditor () {
+  codeEditor.refresh();
+}
+
+export function setCode (code) {
+  codeEditor.setValue(code);
+}
+
+export function getCode () {
+  return codeEditor.getValue();
+}

+ 63 - 53
js/visualUI/variables.js

@@ -3,11 +3,12 @@ import * as Models from './ivprog_elements';
 import { LocalizedStrings } from './../services/localizedStringsService';
 import * as Utils from './utils';
 import { registerUserEvent, registerSystemEvent, ActionTypes } from "./../services/userLog";
+import { isValidIdentifier } from "./../util/utils";
 
 var counter_new_variables = 0;
 
 export function addVariable (function_obj, function_container, is_in_click = false) {
-	var new_var = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI('new_variable') + '_' + counter_new_variables, 1);
+	var new_var = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI('new_variable') + '_' + counter_new_variables, 0);
 	if (function_obj.variables_list == null) {
 		function_obj.variables_list = [];
 	}
@@ -32,13 +33,13 @@ function updateName (variable_obj, new_name, variable_obj_dom, function_obj) {
 
 	if (isValidIdentifier(new_name)) {
 		if (variableNameAlreadyExists(new_name, function_obj)) {
-			Utils.renderErrorMessage(variable_obj_dom.find('.editing_name_var'), LocalizedStrings.getUI('inform_valid_variable_duplicated'));
+			Utils.renderErrorMessage(variable_obj_dom.find('.editing_name_var'), LocalizedStrings.getError('inform_valid_variable_duplicated', [new_name, function_obj.name]));
 		} else {
-			registerUserEvent(function_obj.name, ActionTypes.REMOVE_FUNCTION_VAR, variable_obj.name, new_name);
+			registerUserEvent(function_obj.name, ActionTypes.RENAME_FUNCTION_VAR, variable_obj.name, new_name);
 			variable_obj.name = new_name;
 		}
 	} else {
-		Utils.renderErrorMessage(variable_obj_dom.find('.editing_name_var'), LocalizedStrings.getUI('inform_valid_name'));
+		Utils.renderErrorMessage(variable_obj_dom.find('.editing_name_var'), LocalizedStrings.getError('inform_valid_identifier'));
 	}
 }
 
@@ -63,10 +64,6 @@ function variableNameAlreadyExists (name_var, function_obj) {
 	return false;
 }
 
-function isValidIdentifier (identifier_str) {
-	return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
-}
-
 function removeVariable (variable_obj, variable_container, function_name) {
 	var function_associated = variable_container.data('associatedFunction');
 	registerUserEvent(function_name, ActionTypes.REMOVE_FUNCTION_VAR, variable_obj.name);
@@ -99,7 +96,7 @@ function updateType (variable_obj, new_type, function_name, new_dimensions = 0)
 function addHandlers (variable_obj, variable_container, function_obj) {
 
 	// Manage variable name: 
-	variable_container.find( ".enable_edit_name_variable" ).on('click', function(e){
+	variable_container.find( ".editing_name_var" ).on('click', function(e){
 		registerUserEvent(function_obj.name, ActionTypes.ENTER_CHANGE_VAR_NAME, variable_obj.name);
 		enableNameUpdate(variable_obj, variable_container, function_obj);
 	});
@@ -125,21 +122,20 @@ function addHandlers (variable_obj, variable_container, function_obj) {
 
 }
 
-
 export function renderVariable (function_container, new_var, function_obj) {
 
 	var element = '<div class="ui label variable_container pink"><i class="ui icon ellipsis vertical inverted"></i>';
 
 	element += '<div class="ui dropdown variable_type">';
 
-  	if (new_var.dimensions > 0) {
-  		element += '<div class="text">'+ LocalizedStrings.getUI('vector') + ':' + LocalizedStrings.getUI(new_var.type.toLowerCase());
-  		for (var i = 0; i < new_var.dimensions; i ++) {
-  			element += ' [ ] ';
-  		}
-  		element += '</div>';
+  	if (new_var.dimensions == 1) {
+  		element += '<div class="text">'+ LocalizedStrings.getUI('vector') + ': ' + LocalizedStrings.getUI(`type_${new_var.type.toLowerCase()}`);
+  		element += ' [ ] </div>';
+  	} else if (new_var.dimensions == 2) {
+  		element += '<div class="text">'+ LocalizedStrings.getUI('matrix') + ': ' + LocalizedStrings.getUI(`type_${new_var.type.toLowerCase()}`);
+  		element += ' [ ] [ ] </div>';
   	} else {
-  		element += '<div class="text">' + LocalizedStrings.getUI(new_var.type.toLowerCase()) + '</div>';
+  		element += '<div class="text">' + LocalizedStrings.getUI(`type_${new_var.type.toLowerCase()}`) + '</div>';
   	}
 	element += '<div class="menu">';
 
@@ -147,28 +143,42 @@ export function renderVariable (function_container, new_var, function_obj) {
   		if (tm == Types.VOID.toUpperCase()) {
   			continue;
   		}
-  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
 	}
 
-  	for (var tm in Types) {
+
+	element += '<div class="item ' + (new_var.dimensions == 1 ? ' selected ' : '') + '">'
+		+ '<i class="dropdown icon"></i>' + LocalizedStrings.getUI('vector')
+		+  '<div class="menu">';
+
+	for (var tm in Types) {
   		if (tm == Types.VOID.toUpperCase()) {
   			continue;
   		}
-  		element += '<div class="item">'
-  			+ '<i class="dropdown icon"></i>'
-	    	+  LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())
-	      	+  '<div class="menu">'
-		        + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1">[ ]</div>'
-		        + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] [ ] " data-type="'+tm+'" data-dimensions="2">[ ] [ ] </div>'
-	      	+  '</div>'
-	    	+ '</div>';	
+
+  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
+  	}
+	element += '</div></div>';
+
+
+	element += '<div class="item ' + (new_var.dimensions == 2 ? ' selected ' : '') + '">'
+		+ '<i class="dropdown icon"></i>' + LocalizedStrings.getUI('matrix')
+		+  '<div class="menu">';
+
+	for (var tm in Types) {
+  		if (tm == Types.VOID.toUpperCase()) {
+  			continue;
+  		}
+
+  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
   	}
+	element += '</div></div>';
 
     element += '</div></div> ';
 
     element += '<div class="editing_name_var"><span class="span_name_variable enable_edit_name_variable">'+new_var.name+'</span> </div>';
 
-	element += ' <span class="character_equals"> = </span> <div class="ui div_valor_var">'+new_var.value+'</div>';    
+	element += ' <span class="character_equals"> <&#8212; </span> <div class="ui div_valor_var">'+new_var.value+'</div>';    
 
 	element += ' <i class="yellow inverted icon times remove_variable"></i></div>';
 
@@ -209,7 +219,7 @@ function renderValues (new_var, variable_container, function_name) {
 			ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+new_var.value.toFixed(1)+'</span> </div> ';
 		} else {
 			if (new_var.type == Types.BOOLEAN) {
-				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+LocalizedStrings.getUI(new_var.value)+'</span> </div> ';
+				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+LocalizedStrings.getUI(`logic_value_${new_var.value}`)+'</span> </div> ';
 			} else {
 				ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+new_var.value+'</span> </div> ';
 			}
@@ -226,7 +236,7 @@ function renderValues (new_var, variable_container, function_name) {
 			} else {
 				for (var k = 0; k < new_var.columns; k++) {
 					if (new_var.type == Types.BOOLEAN) {
-						ret += '<td><span class="span_value_variable boolean_vector_var" data-index="'+k+'">'+LocalizedStrings.getUI(new_var.value[k])+'</span></td>';
+						ret += '<td><span class="span_value_variable boolean_vector_var" data-index="'+k+'">'+LocalizedStrings.getUI(`logic_value_${new_var.value[k]}`)+'</span></td>';
 					} else {
 						ret += '<td><span class="span_value_variable vector_var" data-index="'+k+'">'+new_var.value[k]+'</span>'+'</td>';
 					}
@@ -254,7 +264,7 @@ function renderValues (new_var, variable_container, function_name) {
     				ret += '<tr>';
     				for (var k = 0; k < new_var.columns; k++) {
     					if (new_var.type == Types.BOOLEAN) { 
-    						ret += '<td><span class="span_value_variable boolean_matrix_var" data-index="'+k+'" data-row="'+l+'">'+LocalizedStrings.getUI(new_var.value[l][k])+'</span></td>';
+    						ret += '<td><span class="span_value_variable boolean_matrix_var" data-index="'+k+'" data-row="'+l+'">'+LocalizedStrings.getUI(`logic_value_${new_var.value[l][k]}`)+'</span></td>';
     					} else {
     						ret += '<td><span class="span_value_variable matrix_var" data-index="'+k+'" data-row="'+l+'">'+new_var.value[l][k]+'</span></td>';
     					}
@@ -369,7 +379,7 @@ function renderValues (new_var, variable_container, function_name) {
 
 function alternateBooleanMatrixValue (var_obj, row, index, value_container) {
 	var_obj.value[row][index] = !var_obj.value[row][index];
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(var_obj.value[row][index]));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${var_obj.value[row][index]}`));
 }
 
 function addLineMatrix (var_obj) {
@@ -378,14 +388,14 @@ function addLineMatrix (var_obj) {
 	if (var_obj.type == Types.INTEGER) {
 		var n_l = [];
 		for (var i = 0; i < var_obj.columns; i++) {
-			n_l.push(1);
+			n_l.push(0);
 		}
 		var_obj.value.push(n_l);
 	}
 	if (var_obj.type == Types.REAL) {
 		var n_l = [];
 		for (i = 0; i < var_obj.columns; i++) {
-			n_l.push(1.0);
+			n_l.push(0.0);
 		}
 		var_obj.value.push(n_l);
 	}
@@ -393,7 +403,7 @@ function addLineMatrix (var_obj) {
 	if (var_obj.type == Types.TEXT) {
 		var n_l = [];
 		for (i = 0; i < var_obj.columns; i++) {
-			n_l.push(LocalizedStrings.getUI('text_start'));
+			n_l.push(LocalizedStrings.getUI('textvar_default_value'));
 		}
 		var_obj.value.push(n_l);
 	}
@@ -421,17 +431,17 @@ function addColumnMatrix (var_obj) {
 
 	if (var_obj.type == Types.INTEGER) {
 		for (var i = 0; i < var_obj.rows; i++) {
-			var_obj.value[i].push(1);
+			var_obj.value[i].push(0);
 		}
 	}
 	if (var_obj.type == Types.REAL) {
 		for (var i = 0; i < var_obj.rows; i++) {
-			var_obj.value[i].push(1.0);
+			var_obj.value[i].push(0.0);
 		}
 	}
 	if (var_obj.type == Types.TEXT) {
 		for (var i = 0; i < var_obj.rows; i++) {
-			var_obj.value[i].push(LocalizedStrings.getUI('text_start'));
+			var_obj.value[i].push(LocalizedStrings.getUI('textvar_default_value'));
 		}
 	}
 	if (var_obj.type == Types.BOOLEAN) {
@@ -457,13 +467,13 @@ function addColumnVector (var_obj) {
 	var_obj.columns ++;
 
 	if (var_obj.type == Types.INTEGER) {
-		var_obj.value.push(1);
+		var_obj.value.push(0);
 	}
 	if (var_obj.type == Types.REAL) {
-		var_obj.value.push(1.0);
+		var_obj.value.push(0.0);
 	}
 	if (var_obj.type == Types.TEXT) {
-		var_obj.value.push(LocalizedStrings.getUI('text_start'));
+		var_obj.value.push(LocalizedStrings.getUI('textvar_default_value'));
 	}
 	if (var_obj.type == Types.BOOLEAN) {
 		var_obj.value.push(true);
@@ -481,49 +491,49 @@ function removeColumnVector (var_obj) {
 
 function alternateBooleanValue (var_obj, value_container) {
 	var_obj.value = !var_obj.value;
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(var_obj.value));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${var_obj.value}`));
 }
 
 function alternateBooleanVectorValue (var_obj, index, value_container) {
 	var_obj.value[index] = !var_obj.value[index];
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(var_obj.value[index]));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${var_obj.value[index]}`));
 }
 
 function updateInitialValues (variable_obj, function_name) {
 	if (variable_obj.type == Types.INTEGER) {
 		if (variable_obj.dimensions == 0) {
-			variable_obj.value = 1;
+			variable_obj.value = 0;
 		}
 		if (variable_obj.dimensions == 1) {
-			variable_obj.value = [1, 1];
+			variable_obj.value = [0, 0];
 		}
 		if (variable_obj.dimensions == 2) {
-			variable_obj.value = [[1, 1], [1, 1]];
+			variable_obj.value = [[0, 0], [0, 0]];
 		}
 	}
 
 	if (variable_obj.type == Types.REAL) {
 		if (variable_obj.dimensions == 0) {
-			variable_obj.value = 1.0;
+			variable_obj.value = 0.0;
 		}
 		if (variable_obj.dimensions == 1) {
-			variable_obj.value = [1.0, 1.0];
+			variable_obj.value = [0.0, 0.0];
 		}
 		if (variable_obj.dimensions == 2) {
-			variable_obj.value = [[1.0, 1.0], [1.0, 1.0]];
+			variable_obj.value = [[0.0, 0.0], [0.0, 0.0]];
 		}
 	}
 
 	if (variable_obj.type == Types.TEXT) {
 		if (variable_obj.dimensions == 0) {
-			variable_obj.value = LocalizedStrings.getUI('text_start');
+			variable_obj.value = LocalizedStrings.getUI('textvar_default_value');
 		}
 		if (variable_obj.dimensions == 1) {
-			variable_obj.value = [LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')];
+			variable_obj.value = [LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')];
 		}
 		if (variable_obj.dimensions == 2) {
-			variable_obj.value = [[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')], 
-									[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')]];
+			variable_obj.value = [[LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')], 
+									[LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')]];
 		}
 	}
 

+ 8 - 3
package-lock.json

@@ -1,6 +1,6 @@
 {
   "name": "ivprog",
-  "version": "1.1.0",
+  "version": "4.3.2",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
@@ -1964,6 +1964,11 @@
       "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
       "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
     },
+    "codemirror": {
+      "version": "5.48.0",
+      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.48.0.tgz",
+      "integrity": "sha512-3Ter+tYtRlTNtxtYdYNPxGxBL/b3cMcvPdPm70gvmcOO2Rauv/fUEewWa0tT596Hosv6ea2mtpx28OXBy1mQCg=="
+    },
     "collection-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -4923,8 +4928,8 @@
       }
     },
     "line-i18n": {
-      "version": "git+https://git.lcalion.com/LInE/line-i18n.git#26eef66020a63cfc2431dd8260ceff28243e4936",
-      "from": "git+https://git.lcalion.com/LInE/line-i18n.git",
+      "version": "git+http://200.144.254.107/git/LInE/line-i18n.git#5cb79a76f43abef6b3b70035f735e47599e90251",
+      "from": "git+http://200.144.254.107/git/LInE/line-i18n.git",
       "requires": {
         "ts-loader": "^5.*",
         "typescript": "^3.*",

+ 2 - 1
package.json

@@ -47,8 +47,9 @@
   },
   "dependencies": {
     "antlr4": "^4.7.2",
+    "codemirror": "^5.48.0",
     "decimal.js": "^10.1.1",
-    "line-i18n": "git+https://git.lcalion.com/LInE/line-i18n.git",
+    "line-i18n": "git+http://200.144.254.107/git/LInE/line-i18n.git",
     "melanke-watchjs": "^1.5.0",
     "server": "^1.0.18"
   }

+ 9 - 2
templates/index.html

@@ -5,8 +5,12 @@
     <title></title>
     <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.0/semantic.min.css" integrity="sha256-9mbkOfVho3ZPXfM7W8sV2SndrGDuh7wuyLjtsWeTI1Q=" crossorigin="anonymous" />
+    <link rel="stylesheet" type="text/css" href="css/codemirror.css">
+    <link rel="stylesheet" type="text/css" href="css/show-hint.css">
+    <link rel="stylesheet" type="text/css" href="css/ttcn.css">
     <link rel="stylesheet" type="text/css" href="css/ivprog-visual-1.0.css">
     <link rel="stylesheet" type="text/css" href="css/ivprog-term.css">
+    <link rel="stylesheet" type="text/css" href="css/ivprog-editor.css">
     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
     <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"
       integrity="sha256-KM512VNnjElC30ehFwehXjx1YCHPiQkOPmqnrWtpccM="
@@ -97,13 +101,16 @@
 
 
         <div class="ui one column container segment ivprog_textual_panel loading" style="display: none;">
-          <textarea class="ivprog_textual_code" readonly></textarea>
+          <textarea id="ivprog-text-editor" class=".ivprog_textual_code"></textarea>
         </div>
         <div id='ivprog-term-div' class="six column wide">
           
         </div>
       </div>
-
+    </div>
+    <div class="dimmer_content_message">
+      <h3>Aconteceu um erro ao processar a atividade. <br> Recarregue a página para tentar novamente.</h3>
+      <button class="positive ui button" onclick="window.parent.location.reload()">Recarregar</button>
     </div>
     <script src="js/iassign-integration-functions.js"></script>
   </div>

+ 11 - 23
templates/runner.html

@@ -1,32 +1,20 @@
 <!DOCTYPE html>
 <html>
 <head>
-
-  <link rel="stylesheet" type="text/css" href="css/ivprog-term.css">
-
+  <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.0/semantic.min.css" integrity="sha256-9mbkOfVho3ZPXfM7W8sV2SndrGDuh7wuyLjtsWeTI1Q=" crossorigin="anonymous" />
-  <style>
-    .ivprog-io-output {
-      border: 1px solid gainsboro;
-      width: 80%;
-      height: 360px;
-      overflow-y: scroll;
-      background-color: black;
-      color: white;
-    }
-
-    .ivprog-io-input {
-      width: 80%;
-      margin-top: 10px;
-      border: 1.5px solid green;
-      height: 3rem;
-      color: black;
-      font-size: 12pt;
-    }
-  </style>
-  <title></title>
+  <link rel="stylesheet" type="text/css" href="css/ivprog-visual-1.0.css">
+  <link rel="stylesheet" type="text/css" href="css/ivprog-term.css">
   <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"
+    integrity="sha256-KM512VNnjElC30ehFwehXjx1YCHPiQkOPmqnrWtpccM="
+    crossorigin="anonymous"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.0/semantic.min.js" integrity="sha256-x1fC6BXl6BwnUhfQqqqC0Fd/n12wH+u8u9va6+E7xaA=" crossorigin="anonymous"></script>
   <script type="text/javascript" src="js/jquery.json-editor.min.js"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"
+      integrity="sha256-KM512VNnjElC30ehFwehXjx1YCHPiQkOPmqnrWtpccM="
+      crossorigin="anonymous"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.0/semantic.min.js" integrity="sha256-x1fC6BXl6BwnUhfQqqqC0Fd/n12wH+u8u9va6+E7xaA=" crossorigin="anonymous"></script>
 </head>
 <body>
     <div style="padding-top: 50px;content: ''"></div>

+ 5 - 3
webpack.config.js

@@ -56,12 +56,16 @@ module.exports = {
       }),
       /*new ChangeScriptSourcePlugin(),*/
       new CopyPlugin([
+        {from:'js/iassign-integration-functions.js', to:path.resolve(__dirname, 'build/js')},
         {from:"css/ivprog-visual-1.0.css", to:path.resolve(__dirname, 'build/css')},
         {from:"css/ivprog-term.css", to:path.resolve(__dirname, 'build/css')},
+        {from:"css/ivprog-editor.css", to:path.resolve(__dirname, 'build/css')},
         {from:'js/Sortable.js', to:path.resolve(__dirname, 'build/js')},
-        {from:'js/iassign-integration-functions.js', to:path.resolve(__dirname, 'build/js')},
         {from: 'img/trash-icon.png', to:path.resolve(__dirname, 'build/img')},
         {from:'js/jquery.json-editor.min.js', to:path.resolve(__dirname, 'build/js')},
+        {from:'node_modules/codemirror/lib/codemirror.css', to:path.resolve(__dirname, 'build/css')},
+        {from:'node_modules/codemirror/addon/hint/show-hint.css', to:path.resolve(__dirname, 'build/css')},
+        {from:'node_modules/codemirror/theme/ttcn.css', to:path.resolve(__dirname, 'build/css')},
         /*{from:'index.html', to:path.resolve(__dirname, 'build')},
         {from:'runner.html', to:path.resolve(__dirname, 'build')},*/
       ])
@@ -75,8 +79,6 @@ module.exports = {
     watchOptions: {
         ignored: [
           path.resolve(__dirname, '.ima_version.json'),
-          path.resolve(__dirname, 'index.html'),
-          path.resolve(__dirname, 'runner.html')
         ]
     }
 };