Browse Source

Continuando os comandos

igorfelix01 5 years ago
parent
commit
ac79c12c49

+ 7 - 0
css/ivprog-visual-1.0.css

@@ -17,6 +17,13 @@ body {
 
 }
 
+.ivprog_textual_code {
+	width: 100%;
+	min-height: 500px;
+	resize: none;
+	background-color: white;
+}
+
 .main_title h2 {
 	margin: 0;
 }

+ 8 - 4
index.html

@@ -29,9 +29,8 @@
         <div class="ui container content_margin">
           <div class="content_sub_margin">
               <div class="blue ui ivprog_format buttons">
-                <button class="ui button active">Visual</button>
-                <button class="ui button">Textual</button>
-                <button class="ui button">XML</button>
+                <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">
@@ -73,7 +72,7 @@
         <a class="item">
           <i class="redo icon"></i>
         </a>
-        <a class="item">
+        <a class="item run_button">
           <i class="play icon"></i>
         </a>
         <a class="item">
@@ -107,6 +106,11 @@
         <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>
 

+ 463 - 0
js/visualUI/code_generator.js

@@ -0,0 +1,463 @@
+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 CommandsManagement from './commands';
+
+export function generate () {
+
+	var code = 'programa \n{ ';
+
+	code += globalsCode();
+
+	code += '\n';
+
+	for (var i = 0; i < window.program_obj.functions.length; i ++) {
+		code += functionsCode(window.program_obj.functions[i]);
+		code += '\n';
+
+	}
+
+	code += '\n}';
+
+	return code;
+
+}
+
+function functionsCode (function_obj) {
+	var ret = '\n\tfuncao ';
+
+	switch (function_obj.return_type) {
+		case Types.INTEGER:
+			ret += 'inteiro ';
+			break;
+		case Types.REAL:
+			ret += 'real ';
+			break;
+		case Types.TEXT:
+			ret += 'texto ';
+			break;
+		case Types.BOOLEAN:
+			ret += 'booleano ';
+			break;
+		case Types.VOID:
+			ret += 'vazio ';
+			break;
+	}
+
+	if (function_obj.return_dimensions == 1) {
+		ret += '[] '
+	} else if (function_obj.return_dimensions == 2) {
+		ret += '[][] '
+	}
+
+	ret += function_obj.name + ' ( ';
+
+	for (var j = 0; j < function_obj.parameters_list.length; j++) {
+		ret += parametersCode(function_obj.parameters_list[j]);
+		if ((j + 1) < function_obj.parameters_list.length) {
+			ret += ',';
+		}
+	}
+
+	ret += ' ) ';
+	ret += '\n\t{';
+
+	for (var j = 0; j < function_obj.variables_list.length; j++) {
+		ret += variablesCode(function_obj.variables_list[j]);
+	}
+
+	for (var j = 0; j < function_obj.commands.length; j++) {
+		ret += commandsCode(function_obj.commands[j]);
+	}
+
+	ret += '\n\t}';
+
+
+	return ret;
+}
+
+function commandsCode (command_obj) {
+	switch (command_obj.type) {
+		case Models.COMMAND_TYPES.comment:
+			return commentsCode(command_obj);
+
+		case Models.COMMAND_TYPES.reader:
+			return readersCode(command_obj);
+
+		case Models.COMMAND_TYPES.writer:
+			return writersCode(command_obj);
+	}
+}
+
+function readersCode (command_obj) {
+	var ret = '\n\t\tleia ( ';
+	
+	ret += command_obj.variable_value_menu.content.name;
+
+	if (command_obj.variable_value_menu.content.dimensions == 1) {
+		ret += ' [ ' + command_obj.column + ' ] ';
+	} else if (command_obj.variable_value_menu.content.dimensions == 2) {
+		ret += ' [ ' + command_obj.row + ' ] [ ' + command_obj.column + ' ]';
+	}
+
+	ret += ' ) ';
+	return ret;
+}
+
+function writersCode (command_obj) {
+	var ret = '\n\t\tescreva ( ';
+	
+	ret += command_obj.content[0].content.name;
+
+	if (command_obj.content[0].content.dimensions == 1) {
+		ret += ' [ ' + command_obj.content[0].column + ' ] ';
+	} else if (command_obj.content[0].dimensions == 2) {
+		ret += ' [ ' + command_obj.content[0].row + ' ] [ ' + command_obj.content[0].column + ' ]';
+	}
+
+	ret += ' ) ';
+	return ret;
+}
+
+function commentsCode (command_obj) {
+	var ret = '\n\t\t// ';
+	ret += command_obj.comment_text.content;
+	return ret;
+}
+
+function parametersCode (parameter_obj) {
+	var ret = '';
+	switch (parameter_obj.type) {
+		case Types.INTEGER:
+			ret += ' inteiro ';
+			break;
+		case Types.REAL:
+			ret += ' real ';
+			break;
+		case Types.TEXT:
+			ret += ' texto ';
+			break;
+		case Types.BOOLEAN:
+			ret += ' booleano ';
+			break;
+	}
+	ret += parameter_obj.name + '';
+
+	if (parameter_obj.dimensions == 1) {
+		ret += ' []'
+	} else if (parameter_obj.dimensions == 2) {
+		ret += ' [][]'
+	}
+	return ret;
+}
+
+function variablesCode (variable_obj) {
+	var ret = '';
+
+	var temp = variable_obj;
+
+	ret += '\n\t\t';
+
+	if (temp.is_constant) {
+		ret += 'const ';
+	}
+	switch (temp.type) {
+		case Types.INTEGER:
+			ret += 'inteiro ';
+			break;
+		case Types.REAL:
+			ret += 'real ';
+			break;
+		case Types.TEXT:
+			ret += 'texto ';
+			break;
+		case Types.BOOLEAN:
+			ret += 'booleano ';
+			break;
+	}
+	ret += temp.name + ' ';
+
+	if (temp.dimensions == 1) {
+		ret += '[' + temp.columns + '] ';
+
+		switch (temp.type) {
+			case Types.INTEGER:
+			case Types.REAL:
+				ret += '= {' + temp.value + '}';
+				break;
+			case Types.TEXT:
+				ret += '= {';
+				for (var j = 0; j < temp.value.length; j++) {
+					ret += '"'+temp.value[j]+'"';
+					if ((j + 1) < temp.value.length) {
+						ret += ',';
+					}
+				}
+				ret += '}';
+				break;
+			case Types.BOOLEAN:
+				ret += '= {';
+				for (var j = 0; j < temp.value.length; j++) {
+					if (temp.value[j]) {
+						ret += "verdadeiro";
+					} else {
+						ret += "falso";
+					}
+					if ((j + 1) < temp.value.length) {
+						ret += ',';
+					}
+				}
+				ret += '}';
+				break;
+		}
+
+	} else if (temp.dimensions == 2) {
+		ret += '[' + temp.rows + '][' + temp.columns + '] ';
+
+		switch (temp.type) {
+			case Types.INTEGER:
+			case Types.REAL:
+				ret += '= {';
+
+				for (var j = 0; j < temp.rows; j++) {
+					ret += '{' + temp.value[j] + '}';
+
+					if ((j + 1) < temp.rows) {
+						ret += ',';
+					}
+				}
+
+				ret += '}';
+				break;
+			case Types.TEXT:
+				ret += '= {';
+
+				for (var j = 0; j < temp.rows; j++) {
+					ret += '{';
+
+					for (var k = 0; k < temp.columns; k++) {
+						ret += '"' + temp.value[j][k] + '"';
+
+						if ((k + 1) < temp.columns) {
+							ret += ',';
+						}
+					}
+
+					ret += '}';
+					if ((j + 1) < temp.rows) {
+						ret += ',';
+					}
+				}
+				ret += '}';
+				break;
+			case Types.BOOLEAN:
+				ret += '= {';
+				for (var j = 0; j < temp.rows; j++) {
+					ret += '{';
+
+					for (var k = 0; k < temp.columns; k++) {
+						
+						if (temp.value[j][k]) {
+							ret += "verdadeiro";
+						} else {
+							ret += "falso";
+						}
+
+						if ((k + 1) < temp.columns) {
+							ret += ',';
+						}
+					}
+
+					ret += '}';
+					if ((j + 1) < temp.rows) {
+						ret += ',';
+					}
+				}
+				ret += '}';
+				break;
+		}
+	} else {
+
+		switch (temp.type) {
+			case Types.INTEGER:
+			case Types.REAL:
+				ret += '= ' + temp.value;
+				break;
+			case Types.TEXT:
+				ret += '= "' + temp.value + '"';
+				break;
+			case Types.BOOLEAN:
+				ret += '= ';
+				if (temp.value) {
+					ret += "verdadeiro";
+				} else {
+					ret += "falso";
+				}
+				break;
+		}
+
+	}
+
+	return ret;
+
+}
+
+function globalsCode () {
+	var ret = '';
+
+	if (window.program_obj.globals) {
+		for (var i = 0; i < window.program_obj.globals.length; i++) {
+			var temp = window.program_obj.globals[i];
+
+			ret += '\n\t';
+
+			if (temp.is_constant) {
+				ret += 'const ';
+			}
+			switch (temp.type) {
+				case Types.INTEGER:
+					ret += 'inteiro ';
+					break;
+				case Types.REAL:
+					ret += 'real ';
+					break;
+				case Types.TEXT:
+					ret += 'texto ';
+					break;
+				case Types.BOOLEAN:
+					ret += 'booleano ';
+					break;
+			}
+			ret += temp.name + ' ';
+
+			if (temp.dimensions == 1) {
+				ret += '[' + temp.columns + '] ';
+
+				switch (temp.type) {
+					case Types.INTEGER:
+					case Types.REAL:
+						ret += '= {' + temp.value + '}';
+						break;
+					case Types.TEXT:
+						ret += '= {';
+						for (var j = 0; j < temp.value.length; j++) {
+							ret += '"'+temp.value[j]+'"';
+							if ((j + 1) < temp.value.length) {
+								ret += ',';
+							}
+						}
+						ret += '}';
+						break;
+					case Types.BOOLEAN:
+						ret += '= {';
+						for (var j = 0; j < temp.value.length; j++) {
+							if (temp.value[j]) {
+								ret += "verdadeiro";
+							} else {
+								ret += "falso";
+							}
+							if ((j + 1) < temp.value.length) {
+								ret += ',';
+							}
+						}
+						ret += '}';
+						break;
+				}
+
+			} else if (temp.dimensions == 2) {
+				ret += '[' + temp.rows + '][' + temp.columns + '] ';
+
+				switch (temp.type) {
+					case Types.INTEGER:
+					case Types.REAL:
+						ret += '= {';
+
+						for (var j = 0; j < temp.rows; j++) {
+							ret += '{' + temp.value[j] + '}';
+
+							if ((j + 1) < temp.rows) {
+								ret += ',';
+							}
+						}
+
+						ret += '}';
+						break;
+					case Types.TEXT:
+						ret += '= {';
+
+						for (var j = 0; j < temp.rows; j++) {
+							ret += '{';
+
+							for (var k = 0; k < temp.columns; k++) {
+								ret += '"' + temp.value[j][k] + '"';
+
+								if ((k + 1) < temp.columns) {
+									ret += ',';
+								}
+							}
+
+							ret += '}';
+							if ((j + 1) < temp.rows) {
+								ret += ',';
+							}
+						}
+						ret += '}';
+						break;
+					case Types.BOOLEAN:
+						ret += '= {';
+						for (var j = 0; j < temp.rows; j++) {
+							ret += '{';
+
+							for (var k = 0; k < temp.columns; k++) {
+								
+								if (temp.value[j][k]) {
+									ret += "verdadeiro";
+								} else {
+									ret += "falso";
+								}
+
+								if ((k + 1) < temp.columns) {
+									ret += ',';
+								}
+							}
+
+							ret += '}';
+							if ((j + 1) < temp.rows) {
+								ret += ',';
+							}
+						}
+						ret += '}';
+						break;
+				}
+			} else {
+
+				switch (temp.type) {
+					case Types.INTEGER:
+					case Types.REAL:
+						ret += '= ' + temp.value;
+						break;
+					case Types.TEXT:
+						ret += '= "' + temp.value + '"';
+						break;
+					case Types.BOOLEAN:
+						ret += '= ';
+						if (temp.value) {
+							ret += "verdadeiro";
+						} else {
+							ret += "falso";
+						}
+						break;
+				}
+
+			}
+
+			
+
+		}
+	}
+
+	return ret;
+}

