Browse Source

Ainda por botar sombra

Douglas Lima 6 years ago
parent
commit
dd0ca79ce4
10 changed files with 2988 additions and 493 deletions
  1. 55 15
      index.html
  2. 10 0
      js/main-sidebar.js
  3. 737 0
      js/visualUI/commands_sidebar.js
  4. 17 17
      js/visualUI/functions.js
  5. 849 0
      js/visualUI/functions_sidebar.js
  6. 888 0
      js/visualUI/globals_sidebar.js
  7. 296 457
      package-lock.json
  8. 2 2
      package.json
  9. 3 2
      webpack.config.js
  10. 131 0
      ~index.html

+ 55 - 15
index.html

@@ -14,10 +14,10 @@
 
     <script src="js/jquery-ui.js"></script>
     <script src="js/Sortable.js"></script>
-    
+
   </head>
   <body>
-   
+
     <div class="ui one column doubling stackable grid container">
       <div class="column">
         <div class="ui container main_title">
@@ -25,7 +25,7 @@
           <span>interactive coding</span>
         </div>
 
-        
+
 
         <div class="ui container content_margin">
           <div class="content_sub_margin">
@@ -45,14 +45,45 @@
 
 
       </div>
-      
+
     </div>
 
-    
+    <div class="ui equal height stretched  centered grid">
+      <div class="five wide column">
+        <div class="ui raised container segment div_to_menu">
 
-    
+          <div class="ui top attached tabular menu">
+            <a class="item" data-tab="variaveis">Vari&aacute;veis</a>
+            <a class="item active" data-tab="funcoes">Fun&ccedil;&otilde;es</a>
+          </div>
+          <div class="ui bottom attached tab segment" data-tab="variaveis">
+            <div class="ui one column container segment ivprog_visual_panel loading">
+              <div class="global_var">
+                <div class="ui icon button add-globalVar-button add_global_button"><i class="icon superscript"></i></div>
+              </div>
+              <div class="ui container list_globals list-group"></div>
+            </div>
+          </div>
+          <div class="ui bottom attached tab segment active" data-tab="funcoes">
+            <div class="ui one column container segment ivprog_visual_panel loading">
+                <!--mudar-->
+                <!-- <div class="ui teal small labeled icon button add_function_button" draggable="true">
+                  <data class="i18n" value="Function">Function</data>
+                  <i class="add icon"></i>
+                  </div> -->
+
+              <div class="ui container list-group list-commands">
+                <div class="ui divider"></div>
+                <div class="functions_labels"></div>
+              </div>
 
-    <div class="ui raised container segment div_to_body">
+            </div>
+          </div>
+
+        </div>
+      </div>
+      <div class="ten wide column">
+        <div class="ui raised container segment div_to_body">
 
       <div class="ui icon menu center aligned container" style="width: 438px; margin-top: -10px;">
         <a class="item">