+ 1 - 1
js/visualUI/commands.js

@@ -150,7 +150,7 @@ function genericCreateCommand (command_type) {
 			return new Models.Reader(null, null, null, 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));
+			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), 

+ 4 - 1
js/visualUI/commands/writer.js

@@ -18,7 +18,7 @@ export function renderCommand (command, function_obj) {
 	var el = $(ret);
 	$(el).data('command', command);
 
-	VariableValueMenu.renderMenu(command, command.content, $(el).find('.var_value_menu_div'), function_obj);
+	VariableValueMenu.renderMenu(command, command.content[0], $(el).find('.var_value_menu_div'), function_obj);
 
 	return el;
 }
@@ -33,7 +33,10 @@ export function addContent (command, ref_object, dom_object, menu_var_or_value,
 			var new_div_item = $( '<div class="var_value_menu_div"></div>' );
 			$(new_div_item).insertAfter(icon_add_item);
 			var new_related_menu = new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true);
+
 			VariableValueMenu.renderMenu(command, new_related_menu, new_div_item, function_obj);
+
+			command.content.push(new_related_menu);
 		});
 	}
 	

+ 27 - 0
js/visualUI/functions.js

@@ -5,6 +5,7 @@ import { LocalizedStrings } from './../services/localizedStringsService';
 import * as GlobalsManagement from './globals';
 import * as VariablesManagement from './variables';
 import * as CommandsManagement from './commands';
+import * as CodeManagement from './code_generator';
 
 var counter_new_functions = 0;
 var counter_new_parameters = 0;
@@ -229,6 +230,32 @@ export function initVisualUI () {
   });
 
   renderFunction(mainFunction);
+
+  $('.run_button').on('click', () => {
+    CodeManagement.generate();
+  });
+
+  $('.visual_coding_button').on('click', () => {
+    toggleVisualCoding();
+  });
+
+  $('.textual_coding_button').on('click', () => {
+    toggleTextualCoding();
+  });
+}
+
+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) {