@@ -87,13 +118,7 @@
       <div class="ui one column container segment ivprog_visual_panel loading">
         <div class="program_signature"><data class="i18n" value="ui:program">program</data> { </div>
 
-        <div class="global_var">
-          
-          <div class="ui icon button add-globalVar-button add_global_button"><i class="icon superscript"></i></div>
-
-          <div class="list_globals"></div>
 
-        </div>
 
         <div class="all_functions list-group" id="listWithHandle">
 
@@ -114,12 +139,27 @@
       </div>
       <div id='ivprog-term' class="six column wide" style="display: none">
       </div>
-      
+
+    </div>
+      </div>
     </div>
 
+
+
+
     <script>
       $(document).ready(() => {
         ivprogCore.initVisualUI();
+
+        $('.menu .item')
+          .tab();    ;
+
+        document.querySelectorAll('.button.menu-item').forEach(function(element, index, array) {
+          element.addEventListener('dragstart', function(e) {
+              console.log(this);
+
+          }, false);
+        });
       });
     </script>
 
@@ -128,4 +168,4 @@
     <script src="js/semantic/semantic-buttons.js"></script>
 
   </body>
-</html>
+</html>

+ 10 - 0
js/main-sidebar.js

@@ -0,0 +1,10 @@
+import { runner } from './runner';
+import { initVisualUI } from './visualUI/functions_sidebar';
+import { LocalizedStrings, StringTypes } from './services/localizedStringsService';
+
+export {
+  runner,
+  initVisualUI,
+  LocalizedStrings,
+  StringTypes
+}

+ 737 - 0
js/visualUI/commands_sidebar.js

@@ -0,0 +1,737 @@
+import $ from 'jquery';
+import { Types } from './types';
+import * as Models from './ivprog_elements';
+import { LocalizedStrings } from './../services/localizedStringsService';
+import * as GlobalsManagement from './globals';
+import * as VariablesManagement from './variables';
+import * as CommentsManagement from './commands/comment';
+import * as ReadersManagement from './commands/reader';
+import * as WritersManagement from './commands/writer';
+import * as AttributionsManagement from './commands/attribution';
+import * as IftruesManagement from './commands/iftrue';
+import * as RepeatNtimesManagement from './commands/repeatNtimes';
+import * as WhiletruesManagement from './commands/whiletrue';
+import * as DowhiletruesManagement from './commands/dowhiletrue';
+import * as SwitchesManagement from './commands/switch';
+import * as FunctioncallsManagement from './commands/functioncall';
+import * as VariableValueMenuManagement from './commands/variable_value_menu';
+
+var has_element_created_draged = false;
+var which_element_is_draged = null;
+
+export function removeCommand (command, function_obj, dom_obj) {
+	if (function_obj.commands.indexOf(command) > -1) {
+		function_obj.commands.splice(function_obj.commands.indexOf(command), 1);
+		return true;
+	}
+
+	// Utilize dois parantNode, pois o primeiro é o div de comandos
+	if ($(dom_obj[0].parentNode.parentNode).data('command').commands_block.indexOf(command) > -1) {
+		$(dom_obj[0].parentNode.parentNode).data('command').commands_block.splice
+		($(dom_obj[0].parentNode.parentNode).data('command').commands_block.indexOf(command), 1);
+		return true;
+	}
+	return false;
+}
+
+export function createFloatingCommand (function_obj, function_container, command_type, mouse_event) {
+	var floatingObject;
+
+	switch (command_type) {
+		case Models.COMMAND_TYPES.comment:
+			floatingObject = CommentsManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.reader:
+			floatingObject = ReadersManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.writer:
+			floatingObject = WritersManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.attribution:
+			floatingObject = AttributionsManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.iftrue:
+			floatingObject = IftruesManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.repeatNtimes:
+			floatingObject = RepeatNtimesManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.whiletrue:
+			floatingObject = WhiletruesManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.dowhiletrue:
+			floatingObject = DowhiletruesManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.switch:
+			floatingObject = SwitchesManagement.createFloatingCommand();
+			break;
+
+		case Models.COMMAND_TYPES.functioncall:
+			floatingObject = FunctioncallsManagement.createFloatingCommand();
+			break;
+	}
+
+	floatingObject.draggable().appendTo("body");
+
+	floatingObject.mouseup(function(evt) {
+	  manageCommand(function_obj, function_container, evt, command_type);
+	});
+
+	floatingObject.css("position", "absolute");
+	mouse_event.type = "mousedown.draggable";
+	mouse_event.target = floatingObject[0];
+	floatingObject.css("left", mouse_event.pageX - 15);
+	floatingObject.css("top", mouse_event.pageY - 15);
+	floatingObject.trigger(mouse_event);
+}
+
+// before_after_inside: 1 -> before, 2 -> after, 3 -> inside
+export function renderCommand (command, element_reference, before_after_inside, function_obj) {
+	var createdElement;
+	switch (command.type) {
+		case Models.COMMAND_TYPES.comment:
+			createdElement = CommentsManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.reader:
+			createdElement = ReadersManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.writer:
+			createdElement = WritersManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.attribution:
+			createdElement = AttributionsManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.functioncall:
+			createdElement = FunctioncallsManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.iftrue:
+			createdElement = IftruesManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.repeatNtimes:
+			createdElement = RepeatNtimesManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.whiletrue:
+			createdElement = WhiletruesManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.dowhiletrue:
+			createdElement = DowhiletruesManagement.renderCommand(command, function_obj);
+			break;
+
+		case Models.COMMAND_TYPES.switch:
+			createdElement = SwitchesManagement.renderCommand(command, function_obj);
+			break;
+
+	}
+
+	switch (before_after_inside) {
+		case 1:
+			createdElement.insertBefore(element_reference);
+			break;
+
+		case 2:
+			createdElement.insertAfter(element_reference);
+			break;
+
+		case 3:
+			element_reference.append(createdElement);
+			break;
+	}
+
+}
+
+export function genericCreateCommand (command_type) {
+
+	switch (command_type) {
+		case Models.COMMAND_TYPES.comment:
+			return new Models.Comment(new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.only_value, LocalizedStrings.getUI('text_comment'), null, null, false));
+
+		case Models.COMMAND_TYPES.reader:
+			return new Models.Reader(new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.only_variable, null, null, null, false));
+
+		case Models.COMMAND_TYPES.writer:
+			return new Models.Writer([new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true)]);
+
+		case Models.COMMAND_TYPES.attribution:
+			return new Models.Attribution(new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.only_variable, null, null, null, false),
+				[]);
+
+		case Models.COMMAND_TYPES.functioncall:
+			return new Models.FunctionCall(new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.only_function, null, null, null, false), null);
+
+		case Models.COMMAND_TYPES.iftrue:
+			return new Models.IfTrue(null, null, null);
+
+		case Models.COMMAND_TYPES.repeatNtimes:
+			return new Models.RepeatNTimes(null, null, null, null);
+
+		case Models.COMMAND_TYPES.whiletrue:
+			return new Models.WhileTrue(null, null);
+
+		case Models.COMMAND_TYPES.dowhiletrue:
+			return new Models.DoWhileTrue(null, null);
+
+		case Models.COMMAND_TYPES.switch:
+			return new Models.Switch(null, null, null);
+	}
+}
+
+function manageCommand (function_obj, function_container, event, command_type) {
+
+	$( ".created_element" ).each(function( index ) {
+		$(this).remove();
+	});
+
+	var el = $(document.elementFromPoint(event.clientX, event.clientY));
+	console.log('soltou no: ');
+	console.log(el);
+	console.log(el.data('fun'));
+
+	// Primeiro verificar se ele soltou no espaço da função correta:
+	var hier = el.parentsUntil(".all_functions");
+	var esta_correto = false;
+	var esta_na_div_correta = false;
+	if (el.hasClass("commands_list_div")) {
+		esta_na_div_correta = true;
+	}
+	for (var i = 0; i < hier.length; i++) {
+		var temp = $(hier[i]);
+		if (temp.hasClass("commands_list_div")) {
+			esta_na_div_correta = true;
+		}
+		if (temp.data('fun') == function_obj) {
+			esta_correto = true;
+			break;
+		}
+	}
+	if (!esta_correto) {
+		has_element_created_draged = false;
+		which_element_is_draged = null;
+		return;
+	} else {
+		if (!esta_na_div_correta) {
+			has_element_created_draged = false;
+			which_element_is_draged = null;
+			return;
+		}
+	}
+
+	// Agora é descobrir qual o escopo para adicionar o comando:
+
+	// Se o elemento clicado possuir o atributo "fun", então, é direto na div dos comandos:
+	if (typeof el.data('fun') !== 'undefined') {
+
+		// Se a lista de comandos estiver vazia, então é o primeiro.
+		// Portanto, ele deve soltar o elemento obrigatoriamente no objeto vazio
+		if ((el.data('fun').commands == null)  || (el.data('fun').commands.length == 0)) {
+				// pode adicionar
+				el.data('fun').commands = [];
+
+				var new_cmd = genericCreateCommand(command_type);
+
+				el.data('fun').commands.push(new_cmd);
+
+				renderCommand(new_cmd, $(function_container).find('.commands_list_div'), 3, function_obj);
+
+		} else { // Entra nesse else, caso já existam outros comandos no bloco:
+
+			findNearbyCommandToAddInFunctionScope(el, event, $(function_container).find('.commands_list_div'), function_obj, command_type);
+		}
+
+	} else {
+		console.log("soltou em um comando");
+		// descobrir em qual comando ele soltou:
+		var hier_find = el.parentsUntil(".commands_list_div");
+		var hierarquia_bottom_up = [];
+		if (typeof el.data('command') !== 'undefined') {
+			hierarquia_bottom_up.push(el.data('command'));
+		}
+		for (var i = 0; i < hier_find.length; i++) {
+			if (typeof $(hier_find[i]).data('command') !== 'undefined') {
+				hierarquia_bottom_up.push($(hier_find[i]).data('command'));
+			}
+		}
+		console.log("comando em que soltou: ");
+		console.log(hierarquia_bottom_up[0]);
+		console.log("hierarquia de baixo para cima na árvore, de onde ele soltou: ");
+		for (var i = 0; i < hierarquia_bottom_up.length; i++) {
+			console.log(hierarquia_bottom_up[i]);
+		}
+
+		// se a hierarquia possuir apenas um elemento, então está na raiz dos comandos:
+		if (hierarquia_bottom_up.length == 1) {
+			var sub_elemento = false;
+			for (var i = 0; i < hier_find.length; i++) {
+				if (typeof $(hier_find[i]).data('command') !== 'undefined') {
+					findBeforeOrAfterCommandToAdd(hier_find[i], event, function_obj, command_type);
+					sub_elemento = true;
+					break;
+				}
+			}
+			if (!sub_elemento) {
+				findBeforeOrAfterCommandToAdd(el[0], event, function_obj, command_type);
+			}
+		} else {
+			// caso exista mais de um elemento na hierarquia:
+			if (typeof $(el).data('command') !== 'undefined') {
+				console.log("PPP1");
+				insertCommandInBlockHierar(el[0], event, function_obj, command_type, hier_find, hierarquia_bottom_up);
+			} else {
+				var sub_elemento = false;
+				for (var i = 0; i < hier_find.length; i++) {
+					if (typeof $(hier_find[i]).data('command') !== 'undefined') {
+						insertCommandInBlockHierar(hier_find[i], event, function_obj, command_type, hier_find, hierarquia_bottom_up);
+						sub_elemento = true;
+						break;
+					}
+				}
+			}
+
+		}
+	}
+
+	has_element_created_draged = false;
+	which_element_is_draged = null;
+}
+
+function insertCommandInBlockHierar (el, event, function_obj, command_type, hier_dom, hier_obj) {
+	var el_jq = $(el);
+	var command_parent = el_jq.data('command');
+
+	if ((el_jq.data('command').type == Models.COMMAND_TYPES.repeatNtimes) ||
+		(el_jq.data('command').type == Models.COMMAND_TYPES.whiletrue)  ||
+		(el_jq.data('command').type == Models.COMMAND_TYPES.dowhiletrue) ||
+		(el_jq.data('command').type == Models.COMMAND_TYPES.iftrue) ||
+		(el_jq.data('command').type == Models.COMMAND_TYPES.switch) ) {
+
+		if ((el_jq.data('command').type == Models.COMMAND_TYPES.repeatNtimes) ||
+			(el_jq.data('command').type == Models.COMMAND_TYPES.whiletrue)  ||
+			(el_jq.data('command').type == Models.COMMAND_TYPES.dowhiletrue) ) {
+
+			// Se não tiver outro comando ainda no bloco, só adiciona:
+			if (command_parent.commands_block == null || command_parent.commands_block.length == 0) {
+				command_parent.commands_block = [];
+
+				var recentComand = genericCreateCommand(command_type);
+				command_parent.commands_block.push(recentComand);
+
+				renderCommand(recentComand, el_jq.find('.block_commands'), 3, function_obj);
+			} else { // Se já tem algum comando no bloco:
+				findNearbyCommandToAddInBlockScope(el, event, el, function_obj, command_type, command_parent);
+			}
+
+		} else {
+			// QUANDO FOR BLOCO DO TIPO IF OU SWITCH/CASE:
+		}
+
+	} else {
+		// entra neste bloco, se soltou o comando sobre outro comando dentro de um subbloco:
+		findBeforeOrAfterCommandToAddInsertBlock(el, event, function_obj, command_type);
+	}
+}
+
+
+
+function findNearbyCommandToAddInBlockScope (el, event, node_list_commands, function_obj, command_type, command_parent) {
+
+	var all_sub = $(node_list_commands).find('div.command_container');
+
+	var menor_distancia = 999999999;
+	var elemento_menor_distancia = null;
+	var antes = true;
+
+	var t_bot;
+	var t_top;
+
+	// Descobrindo o elemento mais próximo:
+	for (var i = 0; i < all_sub.length; i++) {
+
+		t_top = all_sub[i].getBoundingClientRect().top;
+		t_bot = all_sub[i].getBoundingClientRect().top + all_sub[i].getBoundingClientRect().height;
+
+		if ((t_top - event.clientY) < menor_distancia) {
+			menor_distancia = event.clientY - t_top;
+			elemento_menor_distancia = all_sub[i];
+		}
+	}
+
+	var borda_inferior = elemento_menor_distancia.parentNode.getBoundingClientRect().top + elemento_menor_distancia.parentNode.getBoundingClientRect().height;
+
+	// Está mais próximo da borda de baixo, ou seja.. inserir por último:
+	if ((borda_inferior - event.clientY) < menor_distancia) {
+
+		var recentComand = genericCreateCommand(command_type);
+		command_parent.commands_block.push(recentComand);
+		//
+		renderCommand(recentComand, node_list_commands, 3, function_obj);
+
+	} else {
+
+		var recentComand = genericCreateCommand(command_type);
+
+		var index = command_parent.commands_block.indexOf($(elemento_menor_distancia).data('command'));
+
+		if (index > -1) {
+		    command_parent.commands_block.splice(index, 0, recentComand);
+		}
+
+		renderCommand(recentComand, elemento_menor_distancia, 1, function_obj);
+	}
+}
+
+
+
+function findBeforeOrAfterCommandToAddInsertBlock (el, event, function_obj, command_type) {
+
+	var el_jq = $(el);
+	var command_parent = $(el.parentNode.parentNode).data('command');
+	var command_target = el_jq.data('command');
+
+	var menor_distancia = 999999999;
+	var antes = true;
+
+	var t_bot;
+	var t_top;
+
+	t_top = el.getBoundingClientRect().top;
+	t_bot = el.getBoundingClientRect().top + el.getBoundingClientRect().height;
+
+	var d_top = event.clientY - t_top; // distancia topo
+	var d_bot = t_bot - event.clientY; // distancia baixo
+
+	// Está mais próximo da borda de baixo, ou seja.. inserir por último:
+
+	if (d_top < d_bot) {
+
+		var recentComand = genericCreateCommand(command_type);
+
+		var index = command_parent.commands_block.indexOf(command_target);
+
+		if (index > -1) {
+		    command_parent.commands_block.splice(index, 0, recentComand);
+		}
+
+		renderCommand(recentComand, el, 1, function_obj);
+
+	} else {
+		var recentComand = genericCreateCommand(command_type);
+
+		var index = command_parent.commands_block.indexOf(command_target);
+
+		if (index > -1) {
+		    command_parent.commands_block.splice((index + 1), 0, recentComand);
+		}
+
+		renderCommand(recentComand, el, 2, function_obj);
+	}
+}
+
+function insertCommandInBlock (el, event, function_obj, command_type) {
+	var el_jq = $(el);
+	var command_parent = el_jq.data('command');
+
+	if ((el_jq.data('command').type == Models.COMMAND_TYPES.repeatNtimes) ||
+		(el_jq.data('command').type == Models.COMMAND_TYPES.whiletrue)  ||
+		(el_jq.data('command').type == Models.COMMAND_TYPES.dowhiletrue) ) {
+
+		// Se não tiver outro comando ainda no bloco, só adiciona:
+		if (command_parent.commands_block == null || command_parent.commands_block.length == 0) {
+			command_parent.commands_block = [];
+
+			var recentComand = genericCreateCommand(command_type);
+			command_parent.commands_block.push(recentComand);
+
+			renderCommand(recentComand, el_jq.find('.block_commands'), 3, function_obj);
+		} else { // Se já tem algum comando no bloco:
+			findInBlockCorrectPlace(el, event, function_obj, command_type);
+		}
+
+	} else {
+		console.log("PPP2");
+	}
+}
+
+function findInBlockCorrectPlace (el, event, function_obj, command_type) {
+	var el_jq = $(el);
+	var all_sub = el_jq.find('div.command_container');
+
+	var menor_distancia = 999999999;
+	var elemento_menor_distancia = null;
+	var antes = true;
+
+	var t_bot;
+	var t_top;
+
+	// Descobrindo o elemento mais próximo:
+	for (var i = 0; i < all_sub.length; i++) {
+
+		t_top = all_sub[i].getBoundingClientRect().top;
+		t_bot = all_sub[i].getBoundingClientRect().top + all_sub[i].getBoundingClientRect().height;
+
+		if ((t_top - event.clientY) < menor_distancia) {
+			menor_distancia = event.clientY - t_top;
+			elemento_menor_distancia = all_sub[i];
+		}
+	}
+
+	var borda_inferior = elemento_menor_distancia.parentNode.getBoundingClientRect().top + elemento_menor_distancia.parentNode.getBoundingClientRect().height;
+
+	// Está mais próximo da borda de baixo, ou seja.. inserir por último:
+	if ((borda_inferior - event.clientY) < menor_distancia) {
+
+		var recentComand = genericCreateCommand(command_type);
+
+		var command_parent = el_jq.data('command');
+
+		command_parent.commands_block.push(recentComand);
+
+		renderCommand(recentComand, $(el_jq.find('.block_commands')[0]), 3, function_obj);
+
+	} else {
+
+		var recentComand = genericCreateCommand(command_type);
+
+		var command_parent = el_jq.data('command');
+
+		var index = command_parent.commands_block.indexOf($(elemento_menor_distancia).data('command'));
+
+		if (index > -1) {
+		    command_parent.commands_block.splice(index, 0, recentComand);
+		    renderCommand(recentComand, elemento_menor_distancia, 1, function_obj);
+		}
+	}
+}
+
+function findBeforeOrAfterCommandToAdd (el, event, function_obj, command_type) {
+	switch ($(el).data('command').type) {
+		case Models.COMMAND_TYPES.iftrue:
+		case Models.COMMAND_TYPES.switch:
+		case Models.COMMAND_TYPES.repeatNtimes:
+		case Models.COMMAND_TYPES.whiletrue:
+		case Models.COMMAND_TYPES.dowhiletrue:
+			insertCommandInBlock(el, event, function_obj, command_type);
+			return;
+	}
+
+	var menor_distancia = 999999999;
+	var antes = true;
+
+	var t_bot;
+	var t_top;
+
+	t_top = el.getBoundingClientRect().top;
+	t_bot = el.getBoundingClientRect().top + el.getBoundingClientRect().height;
+
+	var d_top = event.clientY - t_top; // distancia topo
+	var d_bot = t_bot - event.clientY; // distancia baixo
+
+	// Está mais próximo da borda de baixo, ou seja.. inserir por último:
+	if (d_top < d_bot) {
+
+		var recentComand = genericCreateCommand(command_type);
+
+		var index = function_obj.commands.indexOf($(el).data('command'));
+
+		if (index > -1) {
+		    function_obj.commands.splice(index, 0, recentComand);
+		}
+
+		renderCommand(recentComand, el, 1, function_obj);
+
+	} else {
+		var recentComand = genericCreateCommand(command_type);
+
+		var index = function_obj.commands.indexOf($(el).data('command'));
+
+		if (index > -1) {
+		    function_obj.commands.splice((index + 1), 0, recentComand);
+		}
+
+		renderCommand(recentComand, el, 2, function_obj);
+	}
+}
+
+function findNearbyCommandToAddInFunctionScope (el, event, node_list_commands, function_obj, command_type) {
+
+	var all_sub = $(node_list_commands).find('div.command_container');
+
+	var menor_distancia = 999999999;
+	var elemento_menor_distancia = null;
+	var antes = true;
+
+	var t_bot;
+	var t_top;
+
+	// Descobrindo o elemento mais próximo:
+	for (var i = 0; i < all_sub.length; i++) {
+
+		t_top = all_sub[i].getBoundingClientRect().top;
+		t_bot = all_sub[i].getBoundingClientRect().top + all_sub[i].getBoundingClientRect().height;
+
+		if ((t_top - event.clientY) < menor_distancia) {
+			menor_distancia = event.clientY - t_top;
+			elemento_menor_distancia = all_sub[i];
+		}
+	}
+
+	var borda_inferior = elemento_menor_distancia.parentNode.getBoundingClientRect().top + elemento_menor_distancia.parentNode.getBoundingClientRect().height;
+
+	// Está mais próximo da borda de baixo, ou seja.. inserir por último:
+	if ((borda_inferior - event.clientY) < menor_distancia) {
+
+		var recentComand = genericCreateCommand(command_type);
+		function_obj.commands.push(recentComand);
+		//
+		renderCommand(recentComand, node_list_commands, 3, function_obj);
+
+	} else {
+
+		var recentComand = genericCreateCommand(command_type);
+
+		var index = function_obj.commands.indexOf($(elemento_menor_distancia).data('command'));
+
+		if (index > -1) {
+		    function_obj.commands.splice(index, 0, recentComand);
+		}
+
+		renderCommand(recentComand, elemento_menor_distancia, 1, function_obj);
+	}
+}
+
+//******************************************************
+//* DOUGLAS
+//******************************************************
+
+manageCommand = function(function_obj, function_container, event, command_type) {
+
+	$( ".created_element" ).each(function( index ) {
+		$(this).remove();
+	});
+
+	var el = $(document.elementFromPoint(event.clientX, event.clientY));
+	console.log('soltou no: ');
+	console.log(el);
+	console.log(el.data('fun'));
+
+	// Primeiro verificar se ele soltou no espaço da função correta:
+	var hier = el.parentsUntil(".all_functions");
+	var esta_correto = false;
+	var esta_na_div_correta = false;
+	if (el.hasClass("commands_list_div")) {
+		esta_na_div_correta = true;
+	}
+	for (var i = 0; i < hier.length; i++) {
+		var temp = $(hier[i]);
+		if (temp.hasClass("commands_list_div")) {
+			esta_na_div_correta = true;
+		}
+		if (temp.data('fun') == function_obj || function_obj == null) {
+			function_obj = temp.data('fun');
+			esta_correto = true;
+			break;
+		}
+	}
+	if (!esta_correto) {
+		has_element_created_draged = false;
+		which_element_is_draged = null;
+		return;
+	} else {
+		if (!esta_na_div_correta) {
+			has_element_created_draged = false;
+			which_element_is_draged = null;
+			return;
+		}
+	}
+
+	// Agora é descobrir qual o escopo para adicionar o comando:
+
+	// Se o elemento clicado possuir o atributo "fun", então, é direto na div dos comandos:
+	if (typeof el.data('fun') !== 'undefined') {
+
+		// Se a lista de comandos estiver vazia, então é o primeiro.
+		// Portanto, ele deve soltar o elemento obrigatoriamente no objeto vazio
+		if ((el.data('fun').commands == null)  || (el.data('fun').commands.length == 0)) {
+				// pode adicionar
+				el.data('fun').commands = [];
+
+				var new_cmd = genericCreateCommand(command_type);
+
+				el.data('fun').commands.push(new_cmd);
+
+				renderCommand(new_cmd, $(function_container).find('.commands_list_div'), 3, function_obj);
+
+		} else { // Entra nesse else, caso já existam outros comandos no bloco:
+
+			findNearbyCommandToAddInFunctionScope(el, event, $(function_container).find('.commands_list_div'), function_obj, command_type);
+		}
+
+	} else {
+		console.log("soltou em um comando");
+		// descobrir em qual comando ele soltou:
+		var hier_find = el.parentsUntil(".commands_list_div");
+		var hierarquia_bottom_up = [];
+		if (typeof el.data('command') !== 'undefined') {
+			hierarquia_bottom_up.push(el.data('command'));
+		}
+		for (var i = 0; i < hier_find.length; i++) {
+			if (typeof $(hier_find[i]).data('command') !== 'undefined') {
+				hierarquia_bottom_up.push($(hier_find[i]).data('command'));
+			}
+		}
+		console.log("comando em que soltou: ");
+		console.log(hierarquia_bottom_up[0]);
+		console.log("hierarquia de baixo para cima na árvore, de onde ele soltou: ");
+		for (var i = 0; i < hierarquia_bottom_up.length; i++) {
+			console.log(hierarquia_bottom_up[i]);
+		}
+
+		// se a hierarquia possuir apenas um elemento, então está na raiz dos comandos:
+		if (hierarquia_bottom_up.length == 1) {
+			var sub_elemento = false;
+			for (var i = 0; i < hier_find.length; i++) {
+				if (typeof $(hier_find[i]).data('command') !== 'undefined') {
+					findBeforeOrAfterCommandToAdd(hier_find[i], event, function_obj, command_type);
+					sub_elemento = true;
+					break;
+				}
+			}
+			if (!sub_elemento) {
+				findBeforeOrAfterCommandToAdd(el[0], event, function_obj, command_type);
+			}
+		} else {
+			// caso exista mais de um elemento na hierarquia:
+			if (typeof $(el).data('command') !== 'undefined') {
+				console.log("PPP1");
+				insertCommandInBlockHierar(el[0], event, function_obj, command_type, hier_find, hierarquia_bottom_up);
+			} else {
+				var sub_elemento = false;
+				for (var i = 0; i < hier_find.length; i++) {
+					if (typeof $(hier_find[i]).data('command') !== 'undefined') {
+						insertCommandInBlockHierar(hier_find[i], event, function_obj, command_type, hier_find, hierarquia_bottom_up);
+						sub_elemento = true;
+						break;
+					}
+				}
+			}
+
+		}
+	}
+
+	has_element_created_draged = false;
+	which_element_is_draged = null;
+}

+ 17 - 17
js/visualUI/functions.js

@@ -17,7 +17,7 @@ import WatchJS from 'melanke-watchjs';
 var counter_new_functions = 0;
 var counter_new_parameters = 0;
 
-let domConsole = null; 
+let domConsole = null;
 const program = new Models.Program();
 const variable1 = new Models.Variable(Types.REAL, "variable_1", 1, 1);
 const mainFunction = new Models.Function(LocalizedStrings.getUI("start"), Types.VOID, 0, [], true, false, [variable1]);
@@ -63,7 +63,7 @@ function updateReturnType (function_obj, new_type, new_dimensions = 0) {
 }
 
 function removeFunction (function_obj) {
-  
+
   var index = program.functions.indexOf(function_obj);
   if (index > -1) {
     program.functions.splice(index, 1);
@@ -134,7 +134,7 @@ function addHandlers (function_obj, function_container) {
 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);
       ret += '</div>';
@@ -161,13 +161,13 @@ function renderFunctionReturn (function_obj, function_element) {
             + '<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>'; 
+        + '</div>';
     }
 
     ret += '</div></div>';
 
     ret = $(ret);
-    
+
     function_element.find('.function_return').append(ret);
 }
 
@@ -179,14 +179,14 @@ function renderFunction (function_obj) {
   if (function_obj.function_comment) {
     //appender += renderComment(function_obj.function_comment, sequence, true, -1);
   }
-    
+
   appender += '<span class="glyphicon glyphicon-move move_function" aria-hidden="true"><i class="icon sort alternate vertical"></i></span>';
 
   appender += (function_obj.is_main ? '<div class="div_start_minimize_v"> </div>' : '<button class="ui icon button large remove_function_button"><i class="red icon times"></i></button>')
     + '<button class="ui icon button tiny minimize_function_button"><i class="icon window minimize"></i></button>';
 
   appender += '<div class="ui small icon buttons add_var_top_button"><div class="ui icon button add_var_button_function"><i class="icon superscript"></i></div>';
-  
+
   appender += '<div class="ui icon button dropdown menu_commands" ><i class="icon code"></i> <div class="menu"> ';
   appender += '<a class="item" data-command="'+Models.COMMAND_TYPES.reader+'"><i class="download icon"></i> ' +LocalizedStrings.getUI('text_read_var')+ '</a>'
         + '<a class="item" data-command="'+Models.COMMAND_TYPES.writer+'"><i class="upload icon"></i> '+LocalizedStrings.getUI('text_write_var')+'</a>'
@@ -208,10 +208,10 @@ function renderFunction (function_obj) {
   } else {
       appender += '<div class="ui function_return"></div>';
 
-      appender += '<div class="function_name_div"><span class="span_name_function name_function_updated">'+function_obj.name+'</span> <i class="icon small pencil alternate enable_edit_name_function name_function_updated"></i></div> ' 
+      appender += '<div class="function_name_div"><span class="span_name_function name_function_updated">'+function_obj.name+'</span> <i class="icon small pencil alternate enable_edit_name_function name_function_updated"></i></div> '
         + '( <i class="ui icon plus square outline add_parameter_button"></i> <div class="ui large labels parameters_list container_parameters_list">';
   }
-    
+
   appender += '</div> ) {</div>'
     + (function_obj.is_hidden ? ' <div class="function_area" style="display: none;"> ' : ' <div class="function_area"> ')
 
@@ -224,7 +224,7 @@ function renderFunction (function_obj) {
   if (function_obj.commands) {
     for (var l = 0; l < function_obj.commands.length; l++) {
       //appender += renderElementCommandGeneric(programa.funcoes[sequence].comandos[l], sequence, l, -1, l);
-      
+
     }
   }
 
@@ -246,7 +246,7 @@ function renderFunction (function_obj) {
   addHandlers(function_obj, appender);
 
 
-  // Rendering parameters: 
+  // Rendering parameters:
   for (var j = 0; j < function_obj.parameters_list.length; j++) {
     renderParameter(function_obj, function_obj.parameters_list[j], appender);
   }
@@ -370,7 +370,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
   ret += '<i class="dropdown icon"></i>'
     + '<div class="menu">';
 
-  
+
   for (var tm in Types) {
       if (tm == Types.VOID.toUpperCase()) {
         continue;
@@ -389,7 +389,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
           + '<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>'; 
+      + '</div>';
   }
 
   ret += '</div></div>';
@@ -397,13 +397,13 @@ function renderParameter (function_obj, parameter_obj, function_container) {
   ret += ' <i class="red icon times remove_parameter"></i></div>';
 
   ret = $(ret);
-  
+
   function_container.find('.container_parameters_list').append(ret);
 
   ret.find('.remove_parameter').on('click', function(e){
     removeParameter(function_obj, parameter_obj, ret);
   });
-  
+
   ret.find('.ui.dropdown.parameter_type').dropdown({
     onChange: function(value, text, $selectedItem) {
       if ($($selectedItem).data('dimensions')) {
@@ -549,5 +549,5 @@ function enableNameFunctionUpdate(function_obj, parent_node) {
       opened_input = false;
     }
   });
-  
-}
+
+}

+ 849 - 0
js/visualUI/functions_sidebar.js

@@ -0,0 +1,849 @@
+import $ from 'jquery';
+import { Types } from './types';
+import * as Models from './ivprog_elements';
+import { LocalizedStrings } from './../services/localizedStringsService';
+import * as GlobalsManagement from './globals_sidebar';
+import * as VariablesManagement from './variables';
+import * as CommandsManagement from './commands_sidebar';
+import * as CodeManagement from './code_generator';
+import * as VariableValueMenu from './commands/variable_value_menu';
+import { DOMConsole } from './../io/domConsole';
+import { IVProgParser } from './../ast/ivprogParser';
+import { IVProgProcessor } from './../processor/ivprogProcessor';
+import { LanguageService } from '../services/languageService';
+import WatchJS from 'melanke-watchjs';
+
+
+var counter_new_functions = 0;
+var counter_new_parameters = 0;
+
+let domConsole = null;
+const program = new Models.Program();
+const variable1 = new Models.Variable(Types.REAL, "variable_1", 1, 1);
+const mainFunction = new Models.Function(LocalizedStrings.getUI("start"), Types.VOID, 0, [], true, false, [variable1]);
+mainFunction.function_comment = new Models.Comment(LocalizedStrings.getUI('text_comment_main'));
+const parameter1 = new Models.Variable(Types.INTEGER, "par_1", 1);
+const command1 = new Models.Comment(new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.only_value, "Testing rendering commands"));
+
+const sumFunction = new Models.Function("soma", Types.INTEGER, 0, [parameter1], false, false, [], null, [command1]);
+
+program.addFunction(mainFunction);
+program.addFunction(sumFunction);
+
+window.program_obj = program;
+
+WatchJS.watch(program.globals, function(){
+      console.log("as globais foram alteradas!");
+  }, 1);
+
+function addFunctionHandler () {
+
+	var new_function = new Models.Function(LocalizedStrings.getUI("new_function") + "_" + counter_new_functions, Types.VOID, 0, [], false, false, [], new Models.Comment(LocalizedStrings.getUI('text_comment_start')));
+	program.addFunction(new_function);
+
+	counter_new_functions ++;
+
+  renderFunction(new_function);
+}
+
+function addParameter (function_obj, function_container) {
+  if (function_obj.parameters_list == null) {
+    function_obj.parameters_list = [];
+  }
+  var new_parameter = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI("new_parameter") + "_" + counter_new_parameters);
+  function_obj.parameters_list.push(new_parameter);
+  counter_new_parameters ++;
+
+  renderParameter(function_obj, new_parameter, function_container);
+}
+
+function updateReturnType (function_obj, new_type, new_dimensions = 0) {
+  function_obj.return_type = new_type;
+  function_obj.return_dimensions = new_dimensions;
+}
+
+function removeFunction (function_obj) {
+
+  var index = program.functions.indexOf(function_obj);
+  if (index > -1) {
+    program.functions.splice(index, 1);
+  }
+}
+
+function minimizeFunction (function_obj) {
+  function_obj.is_hidden = !function_obj.is_hidden;
+}
+
+function addHandlers (function_obj, function_container) {
+
+  function_container.find('.ui.dropdown.function_return').dropdown({
+      onChange: function(value, text, $selectedItem) {
+        $selectedItem = $($selectedItem);
+        if ($selectedItem.data('dimensions')) {
+          updateReturnType(function_obj, Types[$selectedItem.data('type')], $selectedItem.data('dimensions'));
+        } else {
+          updateReturnType(function_obj, Types[$selectedItem.data('type')]);
+        }
+      }
+  });
+
+  function_container.find( ".name_function_updated" ).on('click', function(e){
+    enableNameFunctionUpdate(function_obj, function_container);
+  });
+
+  function_container.find( ".add_parameter_button" ).on('click', function(e){
+    addParameter(function_obj, function_container);
+  });
+
+  function_container.find('.menu_commands').dropdown({
+      on: 'hover'
+    });
+
+  function_container.find('.menu_commands a').on('click', function(evt){
+    if (function_obj.commands == null || function_obj.commands.length == 0) {
+      function_obj.commands = [];
+      var new_cmd = CommandsManagement.genericCreateCommand($(this).data('command'));
+      function_obj.commands.push(new_cmd);
+
+      CommandsManagement.renderCommand(new_cmd, function_container.find('.commands_list_div'), 3, function_obj);
+    } else {
+      CommandsManagement.createFloatingCommand(function_obj, function_container, $(this).data('command'), evt);
+    }
+
+  });
+
+  function_container.find('.add_var_button_function').on('click', function(e){
+    VariablesManagement.addVariable(function_obj, function_container);
+  });
+
+  function_container.find('.remove_function_button').on('click', function(e){
+    removeFunction(function_obj);
+    function_container.slideUp(400);
+  });
+
+  function_container.find('.minimize_function_button').on('click', function(e){
+    minimizeFunction(function_obj);
+    function_container.find(".function_area").toggle();
+    function_container.find(".add_var_top_button").toggle();
+  });
+
+
+}
+
+// Essa função imprime o tipo de retorno da função e cria o menu do tipo 'select' para alteração
+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);
+      ret += '</div>';
+    } else {
+      ret += '<div class="text">'+LocalizedStrings.getUI(function_obj.return_type)+'</div>';
+    }
+
+    ret += '<i class="dropdown icon"></i>'
+      + '<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>';
+    }
+
+    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></div>';
+
+    ret = $(ret);
+
+    function_element.find('.function_return').append(ret);
+}
+
+
+function renderFunction (function_obj) {
+
+  var appender = '<div class="ui secondary segment function_div list-group-item">';
+
+  if (function_obj.function_comment) {
+    //appender += renderComment(function_obj.function_comment, sequence, true, -1);
+  }
+
+  appender += '<span class="glyphicon glyphicon-move move_function" aria-hidden="true"><i class="icon sort alternate vertical"></i></span>';
+
+  appender += (function_obj.is_main ? '<div class="div_start_minimize_v"> </div>' : '<button class="ui icon button large remove_function_button"><i class="red icon times"></i></button>')
+    + '<button class="ui icon button tiny minimize_function_button"><i class="icon window minimize"></i></button>';
+
+  appender += '<div class="ui small icon buttons add_var_top_button"><div class="ui icon button add_var_button_function"><i class="icon superscript"></i></div>';
+
+  appender += '<div class="ui icon button dropdown menu_commands" ><i class="icon code"></i> <div class="menu"> ';
+  appender += '<a class="item" data-command="'+Models.COMMAND_TYPES.reader+'"><i class="download icon"></i> ' +LocalizedStrings.getUI('text_read_var')+ '</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.writer+'"><i class="upload icon"></i> '+LocalizedStrings.getUI('text_write_var')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.comment+'"><i class="quote left icon"></i> '+LocalizedStrings.getUI('text_comment')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.attribution+'"><i class="arrow left icon"></i> '+LocalizedStrings.getUI('text_attribution')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.functioncall+'"><i class="hand point right icon"></i> '+LocalizedStrings.getUI('text_functioncall')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.iftrue+'" ><i class="random icon"></i> '+LocalizedStrings.getUI('text_iftrue')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.repeatNtimes+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_repeatNtimes')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.whiletrue+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_whiletrue')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.dowhiletrue+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_dowhiletrue')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.switch+'"><i class="list icon"></i> '+LocalizedStrings.getUI('text_switch')+'</a>'
+        + '</div></div></div>';
+
+  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> '
+        + '( <div class="ui large labels parameters_list">';
+  } else {
+      appender += '<div class="ui function_return"></div>';
+
+      appender += '<div class="function_name_div"><span class="span_name_function name_function_updated">'+function_obj.name+'</span> <i class="icon small pencil alternate enable_edit_name_function name_function_updated"></i></div> '
+        + '( <i class="ui icon plus square outline add_parameter_button"></i> <div class="ui large labels parameters_list container_parameters_list">';
+  }
+
+  appender += '</div> ) {</div>'
+    + (function_obj.is_hidden ? ' <div class="function_area" style="display: none;"> ' : ' <div class="function_area"> ')
+
+    + '<div class="ui top attached segment variables_list_div">'
+    /*+ renderVariables(function_obj, sequence)*/
+    + '</div>'
+    + '<div class="ui bottom attached segment commands_list_div" id="function_drag_cmd_">';
+
+
+  if (function_obj.commands) {
+    for (var l = 0; l < function_obj.commands.length; l++) {
+      //appender += renderElementCommandGeneric(programa.funcoes[sequence].comandos[l], sequence, l, -1, l);
+
+    }
+  }
+
+  appender += '</div>';
+
+  appender += '<div class="function_close_div">}</div>'
+    + '</div>'
+    + '</div>';
+
+  appender = $(appender);
+
+  $('.all_functions').append(appender);
+
+  appender.data('fun', function_obj);
+  appender.find('.commands_list_div').data('fun', function_obj);
+
+  renderFunctionReturn(function_obj, appender);
+
+  addHandlers(function_obj, appender);
+
+
+  // Rendering parameters:
+  for (var j = 0; j < function_obj.parameters_list.length; j++) {
+    renderParameter(function_obj, function_obj.parameters_list[j], appender);
+  }
+
+  // Rendering variables:
+  for (var j = 0; j < function_obj.variables_list.length; j++) {
+    VariablesManagement.renderVariable(appender, function_obj.variables_list[j], function_obj);
+  }
+
+  // Rendering commands:
+  for (var j = 0; j < function_obj.commands.length; j++) {
+    CommandsManagement.renderCommand(function_obj.commands[j], $(appender.find('.commands_list_div')[0]), 3, function_obj);
+  }
+
+}
+
+
+export function initVisualUI () {
+  // MUST USE CONST, LET, OR VAR !!!!!!
+  const mainDiv = $('#visual-main-div');
+  // fill mainDiv with functions and globals...
+  // renderAlgorithm()...
+  $('.add_function_button').on('click', () => {
+    addFunctionHandler();
+  });
+  $('.add_global_button').on('click', () => {
+    GlobalsManagement.addGlobal(program);
+  });
+
+  $('.run_button').on('click', () => {
+    runCode();
+  });
+
+  $('.visual_coding_button').on('click', () => {
+    toggleVisualCoding();
+  });
+
+  $('.textual_coding_button').on('click', () => {
+    toggleTextualCoding();
+  });
+}
+
+$( document ).ready(function() {
+
+  for (var i = 0; i < program.functions.length; i++) {
+    renderFunction(program.functions[i]);
+  }
+
+});
+
+function runCode () {
+  const strCode = CodeManagement.generate();
+  domConsole = new DOMConsole("#ivprog-term");
+  $("#ivprog-term").slideDown(500);
+  const lexer = LanguageService.getCurrentLexer();
+  const ast = new IVProgParser(strCode, lexer).parseTree();
+  const proc = new IVProgProcessor(ast);
+  proc.registerInput(domConsole);
+  proc.registerOutput(domConsole);
+  proc.interpretAST().then( _ => {
+    domConsole.info("Programa executado com sucesso!");
+    domConsole.info("Aperte qualquer tecla para fechar...");
+    const p = new Promise((resolve, _) => {
+      domConsole.requestInput(resolve);
+    });
+    p.then( _ => {
+      domConsole.dispose();
+      domConsole = null;
+      $("#ivprog-term").hide();
+    })
+  })
+}
+
+function toggleTextualCoding () {
+  var code = CodeManagement.generate();
+  $('.ivprog_visual_panel').css('display', 'none');
+  $('.ivprog_textual_panel').css('display', 'block');
+  $('.ivprog_textual_panel').removeClass('loading');
+  $('.ivprog_textual_code').text(code);
+}
+
+function toggleVisualCoding () {
+  $('.ivprog_textual_panel').addClass('loading');
+  $('.ivprog_textual_panel').css('display', 'none');
+  $('.ivprog_visual_panel').css('display', 'block');
+}
+
+function removeParameter (function_obj, parameter_obj, parameter_container) {
+  var index = function_obj.parameters_list.indexOf(parameter_obj);
+  if (index > -1) {
+    function_obj.parameters_list.splice(index, 1);
+  }
+  $(parameter_container).remove();
+}
+
+function updateParameterType(parameter_obj, new_type, new_dimensions = 0) {
+  parameter_obj.type = new_type;
+  parameter_obj.dimensions = new_dimensions;
+
+  if (new_dimensions > 0) {
+    parameter_obj.rows = new_dimensions;
+    parameter_obj.columns = 2;
+  }
+
+}
+
+function renderParameter (function_obj, parameter_obj, function_container) {
+  var ret = "";
+
+  ret += '<div class="ui label function_name_parameter"><span class="span_name_parameter label_enable_name_parameter">'+parameter_obj.name+'</span> <i class="icon small pencil alternate enable_edit_name_parameter label_enable_name_parameter"></i>';
+
+  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>';
+  } else {
+    ret += '<div class="text">'+LocalizedStrings.getUI(parameter_obj.type)+'</div>';
+  }
+
+  ret += '<i class="dropdown icon"></i>'
+    + '<div class="menu">';
+
+
+  for (var tm in Types) {
+      if (tm == Types.VOID.toUpperCase()) {
+        continue;
+      }
+      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  }
+
+  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" 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 += ' <i class="red icon times remove_parameter"></i></div>';
+
+  ret = $(ret);
+
+  function_container.find('.container_parameters_list').append(ret);
+
+  ret.find('.remove_parameter').on('click', function(e){
+    removeParameter(function_obj, parameter_obj, ret);
+  });
+
+  ret.find('.ui.dropdown.parameter_type').dropdown({
+    onChange: function(value, text, $selectedItem) {
+      if ($($selectedItem).data('dimensions')) {
+        updateParameterType(parameter_obj, Types[$($selectedItem).data('type')], $($selectedItem).data('dimensions'));
+      } else {
+        updateParameterType(parameter_obj, Types[$($selectedItem).data('type')]);
+      }
+    }
+  });
+
+  ret.find('.label_enable_name_parameter').on('click', function(e){
+    enableNameParameterUpdate(parameter_obj, ret);
+  });
+
+}
+
+var opened_name_parameter = false;
+var opened_input_parameter = null;
+function enableNameParameterUpdate (parameter_obj, parent_node) {
+  if (opened_name_parameter) {
+    $(opened_input_parameter).focus();
+    return;
+  }
+  opened_name_parameter = true;
+
+  $(parent_node).find('.span_name_parameter').text('');
+  $( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"+parameter_obj.name+"' />" ).insertBefore($(parent_node).find('.span_name_parameter'));
+
+  $('.width-dynamic').on('input', function() {
+    var inputWidth = $(this).textWidth()+10;
+    opened_input_parameter = this;
+    $(this).focus();
+
+    var tmpStr = $(this).val();
+    $(this).val('');
+    $(this).val(tmpStr);
+
+    $(this).css({
+        width: inputWidth
+    })
+  }).trigger('input');
+
+  $('.width-dynamic').focusout(function() {
+    /// update array:
+    if ($(this).val().trim()) {
+      parameter_obj.name = $(this).val().trim();
+      $(parent_node).find('.span_name_parameter').text(parameter_obj.name);
+    }
+    $(this).remove();
+
+    /// update elements:
+    opened_name_parameter = false;
+    opened_input_parameter = false;
+  });
+
+  $('.width-dynamic').on('keydown', function(e) {
+    var code = e.keyCode || e.which;
+    if(code == 13) {
+      if ($(this).val().trim()) {
+        parameter_obj.name = $(this).val().trim();
+        $(parent_node).find('.span_name_parameter').text(parameter_obj.name);
+      }
+      $(this).remove();
+
+      /// update elements:
+      opened_name_parameter = false;
+      opened_input_parameter = false;
+
+    }
+    if(code == 27) {
+      $(parent_node).find('.span_name_parameter').text(parameter_obj.name);
+
+      $(this).remove();
+
+      /// update elements:
+      opened_name_parameter = false;
+      opened_input_parameter = false;
+    }
+  });
+
+}
+
+var opened_name_function = false;
+var opened_input = null;
+function enableNameFunctionUpdate(function_obj, parent_node) {
+  if (opened_name_function) {
+    $(opened_input).focus();
+    return;
+  }
+
+  $(parent_node).find('.span_name_function').text('');
+  $( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"+function_obj.name+"' />" ).insertBefore($(parent_node).find('.span_name_function'));
+
+  $('.width-dynamic').on('input', function() {
+    var inputWidth = $(this).textWidth()+10;
+    opened_input = this;
+    $(this).focus();
+
+    var tmpStr = $(this).val();
+    $(this).val('');
+    $(this).val(tmpStr);
+
+    $(this).css({
+        width: inputWidth
+    })
+  }).trigger('input');
+
+  $('.width-dynamic').focusout(function() {
+    /// update array:
+    if ($(this).val().trim()) {
+      function_obj.name = $(this).val().trim();
+    }
+    $(this).remove();
+    $(parent_node).find('.span_name_function').text(function_obj.name);
+
+    /// update elements:
+    opened_name_function = false;
+    opened_input = false;
+  });
+
+  $('.width-dynamic').on('keydown', function(e) {
+    var code = e.keyCode || e.which;
+    if(code == 13) {
+      if ($(this).val().trim()) {
+        function_obj.name = $(this).val().trim();
+      }
+      $(this).remove();
+
+      $(parent_node).find('.span_name_function').text(function_obj.name);
+
+      /// update elements:
+      opened_name_function = false;
+      opened_input = false;
+    }
+    if(code == 27) {
+
+      $(this).remove();
+
+      $(parent_node).find('.span_name_function').text(function_obj.name);
+
+      /// update elements:
+      opened_name_function = false;
+      opened_input = false;
+    }
+  });
+
+}
+
+
+/****************************************************
+//DOUGLAS
+*******************************************************/
+
+removeFunction = function(function_obj) {
+  var index = program.functions.indexOf(function_obj);
+  if (index > -1) {
+    program.functions.splice(index, 1);
+  }
+
+  $('.functions_labels > [data-function=' + function_obj.name + ']').remove();
+}
+
+renderFunction = function(function_obj) {
+
+  var appender = '<div class="ui secondary segment function_div list-group-item">';
+
+  if (function_obj.function_comment) {
+    //appender += renderComment(function_obj.function_comment, sequence, true, -1);
+  }
+
+  appender += '<span class="glyphicon glyphicon-move move_function" aria-hidden="true"><i class="icon sort alternate vertical"></i></span>';
+
+  appender += (function_obj.is_main ? '<div class="div_start_minimize_v"> </div>' : '<button class="ui icon button large remove_function_button"><i class="red icon times"></i></button>')
+    + '<button class="ui icon button tiny minimize_function_button"><i class="icon window minimize"></i></button>';
+
+  appender += '<div class="ui small icon buttons add_var_top_button"><div class="ui icon button add_var_button_function"><i class="icon superscript"></i></div>';
+
+
+  appender += '<div class="ui icon button dropdown menu_commands" ><i class="icon code"></i> <div class="menu"> ';
+  appender += '<a class="item" data-command="'+Models.COMMAND_TYPES.reader+'"><i class="download icon"></i> ' +LocalizedStrings.getUI('text_read_var')+ '</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.writer+'"><i class="upload icon"></i> '+LocalizedStrings.getUI('text_write_var')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.comment+'"><i class="quote left icon"></i> '+LocalizedStrings.getUI('text_comment')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.attribution+'"><i class="arrow left icon"></i> '+LocalizedStrings.getUI('text_attribution')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.functioncall+'"><i class="hand point right icon"></i> '+LocalizedStrings.getUI('text_functioncall')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.iftrue+'" ><i class="random icon"></i> '+LocalizedStrings.getUI('text_iftrue')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.repeatNtimes+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_repeatNtimes')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.whiletrue+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_whiletrue')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.dowhiletrue+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_dowhiletrue')+'</a>'
+        + '<a class="item" data-command="'+Models.COMMAND_TYPES.switch+'"><i class="list icon"></i> '+LocalizedStrings.getUI('text_switch')+'</a>'
+        + '</div></div></div>';
+
+  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> '
+        + '( <div class="ui large labels parameters_list">';
+  } else {
+      appender += '<div class="ui function_return"></div>';
+
+      appender += '<div class="function_name_div"><span class="span_name_function name_function_updated">'+function_obj.name+'</span> <i class="icon small pencil alternate enable_edit_name_function name_function_updated"></i></div> '
+        + '( <i class="ui icon plus square outline add_parameter_button"></i> <div class="ui large labels parameters_list container_parameters_list">';
+
+			var menu_button = '<button class="fluid ui container segment labeled icon button list-group-item menu-item" draggable="true" data-function="' + function_obj.name + '"><i class="list icon"></i> ' + function_obj.name + '</button>';
+			menu_button = $(menu_button);
+      menu_button.data('fun',function_obj);
+
+			$('.functions_labels').append(menu_button);
+			console.log("aqui")
+  }
+
+  appender += '</div> ) {</div>'
+    + (function_obj.is_hidden ? ' <div class="function_area" style="display: none;"> ' : ' <div class="function_area"> ')
+
+    + '<div class="ui top attached segment variables_list_div">'
+    /*+ renderVariables(function_obj, sequence)*/
+    + '</div>'
+    + '<div class="ui bottom attached segment commands_list_div" id="function_drag_cmd_">';
+
+
+  if (function_obj.commands) {
+    for (var l = 0; l < function_obj.commands.length; l++) {
+      //appender += renderElementCommandGeneric(programa.funcoes[sequence].comandos[l], sequence, l, -1, l);
+
+    }
+  }
+
+  appender += '</div>';
+
+  appender += '<div class="function_close_div">}</div>'
+    + '</div>'
+    + '</div>';
+
+  appender = $(appender);
+
+  $('.all_functions').append(appender);
+
+  appender.data('fun', function_obj);
+  appender.find('.commands_list_div').data('fun', function_obj);
+
+  renderFunctionReturn(function_obj, appender);
+
+  addHandlers(function_obj, appender);
+
+
+  // Rendering parameters:
+  for (var j = 0; j < function_obj.parameters_list.length; j++) {
+    renderParameter(function_obj, function_obj.parameters_list[j], appender);
+  }
+
+  // Rendering variables:
+  for (var j = 0; j < function_obj.variables_list.length; j++) {
+    VariablesManagement.renderVariable(appender, function_obj.variables_list[j], function_obj);
+  }
+
+  // Rendering commands:
+  for (var j = 0; j < function_obj.commands.length; j++) {
+    CommandsManagement.renderCommand(function_obj.commands[j], $(appender.find('.commands_list_div')[0]), 3, function_obj);
+  }
+
+}
+
+initVisualUI = function() {
+  // MUST USE CONST, LET, OR VAR !!!!!!
+  const mainDiv = $('#visual-main-div');
+  // fill mainDiv with functions and globals...
+  // renderAlgorithm()...
+  $('.add_function_button').on('click', () => {
+    addFunctionHandler();
+  });
+  $('.add_global_button').on('click', () => {
+    GlobalsManagement.addGlobal(program);
+  });
+
+  $('.run_button').on('click', () => {
+    runCode();
+  });
+
+  $('.visual_coding_button').on('click', () => {
+    toggleVisualCoding();
+  });
+
+  $('.textual_coding_button').on('click', () => {
+    toggleTextualCoding();
+  });
+
+  var commands = [
+        {type: Models.COMMAND_TYPES.reader, icon: "download", text: LocalizedStrings.getUI('text_read_var')},
+        {type: Models.COMMAND_TYPES.writer, icon: "upload", text: LocalizedStrings.getUI('text_write_var')},
+        {type: Models.COMMAND_TYPES.comment, icon: "quote left", text: LocalizedStrings.getUI('text_comment')},
+        {type: Models.COMMAND_TYPES.attribution, icon: "arrow left", text: LocalizedStrings.getUI('text_attribution')},
+        {type: Models.COMMAND_TYPES.functioncall, icon: "hand point right", text: LocalizedStrings.getUI('text_functioncall')},
+        {type: Models.COMMAND_TYPES.iftrue, icon: "random", text: LocalizedStrings.getUI('text_iftrue')},
+        {type: Models.COMMAND_TYPES.repeatNtimes, icon: "sync", text: LocalizedStrings.getUI('text_repeatNtimes')},
+        {type: Models.COMMAND_TYPES.whiletrue, icon: "sync", text: LocalizedStrings.getUI('text_whiletrue')},
+        {type: Models.COMMAND_TYPES.dowhiletrue, icon: "sync", text: LocalizedStrings.getUI('text_dowhiletrue')},
+        {type: Models.COMMAND_TYPES.switch, icon: "list", text: LocalizedStrings.getUI('text_switch')}
+  ];
+
+  for (var i = 0; i < commands.length; i++) {
+    var command = '<button class="fluid ui container segment labeled icon button list-group-item menu-item" draggable="true"  data-command="' + commands[i].type + '"><i class="' + commands[i].icon + ' icon"></i> ' + commands[i].text + '</button>';
+    command = $(command);
+    command.on('click', function(evt){
+      CommandsManagement.createFloatingCommand(null, null, $(this).data('command'), evt);
+    });
+    $('.list-commands').prepend(command);
+  }
+
+}
+
+renderParameter = function(function_obj, parameter_obj, function_container) {
+  var ret = "";
+
+  ret += '<div class="ui label function_name_parameter"><span class="span_name_parameter label_enable_name_parameter">'+parameter_obj.name+'</span> <i class="icon small pencil alternate enable_edit_name_parameter label_enable_name_parameter"></i>';
+
+  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>';
+  } else {
+    ret += '<div class="text">'+LocalizedStrings.getUI(parameter_obj.type)+'</div>';
+  }
+
+  ret += '<i class="dropdown icon"></i>'
+    + '<div class="menu">';
+
+
+  for (var tm in Types) {
+      if (tm == Types.VOID.toUpperCase()) {
+        continue;
+      }
+      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  }
+
+  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" 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 += ' <i class="red icon times remove_parameter"></i></div>';
+
+  ret = $(ret);
+
+  function_container.find('.container_parameters_list').append(ret);
+
+  ret.find('.remove_parameter').on('click', function(e){
+    removeParameter(function_obj, parameter_obj, ret);
+  });
+
+  ret.find('.ui.dropdown.parameter_type').dropdown({
+    onChange: function(value, text, $selectedItem) {
+      if ($($selectedItem).data('dimensions')) {
+        updateParameterType(parameter_obj, Types[$($selectedItem).data('type')], $($selectedItem).data('dimensions'));
+      } else {
+        updateParameterType(parameter_obj, Types[$($selectedItem).data('type')]);
+      }
+    }
+  });
+
+  ret.find('.label_enable_name_parameter').on('click', function(e){
+    enableNameParameterUpdate(parameter_obj, ret);
+  });
+
+}
+
+enableNameFunctionUpdate = function(function_obj, parent_node) {
+  if (opened_name_function) {
+    $(opened_input).focus();
+    return;
+  }
+
+  $(parent_node).find('.span_name_function').text('');
+  $( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"+function_obj.name+"' />" ).insertBefore($(parent_node).find('.span_name_function'));
+
+  $('.width-dynamic').on('input', function() {
+    var inputWidth = $(this).textWidth()+10;
+    opened_input = this;
+    $(this).focus();
+
+    var tmpStr = $(this).val();
+    $(this).val('');
+    $(this).val(tmpStr);
+
+    $(this).css({
+        width: inputWidth
+    })
+  }).trigger('input');
+
+  $('.width-dynamic').focusout(function() {
+    /// update array:
+    if ($(this).val().trim()) {
+      function_obj.name = $(this).val().trim();
+    }
+    $(this).remove();
+    $(parent_node).find('.span_name_function').text(function_obj.name);
+
+    /// update elements:
+    opened_name_function = false;
+    opened_input = false;
+  });
+
+  $('.width-dynamic').on('keydown', function(e) {
+    var code = e.keyCode || e.which;
+    if(code == 13) {
+      $('.functions_labels > [data-function=' + function_obj.name + ']')
+				.attr('data-function', $(this).val().trim())
+				.html('<i class="list icon"></i> ' + $(this).val().trim());
+
+      if ($(this).val().trim()) {
+        function_obj.name = $(this).val().trim();
+      }
+      $(this).remove();
+
+      $(parent_node).find('.span_name_function').text(function_obj.name);
+
+      /// update elements:
+      opened_name_function = false;
+      opened_input = false;
+    }
+    if(code == 27) {
+
+      $(this).remove();
+
+      $(parent_node).find('.span_name_function').text(function_obj.name);
+
+      /// update elements:
+      opened_name_function = false;
+      opened_input = false;
+    }
+  });
+
+}

+ 888 - 0
js/visualUI/globals_sidebar.js

@@ -0,0 +1,888 @@
+import $ from 'jquery';
+import jQuery from 'jquery';
+import { Types } from './types';
+import * as Models from './ivprog_elements';
+import { LocalizedStrings } from './../services/localizedStringsService';
+
+
+window.jQuery = jQuery;
+
+import '../semantic/semantic.min.js';
+
+var counter_new_globals = 0;
+
+export function addGlobal (program) {
+
+	var new_global = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI('new_global') + '_' + counter_new_globals, 1);
+	counter_new_globals ++;
+
+	program.addGlobal(new_global);
+
+	renderGlobal(new_global);
+
+}
+
+function toggleConstant (global_var) {
+	global_var.is_constant = !global_var.is_constant;
+}
+
+function updateName (global_var, new_name) {
+	global_var.name = new_name;
+}
+
+function updateType (global_var, new_type, new_dimensions = 0) {
+	global_var.type = new_type;
+	global_var.dimensions = new_dimensions;
+
+	if (new_dimensions > 0) {
+		global_var.rows = new_dimensions;
+		global_var.columns = 2;
+	}
+
+	updateInitialValues(global_var);
+}
+
+function removeGlobal (global_var, global_container) {
+	var index = window.program_obj.globals.indexOf(global_var);
+	if (index > -1) {
+	  window.program_obj.globals.splice(index, 1);
+	}
+	$(global_container).remove();
+}
+
+function updateInitialValues (global_var) {
+	if (global_var.type == Types.INTEGER) {
+		if (global_var.dimensions == 0) {
+			global_var.value = 1;
+		}
+		if (global_var.dimensions == 1) {
+			global_var.value = [1, 1];
+		}
+		if (global_var.dimensions == 2) {
+			global_var.value = [[1, 1], [1, 1]];
+		}
+	}
+
+	if (global_var.type == Types.REAL) {
+		if (global_var.dimensions == 0) {
+			global_var.value = 1.0;
+		}
+		if (global_var.dimensions == 1) {
+			global_var.value = [1.0, 1.0];
+		}
+		if (global_var.dimensions == 2) {
+			global_var.value = [[1.0, 1.0], [1.0, 1.0]];
+		}
+	}
+
+	if (global_var.type == Types.TEXT) {
+		if (global_var.dimensions == 0) {
+			global_var.value = LocalizedStrings.getUI('text_start');
+		}
+		if (global_var.dimensions == 1) {
+			global_var.value = [LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')];
+		}
+		if (global_var.dimensions == 2) {
+			global_var.value = [[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')],
+									[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')]];
+		}
+	}
+
+	if (global_var.type == Types.BOOLEAN) {
+		if (global_var.dimensions == 0) {
+			global_var.value = true;
+		}
+		if (global_var.dimensions == 1) {
+			global_var.value = [true, true];
+		}
+		if (global_var.dimensions == 2) {
+			global_var.value = [[true, true], [true, true]];
+		}
+	}
+}
+
+function alternateBooleanGlobalValue (global_var, value_container) {
+	global_var.value = !global_var.value;
+	$(value_container).find('.span_value_variable').text(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(global_var.value[index]);
+}
+
+function removeGlobalColumnVector (global_var) {
+	if (global_var.columns == 0) {
+		return;
+	}
+
+	global_var.columns --;
+	global_var.value.splice(global_var.value.length - 1, 1);
+}
+
+function addGlobalColumnVector (global_var) {
+	global_var.columns ++;
+
+	if (global_var.type == Types.INTEGER) {
+		global_var.value.push(1);
+	}
+	if (global_var.type == Types.REAL) {
+		global_var.value.push(1.0);
+	}
+	if (global_var.type == Types.TEXT) {
+		global_var.value.push(LocalizedStrings.getUI('text_start'));
+	}
+	if (global_var.type == Types.BOOLEAN) {
+		global_var.value.push(true);
+	}
+}
+
+function removeColumnGlobalMatrix (global_var) {
+	if (global_var.columns == 0) {
+		return;
+	}
+
+	global_var.columns --;
+
+	for (var i = 0; i < global_var.rows; i++) {
+		global_var.value[i].splice(global_var.value[i].length - 1, 1);
+	}
+}
+
+function addColumnGlobalMatrix (global_var) {
+	global_var.columns ++;
+
+	if (global_var.type == Types.INTEGER) {
+		for (var i = 0; i < global_var.rows; i++) {
+			global_var.value[i].push(1);
+		}
+	}
+	if (global_var.type == Types.REAL) {
+		for (var i = 0; i < global_var.rows; i++) {
+			global_var.value[i].push(1.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'));
+		}
+	}
+	if (global_var.type == Types.BOOLEAN) {
+		for (var i = 0; i < global_var.rows; i++) {
+			global_var.value[i].push(true);
+		}
+	}
+}
+
+function removeLineGlobalMatrix (global_var) {
+	if (global_var.rows == 0) {
+		return;
+	}
+
+	global_var.rows --;
+	global_var.value.splice(global_var.value.length - 1, 1);
+}
+
+function addLineGlobalMatrix (global_var) {
+	global_var.rows ++;
+
+	if (global_var.type == Types.INTEGER) {
+		var n_l = [];
+		for (var i = 0; i < global_var.columns; i++) {
+			n_l.push(1);
+		}
+		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);
+		}
+		global_var.value.push(n_l);
+	}
+
+	if (global_var.type == Types.TEXT) {
+		var n_l = [];
+		for (i = 0; i < global_var.columns; i++) {
+			n_l.push(LocalizedStrings.getUI('text_start'));
+		}
+		global_var.value.push(n_l);
+	}
+
+	if (global_var.type == Types.BOOLEAN) {
+		var n_l = [];
+		for (i = 0; i < global_var.columns; i++) {
+			n_l.push(true);
+		}
+		global_var.value.push(n_l);
+	}
+}
+
+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(global_var.value[row][index]);
+}
+
+function renderValues (global_var, global_container) {
+
+	var ret = "";
+	var j = 0;
+
+	if (global_var.dimensions == 0) {
+		if (global_var.type == Types.REAL) {
+			ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+global_var.value.toFixed(1)+'</span> <i class="icon small pencil alternate enable_edit_name_function simple_var"></i></div> ';
+		} else {
+			if (global_var.type == Types.BOOLEAN) {
+				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+global_var.value+'</span> <i class="icon small pencil alternate enable_edit_name_function boolean_simple_type"></i></div> ';
+			} else {
+				ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+global_var.value+'</span> <i class="icon small pencil alternate enable_edit_name_function simple_var"></i></div> ';
+			}
+		}
+	} else {
+		ret += '<table class="tabela_var">';
+
+		if (global_var.dimensions == 1) {
+			ret += '<tr>';
+			if (global_var.type == Types.REAL) {
+				for (var k = 0; k < global_var.columns; k++) {
+					ret += '<td><span class="span_value_variable vector_var" data-index="'+k+'">'+global_var.value[k].toFixed(1)+'</span></td>';
+				}
+			} 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+'">'+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>';
+					}
+				}
+			}
+
+			ret += '</tr>';
+			ret += '</table>';
+
+			ret += '<div class="buttons_manage_columns"><i class="ui icon minus square outline remove_global_vector_column"></i>'
+		    	+ ' <i class="ui icon plus square outline add_global_vector_column"></i></div>';
+		}
+
+		if (global_var.dimensions == 2) {
+			if (global_var.type == Types.REAL) {
+				for (var l = 0; l < global_var.rows; l++) {
+    				ret += '<tr>';
+    				for (var k = 0; k < global_var.columns; k++) {
+    					ret += '<td><span class="span_value_variable matrix_var" data-index="'+k+'" data-row="'+l+'">'+global_var.value[l][k].toFixed(1)+'</span>'+'</td>';
+    				}
+    				ret += '</tr>';
+				}
+			} else {
+				for (var l = 0; l < global_var.rows; l++) {
+    				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+'">'+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>';
+    					}
+    				}
+    				ret += '</tr>';
+				}
+			}
+			if (global_var.rows == 0) {
+				ret += '<tr><td></td></tr>';
+			}
+			ret += '<tr><td colspan="'+global_var.columns+'" class="tr_manage_lines"><i class="ui icon minus square outline remove_global_matrix_line"></i>'
+		    	+ ' <i class="ui icon plus square outline add_global_matrix_line"></i></td></tr>';
+			ret += '</table>';
+
+			ret += '<div class="buttons_manage_columns"><i class="ui icon minus square outline remove_global_matrix_column"></i>'
+		    	+ ' <i class="ui icon plus square outline add_global_matrix_column"></i></div>';
+		}
+
+	}
+
+	$( global_container ).find( ".div_valor_var" ).html('');
+
+	ret = $(ret);
+
+	$(ret).find('.span_value_variable').data('associatedOject', global_var);
+
+	$( ret ).find( ".boolean_simple_type" ).on('click', function(e){
+		alternateBooleanGlobalValue(global_var, this.parentNode);
+	});
+	$( ret ).find( ".simple_var" ).on('click', function(e){
+		enableGlobalValueUpdate(global_var, this.parentNode);
+	});
+
+	$( ret ).find( ".boolean_vector_var" ).on('click', function(e){
+		alternateBooleanGlobalVectorValue(global_var, $(this).data('index'), this.parentNode);
+	});
+	$( ret ).find( ".vector_var" ).on('click', function(e){
+		enableGlobalVectorValueUpdate(global_var, $(this).data('index'), this.parentNode);
+	});
+	$( ret ).find( ".remove_global_vector_column" ).on('click', function(e){
+		removeGlobalColumnVector(global_var);
+		$( global_container ).find( ".div_valor_var" ).html('');
+		renderValues(global_var, global_container);
+	});
+	$( ret ).find( ".add_global_vector_column" ).on('click', function(e){
+		addGlobalColumnVector(global_var);
+		$( global_container ).find( ".div_valor_var" ).html('');
+		renderValues(global_var, global_container);
+	});
+	$( ret ).find( ".remove_global_matrix_column" ).on('click', function(e){
+		removeColumnGlobalMatrix(global_var);
+		$( global_container ).find( ".div_valor_var" ).html('');
+		renderValues(global_var, global_container);
+	});
+	$( ret ).find( ".add_global_matrix_column" ).on('click', function(e){
+		addColumnGlobalMatrix(global_var);
+		$( global_container ).find( ".div_valor_var" ).html('');
+		renderValues(global_var, global_container);
+	});
+	$( ret ).find( ".remove_global_matrix_line" ).on('click', function(e){
+		removeLineGlobalMatrix(global_var);
+		$( global_container ).find( ".div_valor_var" ).html('');
+		renderValues(global_var, global_container);
+	});
+	$( ret ).find( ".add_global_matrix_line" ).on('click', function(e){
+		addLineGlobalMatrix(global_var);
+		$( global_container ).find( ".div_valor_var" ).html('');
+		renderValues(global_var, global_container);
+	});
+	$( ret ).find( ".boolean_matrix_var" ).on('click', function(e){
+		alternateBooleanGlobalMatrixValue(global_var, $(this).data('row'), $(this).data('index'), this.parentNode);
+	});
+	$( ret ).find( ".matrix_var" ).on('click', function(e){
+		enableGlobalMatrixValueUpdate(global_var, $(this).data('row'), $(this).data('index'), this.parentNode);
+	});
+	$( global_container ).find( ".div_valor_var" ).append(ret);
+
+}
+
+function addHandlers (global_container) {
+	var global_var = $(global_container).data('associatedOject');
+	// Manage constant option:
+	$( global_container ).find( ".alternate_constant" ).on('click', function(e){
+		toggleConstant(global_var);
+
+		$( this ).removeClass( "on off" );
+		if (global_var.is_constant) {
+			$( this ).addClass( "on" );
+		} else {
+			$( this ).addClass( "off" );
+		}
+	});
+
+	// Manage global name:
+	$( global_container ).find( ".enable_edit_name_parameter" ).on('click', function(e){
+		enableNameUpdate(global_container);
+	});
+
+	// Menu to change type:
+	$( global_container ).find('.ui.dropdown.global_type').dropdown({
+	    onChange: function(value, text, $selectedItem) {
+	    	if ($($selectedItem).data('dimensions')) {
+	    		updateType(global_var, Types[$($selectedItem).data('type')], $($selectedItem).data('dimensions'));
+	    	} else {
+	    		updateType(global_var, Types[$($selectedItem).data('type')]);
+	    	}
+
+	    	renderValues(global_var, global_container);
+	    }
+	});
+
+	// Remove global:
+	$( global_container ).find( ".remove_global" ).on('click', function(e){
+		removeGlobal(global_var, global_container);
+	});
+
+}
+
+function renderGlobal (global_var) {
+
+	var element = '<div class="ui label global_container"><div class="global_const">const: ';
+
+	element += '<i class="ui icon toggle '+(global_var.is_constant?"on":"off")+' alternate_constant"></i></div><span class="span_name_variable enable_edit_name_parameter">'+global_var.name+'</span> <i class="icon small pencil alternate enable_edit_name_parameter"></i>';
+
+ 	element += '<div class="ui dropdown global_type">';
+
+  	if (global_var.dimensions > 0) {
+  		element += '<div class="text">'+ i18n('ui:vector') + ':' + LocalizedStrings.getUI(global_var.type);
+  		for (var i = 0; i < global_var.dimensions; i ++) {
+  			element += ' [ ] ';
+  		}
+  		element += '</div>';
+  	} else {
+  		element += '<div class="text">' + LocalizedStrings.getUI(global_var.type.toLowerCase()) + '</div>';
+  	}
+	element += '<i class="dropdown icon"></i><div class="menu">';
+
+	for (var tm in Types) {
+  		if (tm == Types.VOID.toUpperCase()) {
+  			continue;
+  		}
+  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+	}
+
+  	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></div>  = ';
+
+	element += '<div class="ui div_valor_var">'+global_var.value+'</div>';
+
+	element += ' <i class="red icon times remove_global"></i></div>';
+
+	var complete_element = $(element);
+
+	$(complete_element).data('associatedOject', global_var);
+
+	$('.list_globals').append(complete_element);
+
+	addHandlers(complete_element);
+
+	renderValues(global_var, complete_element);
+}
+
+var opened_name_value_matrix_global_v = false;
+var opened_input_value_matrix_global_v = null;
+function enableGlobalMatrixValueUpdate (global_var, row, index, parent_node) {
+	if (opened_name_value_matrix_global_v) {
+		$(opened_input_value_matrix_global_v).focus();
+		return;
+	}
+	opened_name_value_matrix_global_v = true;
+
+	$(parent_node).find('.span_value_variable').text('');
+
+	if (global_var.type == Types.REAL) {
+		$( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"
+			+ global_var.value[row][index].toFixed(1) + "' />" ).insertBefore($(parent_node).find('.span_value_variable'));
+	} else {
+		$( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"
+			+ global_var.value[row][index] + "' />" ).insertBefore($(parent_node).find('.span_value_variable'));
+	}
+
+	$('.width-dynamic').on('input', function() {
+	    var inputWidth = $(this).textWidth()+10;
+	    opened_input_value_matrix_global_v = this;
+	    $(this).focus();
+
+	    var tmpStr = $(this).val();
+		$(this).val('');
+		$(this).val(tmpStr);
+
+	    $(this).css({
+	        width: inputWidth
+	    })
+	}).trigger('input');
+
+	$('.width-dynamic').focusout(function() {
+		/// update array:
+		if ($(this).val().trim()) {
+			if (global_var.type == Types.REAL) {
+				global_var.value[row][index] = parseFloat($(this).val().trim());
+
+				$(parent_node).find('.span_value_variable').text(global_var.value[row][index].toFixed(1));
+			} else {
+				if (global_var.type == Types.INTEGER) {
+					global_var.value[row][index] = parseInt($(this).val().trim());
+				} else {
+					global_var.value[row][index] = $(this).val().trim();
+				}
+				$(parent_node).find('.span_value_variable').text(global_var.value[row][index]);
+			}
+		}
+		$(this).remove();
+
+		/// update elements:
+		opened_name_value_matrix_global_v = false;
+		opened_input_value_matrix_global_v = false;
+	});
+
+	$('.width-dynamic').on('keydown', function(e) {
+		var code = e.keyCode || e.which;
+		if(code == 13) {
+			if ($(this).val().trim()) {
+				if (global_var.type == Types.REAL) {
+					global_var.value[row][index] = parseFloat($(this).val().trim());
+
+					$(parent_node).find('.span_value_variable').text(global_var.value[row][index].toFixed(1));
+				} else {
+					if (global_var.type == Types.INTEGER) {
+						global_var.value[row][index] = parseInt($(this).val().trim());
+					} else {
+						global_var.value[row][index] = $(this).val().trim();
+					}
+					$(parent_node).find('.span_value_variable').text(global_var.value[row][index]);
+				}
+			}
+			$(this).remove();
+
+			/// update elements:
+			opened_name_value_matrix_global_v = false;
+			opened_input_value_matrix_global_v = false;
+		}
+		if(code == 27) {
+			if (global_var.type == Types.REAL) {
+				$(parent_node).find('.span_value_variable').text(global_var.value[row][index].toFixed(1));
+			} else {
+				$(parent_node).find('.span_value_variable').text(global_var.value[row][index]);
+			}
+
+			$(this).remove();
+
+			/// update elements:
+			opened_name_value_matrix_global_v = false;
+			opened_input_value_matrix_global_v = false;
+		}
+	});
+}
+
+var opened_name_value_global_var = false;
+var opened_input_value_global_ar = null;
+function enableGlobalValueUpdate (global_var, parent_node) {
+	if (opened_name_value_global_var) {
+		$(opened_input_value_global_ar).focus();
+		return;
+	}
+	opened_name_value_global_var = true;
+
+	$(parent_node).find('.span_value_variable').text('');
+	if (global_var.type == Types.REAL) {
+		$( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"
+			+ global_var.value.toFixed(1) + "' />" ).insertBefore($(parent_node).find('.span_value_variable'));
+	} else {
+		$( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"
+			+ global_var.value + "' />" ).insertBefore($(parent_node).find('.span_value_variable'));
+	}
+
+	$('.width-dynamic').on('input', function() {
+	    var inputWidth = $(this).textWidth()+10;
+	    opened_input_value_global_ar = this;
+	    $(this).focus();
+
+	    var tmpStr = $(this).val();
+		$(this).val('');
+		$(this).val(tmpStr);
+
+	    $(this).css({
+	        width: inputWidth
+	    })
+	}).trigger('input');
+
+	$('.width-dynamic').focusout(function() {
+		/// update array:
+		if ($(this).val().trim()) {
+			if (global_var.type == Types.REAL) {
+				global_var.value = parseFloat($(this).val().trim());
+				$(parent_node).find('.span_value_variable').text(global_var.value.toFixed(1));
+			} else{
+				if (global_var.type == Types.INTEGER) {
+					global_var.value = parseInt($(this).val().trim());
+				} else {
+					global_var.value = $(this).val().trim();
+				}
+				$(parent_node).find('.span_value_variable').text(global_var.value);
+
+			}
+		}
+		$(this).remove();
+
+		/// update elements:
+		opened_name_value_global_var = false;
+		opened_input_value_global_ar = false;
+
+	});
+
+	$('.width-dynamic').on('keydown', function(e) {
+		var code = e.keyCode || e.which;
+		if(code == 13) {
+			if ($(this).val().trim()) {
+				if (global_var.type == Types.REAL) {
+					global_var.value = parseFloat($(this).val().trim());
+					$(parent_node).find('.span_value_variable').text(global_var.value.toFixed(1));
+				} else{
+					if (global_var.type == Types.INTEGER) {
+						global_var.value = parseInt($(this).val().trim());
+					} else {
+						global_var.value = $(this).val().trim();
+					}
+					$(parent_node).find('.span_value_variable').text(global_var.value);
+				}
+			}
+			$(this).remove();
+
+			/// update elements:
+			opened_name_value_global_var = false;
+			opened_input_value_global_ar = false;
+
+		}
+		if(code == 27) {
+			if (global_var.type == Types.REAL) {
+				$(parent_node).find('.span_value_variable').text(global_var.value.toFixed(1));
+			} else{
+				$(parent_node).find('.span_value_variable').text(global_var.value);
+			}
+
+			$(this).remove();
+
+			/// update elements:
+			opened_name_value_global_var = false;
+			opened_input_value_global_ar = false;
+		}
+	});
+}
+
+
+var opened_name_global = false;
+var opened_input_global = null;
+function enableNameUpdate (global_container) {
+
+	var global_var = $(global_container).data('associatedOject');
+
+	if (opened_name_global) {
+		$(opened_input_global).focus();
+		return;
+	}
+	opened_name_global = true;
+
+	$( global_container ).find('.span_name_variable').text('');
+	$( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"+global_var.name+"' />" ).insertBefore($(global_container).find('.span_name_variable'));
+
+	$('.width-dynamic').on('input', function() {
+	    var inputWidth = $(this).textWidth()+10;
+	    opened_input_global = this;
+	    $(this).focus();
+
+	    var tmpStr = $(this).val();
+		$(this).val('');
+		$(this).val(tmpStr);
+
+	    $(this).css({
+	        width: inputWidth
+	    })
+	}).trigger('input');
+
+	$('.width-dynamic').focusout(function() {
+		/// update array:
+		if ($(this).val().trim()) {
+			updateName(global_var, $(this).val().trim());
+			$(global_container).find('.span_name_variable').text(global_var.name);
+		}
+		$(this).remove();
+
+		/// update elements:
+		opened_name_global = false;
+		opened_input_global = false;
+	});
+
+	$('.width-dynamic').on('keydown', function(e) {
+		var code = e.keyCode || e.which;
+		if(code == 13) {
+			if ($(this).val().trim()) {
+				updateName(global_var, $(this).val().trim());
+				$(global_container).find('.span_name_variable').text(global_var.name);
+			}
+			$(this).remove();
+
+			/// update elements:
+			opened_name_global = false;
+			opened_input_global = false;
+		}
+		if(code == 27) {
+
+			$(global_container).find('.span_name_variable').text(global_var.name);
+
+			$(this).remove();
+
+			/// update elements:
+			opened_name_global = false;
+			opened_input_global = false;
+		}
+	});
+
+}
+
+
+var opened_name_value_vector_global_ = false;
+var opened_input_value_vector_global_ = null;
+function enableGlobalVectorValueUpdate (global_var, index, parent_node) {
+	if (opened_name_value_vector_global_) {
+		$(opened_input_value_vector_global_).focus();
+		return;
+	}
+	opened_name_value_vector_global_ = true;
+
+	$(parent_node).find('.span_value_variable').text('');
+
+	if (global_var.type == Types.REAL) {
+		$( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"
+			+ global_var.value[index].toFixed(1) + "' />" ).insertBefore($(parent_node).find('.span_value_variable'));
+	} else {
+		$( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"
+			+ global_var.value[index] + "' />" ).insertBefore($(parent_node).find('.span_value_variable'));
+	}
+
+	$('.width-dynamic').on('input', function() {
+	    var inputWidth = $(this).textWidth()+10;
+	    opened_input_value_vector_global_ = this;
+	    $(this).focus();
+
+	    var tmpStr = $(this).val();
+		$(this).val('');
+		$(this).val(tmpStr);
+
+	    $(this).css({
+	        width: inputWidth
+	    })
+	}).trigger('input');
+
+	$('.width-dynamic').focusout(function() {
+		/// update array:
+		if ($(this).val().trim()) {
+			if (global_var.type == Types.REAL) {
+				global_var.value[index] = parseFloat($(this).val().trim());
+
+				$(parent_node).find('.span_value_variable').text(global_var.value[index].toFixed(1));
+			} else {
+
+				if (global_var.type == Types.INTEGER) {
+					global_var.value[index] = parseInt($(this).val().trim());
+				} else {
+					global_var.value[index] = $(this).val().trim();
+				}
+
+				$(parent_node).find('.span_value_variable').text(global_var.value[index]);
+
+			}
+		}
+		$(this).remove();
+
+		/// update elements:
+		opened_name_value_vector_global_ = false;
+		opened_input_value_vector_global_ = false;
+	});
+
+	$('.width-dynamic').on('keydown', function(e) {
+		var code = e.keyCode || e.which;
+		if(code == 13) {
+			if ($(this).val().trim()) {
+				if (global_var.type == Types.REAL) {
+					global_var.value[index] = parseFloat($(this).val().trim());
+
+					$(parent_node).find('.span_value_variable').text(global_var.value[index].toFixed(1));
+				} else {
+
+					if (global_var.type == Types.INTEGER) {
+						global_var.value[index] = parseInt($(this).val().trim());
+					} else {
+						global_var.value[index] = $(this).val().trim();
+					}
+
+					$(parent_node).find('.span_value_variable').text(global_var.value[index]);
+
+				}
+			}
+			$(this).remove();
+
+			/// update elements:
+			opened_name_value_vector_global_ = false;
+			opened_input_value_vector_global_ = false;
+		}
+		if(code == 27) {
+			if (global_var.type == Types.REAL) {
+				$(parent_node).find('.span_value_variable').text(global_var.value[index].toFixed(1));
+			} else {
+				$(parent_node).find('.span_value_variable').text(global_var.value[index]);
+			}
+
+			$(this).remove();
+
+			/// update elements:
+			opened_name_value_vector_global_ = false;
+			opened_input_value_vector_global_ = false;
+		}
+	});
+}
+
+
+$.fn.textWidth = function(text, font) {
+
+    if (!$.fn.textWidth.fakeEl) $.fn.textWidth.fakeEl = $('<span>').hide().appendTo(document.body);
+
+    $.fn.textWidth.fakeEl.text(text || this.val() || this.text() || this.attr('placeholder')).css('font', font || this.css('font'));
+
+    return $.fn.textWidth.fakeEl.width();
+};
+
+/*************************************************
+  DOUGLAS
+**************************************************/
+
+renderGlobal = function (global_var) {
+
+	var element = '<div class="ui container segment global_container"><div class="global_const">const: ';
+
+	element += '<i class="ui icon toggle '+(global_var.is_constant?"on":"off")+' alternate_constant"></i></div><span class="span_name_variable enable_edit_name_parameter">'+global_var.name+'</span> <i class="icon small pencil alternate enable_edit_name_parameter"></i>';
+
+ 	element += '<div class="ui dropdown global_type">';
+
+  	if (global_var.dimensions > 0) {
+  		element += '<div class="text">'+ i18n('ui:vector') + ':' + LocalizedStrings.getUI(global_var.type);
+  		for (var i = 0; i < global_var.dimensions; i ++) {
+  			element += ' [ ] ';
+  		}
+  		element += '</div>';
+  	} else {
+  		element += '<div class="text">' + LocalizedStrings.getUI(global_var.type.toLowerCase()) + '</div>';
+  	}
+	element += '<i class="dropdown icon"></i><div class="menu">';
+
+	for (var tm in Types) {
+  		if (tm == Types.VOID.toUpperCase()) {
+  			continue;
+  		}
+  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+	}
+
+  	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></div>  = ';
+
+	element += '<div class="ui div_valor_var">'+global_var.value+'</div>';
+
+	element += ' <i class="red icon times remove_global"></i></div>';
+
+	var complete_element = $(element);
+
+	$(complete_element).data('associatedOject', global_var);
+
+	$('.list_globals').append(complete_element);
+
+	addHandlers(complete_element);
+
+	renderValues(global_var, complete_element);
+}

File diff suppressed because it is too large
+ 296 - 457
package-lock.json


+ 2 - 2
package.json

@@ -39,8 +39,8 @@
     "karma-mocha-reporter": "^2.2.5",
     "karma-webpack": "^3.0.0",
     "puppeteer-core": "^1.7.0",
-    "webpack": "^4.16.5",
-    "webpack-cli": "^3.1.0"
+    "webpack": "^4.20.2",
+    "webpack-cli": "^3.1.1"
   },
   "dependencies": {
     "antlr4": "^4.7.1",

+ 3 - 2
webpack.config.js

@@ -1,7 +1,8 @@
 var path = require('path');
 var webpack = require('webpack');
 module.exports = {
-    entry: './js/main.js',
+    //entry: './js/main.js',
+    entry: './js/main-sidebar.js',
     mode: 'development',
     watch: true,
     output: {
@@ -28,4 +29,4 @@ module.exports = {
         colors: true
     },
     devtool: 'source-map'
-};
+};

+ 131 - 0
~index.html

@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title></title>
+    <link rel="stylesheet" type="text/css" href="js/semantic/semantic.min.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">
+    <script src="js/jquery-3.3.1.min.js"></script>
+
+    <script src="build/ivprog.bundle.js"></script>
+
+    <script src="js/iassign-integration-functions.js"></script>
+    <script src="i18n/i18n-engine.js"></script>
+
+    <script src="js/jquery-ui.js"></script>
+    <script src="js/Sortable.js"></script>
+    
+  </head>
+  <body>
+   
+    <div class="ui one column doubling stackable grid container">
+      <div class="column">
+        <div class="ui container main_title">
+          <h2>iVProg</h2>
+          <span>interactive coding</span>
+        </div>
+
+        
+
+        <div class="ui container content_margin">
+          <div class="content_sub_margin">
+              <div class="blue ui ivprog_format buttons">
+                <button class="ui button active visual_coding_button">Visual</button>
+                <button class="ui button textual_coding_button">Textual</button>
+              </div>
+
+              <a class="ivprog_format_info">
+                <i class="circular inverted some-wrapping-div teal info icon small label ivprog_format_info popup"></i>
+              </a>
+              <div class="ui custom popup">
+                Choice how you prefer to develop. If disabled, teacher doesn't allow this change. <a href="#">See documentation about it.</a>
+              </div>
+            </div>
+          </div>
+
+
+      </div>
+      
+    </div>
+
+    
+
+    
+
+    <div class="ui raised container segment div_to_body">
+
+      <div class="ui icon menu center aligned container" style="width: 438px; margin-top: -10px;">
+        <a class="item">
+          <i class="file icon"></i>
+        </a>
+        <a class="item">
+          <i class="save icon"></i>
+        </a>
+        <a class="item">
+          <i class="upload icon"></i>
+        </a>
+        <a class="item">
+          <i class="download icon"></i>
+        </a>
+        <a class="item undo_button disabled">
+          <i class="undo icon"></i>
+        </a>
+        <a class="item">
+          <i class="redo icon"></i>
+        </a>
+        <a class="item run_button">
+          <i class="play icon"></i>
+        </a>
+        <a class="item">
+          <i class="stop icon"></i>
+        </a>
+        <a class="item">
+          <i class="help icon"></i>
+        </a>
+      </div>
+
+      <div class="ui one column container segment ivprog_visual_panel loading">
+        <div class="program_signature"><data class="i18n" value="ui:program">program</data> { </div>
+
+        <div class="global_var">
+          
+          <div class="ui icon button add-globalVar-button add_global_button"><i class="icon superscript"></i></div>
+
+          <div class="list_globals"></div>
+
+        </div>
+
+        <div class="all_functions list-group" id="listWithHandle">
+
+        </div>
+
+
+        <div class="ui teal small labeled icon button add_function_button">
+          <data class="i18n" value="ui:btn_function">Function</data>
+          <i class="add icon"></i>
+        </div>
+        <div class="program_final">}</div>
+
+      </div>
+
+
+      <div class="ui one column container segment ivprog_textual_panel loading" style="display: none;">
+        <textarea class="ivprog_textual_code" disabled></textarea>
+      </div>
+      <div id='ivprog-term' class="six column wide" style="display: none">
+      </div>
+      
+    </div>
+
+    <script>
+      $(document).ready(() => {
+        ivprogCore.initVisualUI();
+      });
+    </script>
+
+
+    <script src="js/semantic/semantic.min.js"></script>
+    <script src="js/semantic/semantic-buttons.js"></script>
+
+  </body>
+</html>