functions.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. import $ from 'jquery';
  2. import { Types } from './types';
  3. import * as Models from './ivprog_elements';
  4. import { LocalizedStrings } from './../services/localizedStringsService';
  5. import * as GlobalsManagement from './globals';
  6. import * as VariablesManagement from './variables';
  7. import * as CommandsManagement from './commands';
  8. import * as CodeManagement from './code_generator';
  9. import * as VariableValueMenu from './commands/variable_value_menu';
  10. import { DOMConsole } from './../io/domConsole';
  11. import { IVProgParser } from './../ast/ivprogParser';
  12. import { IVProgProcessor } from './../processor/ivprogProcessor';
  13. import WatchJS from 'melanke-watchjs';
  14. import { SemanticAnalyser } from '../processor/semantic/semanticAnalyser';
  15. import { IVProgAssessment } from '../assessment/ivprogAssessment';
  16. import * as AlgorithmManagement from './algorithm';
  17. import '../Sortable.js';
  18. var counter_new_functions = 0;
  19. var counter_new_parameters = 0;
  20. let studentTemp = null;
  21. let domConsole = null;
  22. window.studentGrade = null;
  23. const program = new Models.Program();
  24. window.system_functions = [];
  25. window.system_functions.push(new Models.SystemFunction('$sin', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  26. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  27. window.system_functions.push(new Models.SystemFunction('$cos', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  28. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  29. window.system_functions.push(new Models.SystemFunction('$tan', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  30. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  31. window.system_functions.push(new Models.SystemFunction('$sqrt', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  32. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  33. window.system_functions.push(new Models.SystemFunction('$pow', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true), new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  34. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  35. window.system_functions.push(new Models.SystemFunction('$log', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  36. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  37. window.system_functions.push(new Models.SystemFunction('$abs', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  38. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  39. window.system_functions.push(new Models.SystemFunction('$negate', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  40. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  41. window.system_functions.push(new Models.SystemFunction('$invert', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  42. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  43. window.system_functions.push(new Models.SystemFunction('$max', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  44. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  45. window.system_functions.push(new Models.SystemFunction('$min', Types.REAL, 0, [new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.all, null, null, null, true)],
  46. null, Models.SYSTEM_FUNCTIONS_CATEGORIES.math));
  47. /*const variable1 = new Models.Variable(Types.INTEGER, "a", 1);
  48. const parameter1 = new Models.Variable(Types.INTEGER, "par_1", 1);
  49. const command1 = new Models.Comment(new Models.VariableValueMenu(VariableValueMenu.VAR_OR_VALUE_TYPES.only_value, "Testing rendering commands"));
  50. const sumFunction = new Models.Function("soma", Types.INTEGER, 0, [parameter1], false, false, [], null, [command1]);
  51. program.addFunction(sumFunction);
  52. */
  53. console.log(' ___ ___ ________ \n / / / / / ____/ \n / / / / / / \n / / / / ______ ___ / /__ \n / / / / / \\ / / / ___/ \n / /______ / / / /\\ \\/ / / / \n / / / / / / \\ / / /____ \n/__________/ /___/ /___/ \\___/ /________/ ');
  54. const mainFunction = new Models.Function(LocalizedStrings.getUI("start"), Types.VOID, 0, [], true, false);
  55. mainFunction.function_comment = new Models.Comment(LocalizedStrings.getUI('text_comment_main'));
  56. program.addFunction(mainFunction);
  57. window.program_obj = program;
  58. window.generator = CodeManagement.generate;
  59. window.runCodeAssessment = runCodeAssessment;
  60. window.renderAlgorithm = AlgorithmManagement.renderAlgorithm;
  61. WatchJS.watch(program.globals, function(){
  62. AlgorithmManagement.renderAlgorithm();
  63. }, 1);
  64. function addFunctionHandler () {
  65. 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')));
  66. program.addFunction(new_function);
  67. counter_new_functions ++;
  68. renderFunction(new_function);
  69. }
  70. function addParameter (function_obj, function_container) {
  71. if (function_obj.parameters_list == null) {
  72. function_obj.parameters_list = [];
  73. }
  74. var new_parameter = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI("new_parameter") + "_" + counter_new_parameters);
  75. function_obj.parameters_list.push(new_parameter);
  76. counter_new_parameters ++;
  77. renderParameter(function_obj, new_parameter, function_container);
  78. }
  79. function updateReturnType (function_obj, new_type, new_dimensions = 0) {
  80. function_obj.return_type = new_type;
  81. function_obj.return_dimensions = new_dimensions;
  82. }
  83. function removeFunction (function_obj) {
  84. var index = program.functions.indexOf(function_obj);
  85. if (index > -1) {
  86. program.functions.splice(index, 1);
  87. }
  88. }
  89. function minimizeFunction (function_obj) {
  90. function_obj.is_hidden = !function_obj.is_hidden;
  91. }
  92. function addHandlers (function_obj, function_container) {
  93. function_container.find('.ui.dropdown.function_return').dropdown({
  94. onChange: function(value, text, $selectedItem) {
  95. if ($selectedItem.data('dimensions')) {
  96. updateReturnType(function_obj, Types[$selectedItem.data('type')], $selectedItem.data('dimensions'));
  97. } else {
  98. updateReturnType(function_obj, Types[$selectedItem.data('type')]);
  99. }
  100. }
  101. });
  102. function_container.find( ".name_function_updated" ).on('click', function(e){
  103. enableNameFunctionUpdate(function_obj, function_container);
  104. });
  105. function_container.find( ".add_parameter_button" ).on('click', function(e){
  106. addParameter(function_obj, function_container);
  107. });
  108. function_container.find('.menu_commands').dropdown({
  109. on: 'hover'
  110. });
  111. function_container.find('.menu_commands a').on('click', function(evt){
  112. if (function_obj.commands == null || function_obj.commands.length == 0) {
  113. function_obj.commands = [];
  114. var new_cmd = CommandsManagement.genericCreateCommand($(this).data('command'));
  115. function_obj.commands.push(new_cmd);
  116. CommandsManagement.renderCommand(new_cmd, function_container.find('.commands_list_div'), 3, function_obj);
  117. } else {
  118. CommandsManagement.createFloatingCommand(function_obj, function_container, $(this).data('command'), evt);
  119. }
  120. });
  121. function_container.find('.add_var_button_function').on('click', function(e){
  122. VariablesManagement.addVariable(function_obj, function_container);
  123. });
  124. function_container.find('.remove_function_button').on('click', function(e){
  125. removeFunction(function_obj);
  126. function_container.slideUp(400);
  127. });
  128. function_container.find('.minimize_function_button').on('click', function(e){
  129. minimizeFunction(function_obj);
  130. function_container.find(".function_area").toggle();
  131. function_container.find(".add_var_top_button").toggle();
  132. });
  133. }
  134. // Essa função imprime o tipo de retorno da função e cria o menu do tipo 'select' para alteração
  135. function renderFunctionReturn (function_obj, function_element) {
  136. var ret = '<div class="ui dropdown function_return">';
  137. if (function_obj.return_dimensions > 0) {
  138. ret += '<div class="text">'+ LocalizedStrings.getUI("vector") +':'+ LocalizedStrings.getUI(function_obj.return_type);
  139. if (function_obj.return_dimensions == 1) {
  140. ret += ' [ ] ';
  141. } else {
  142. ret += ' [ ] [ ] ';
  143. }
  144. ret += '</div>';
  145. } else {
  146. ret += '<div class="text">'+LocalizedStrings.getUI(function_obj.return_type)+'</div>';
  147. }
  148. ret += '<div class="menu">';
  149. for (var tm in Types) {
  150. ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase() && function_obj.return_dimensions < 1 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
  151. }
  152. for (var tm in Types) {
  153. if (tm == Types.VOID.toUpperCase()) {
  154. continue;
  155. }
  156. ret += '<div class="item">'
  157. + '<i class="dropdown icon"></i>'
  158. + LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())
  159. + '<div class="menu">'
  160. + '<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>'
  161. + '<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>'
  162. + '</div>'
  163. + '</div>';
  164. }
  165. ret += '</div></div>';
  166. ret = $(ret);
  167. function_element.find('.function_return').append(ret);
  168. }
  169. export function renderFunction (function_obj) {
  170. var appender = '<div class="ui secondary segment function_div list-group-item">';
  171. if (function_obj.function_comment) {
  172. //appender += renderComment(function_obj.function_comment, sequence, true, -1);
  173. }
  174. appender += '<span class="glyphicon glyphicon-move move_function" aria-hidden="true"><i class="icon sort alternate vertical"></i></span>';
  175. 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>')
  176. + '<button class="ui icon button tiny minimize_function_button"><i class="icon window minimize"></i></button>';
  177. 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>';
  178. appender += '<div class="ui icon button dropdown menu_commands" ><i class="icon code"></i> <div class="menu"> ';
  179. appender += '<a class="item" data-command="'+Models.COMMAND_TYPES.reader+'"><i class="download icon"></i> ' +LocalizedStrings.getUI('text_read_var')+ '</a>'
  180. + '<a class="item" data-command="'+Models.COMMAND_TYPES.writer+'"><i class="upload icon"></i> '+LocalizedStrings.getUI('text_write_var')+'</a>'
  181. + '<a class="item" data-command="'+Models.COMMAND_TYPES.comment+'"><i class="quote left icon"></i> '+LocalizedStrings.getUI('text_comment')+'</a>'
  182. + '<a class="item" data-command="'+Models.COMMAND_TYPES.attribution+'"><i class="arrow left icon"></i> '+LocalizedStrings.getUI('text_attribution')+'</a>'
  183. + '<a class="item" data-command="'+Models.COMMAND_TYPES.functioncall+'"><i class="hand point right icon"></i> '+LocalizedStrings.getUI('text_functioncall')+'</a>'
  184. + '<a class="item" data-command="'+Models.COMMAND_TYPES.iftrue+'" ><i class="random icon"></i> '+LocalizedStrings.getUI('text_iftrue')+'</a>'
  185. + '<a class="item" data-command="'+Models.COMMAND_TYPES.repeatNtimes+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_repeatNtimes')+'</a>'
  186. + '<a class="item" data-command="'+Models.COMMAND_TYPES.whiletrue+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_whiletrue')+'</a>'
  187. + '<a class="item" data-command="'+Models.COMMAND_TYPES.dowhiletrue+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_dowhiletrue')+'</a>'
  188. + '<a class="item" data-command="'+Models.COMMAND_TYPES.switch+'"><i class="list icon"></i> '+LocalizedStrings.getUI('text_switch')+'</a>'
  189. + '<a class="item" data-command="'+Models.COMMAND_TYPES.return+'"><i class="reply icon"></i> '+LocalizedStrings.getUI('text_btn_return')+'</a>'
  190. + '</div></div></div>';
  191. appender += '<div class="function_signature_div">'+LocalizedStrings.getUI("function")+' ';
  192. if (function_obj.is_main) {
  193. 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> '
  194. + ' <span class="parethesis_function">( </span> <div class="ui large labels parameters_list">';
  195. } else {
  196. appender += '<div class="ui function_return"></div>';
  197. appender += '<div class="function_name_div function_name_div_updated"><span class="span_name_function name_function_updated">'+function_obj.name+'</span> </div> '
  198. + ' <span class="parethesis_function"> ( </span> <i class="ui icon plus square outline add_parameter_button"></i> <div class="ui large labels parameters_list container_parameters_list">';
  199. }
  200. appender += '</div> <span class="parethesis_function"> ) </span> </div>'
  201. + (function_obj.is_hidden ? ' <div class="function_area" style="display: none;"> ' : ' <div class="function_area"> ')
  202. + '<div class="ui top attached segment variables_list_div">'
  203. + '</div>'
  204. + '<div class="ui bottom attached segment commands_list_div" id="function_drag_cmd_">';
  205. appender += '</div>';
  206. appender += '<div class="function_close_div"></div>'
  207. + '</div>'
  208. + '</div>';
  209. appender = $(appender);
  210. $('.all_functions').append(appender);
  211. appender.data('fun', function_obj);
  212. appender.find('.commands_list_div').data('fun', function_obj);
  213. renderFunctionReturn(function_obj, appender);
  214. addHandlers(function_obj, appender);
  215. // Rendering parameters:
  216. for (var j = 0; j < function_obj.parameters_list.length; j++) {
  217. renderParameter(function_obj, function_obj.parameters_list[j], appender);
  218. }
  219. // Rendering variables:
  220. for (var j = 0; j < function_obj.variables_list.length; j++) {
  221. VariablesManagement.renderVariable(appender, function_obj.variables_list[j], function_obj);
  222. }
  223. // Rendering commands:
  224. for (var j = 0; j < function_obj.commands.length; j++) {
  225. CommandsManagement.renderCommand(function_obj.commands[j], $(appender.find('.commands_list_div')[0]), 3, function_obj);
  226. }
  227. $('.minimize_function_button').popup({
  228. content : LocalizedStrings.getUI("tooltip_minimize"),
  229. delay: {
  230. show: 750,
  231. hide: 0
  232. }
  233. });
  234. }
  235. export function initVisualUI () {
  236. // MUST USE CONST, LET, OR VAR !!!!!!
  237. const mainDiv = $('#visual-main-div');
  238. // fill mainDiv with functions and globals...
  239. // renderAlgorithm()...
  240. $('.add_function_button').on('click', () => {
  241. addFunctionHandler();
  242. });
  243. $('.add_global_button').on('click', () => {
  244. GlobalsManagement.addGlobal(program);
  245. });
  246. $('.run_button').on('click', () => {
  247. runCode();
  248. });
  249. $('.visual_coding_button').on('click', () => {
  250. toggleVisualCoding();
  251. });
  252. $('.textual_coding_button').on('click', () => {
  253. toggleTextualCoding();
  254. });
  255. $('.assessment').on('click', () => {
  256. runCodeAssessment();
  257. is_iassign = true;
  258. });
  259. $('.div_toggle_console').on('click', () => {
  260. toggleConsole();
  261. });
  262. }
  263. var is_iassign = false;
  264. $( document ).ready(function() {
  265. for (var i = 0; i < program.functions.length; i++) {
  266. renderFunction(program.functions[i]);
  267. }
  268. var time_show = 750;
  269. $('.visual_coding_button').popup({
  270. content : LocalizedStrings.getUI("tooltip_visual"),
  271. delay: {
  272. show: time_show,
  273. hide: 0
  274. }
  275. });
  276. $('.textual_coding_button').popup({
  277. content : LocalizedStrings.getUI("tooltip_textual"),
  278. delay: {
  279. show: time_show,
  280. hide: 0
  281. }
  282. });
  283. $('.upload_file_button').popup({
  284. content : LocalizedStrings.getUI("tooltip_upload"),
  285. delay: {
  286. show: time_show,
  287. hide: 0
  288. }
  289. });
  290. $('.download_file_button').popup({
  291. content : LocalizedStrings.getUI("tooltip_download"),
  292. delay: {
  293. show: time_show,
  294. hide: 0
  295. }
  296. });
  297. $('.undo_button').popup({
  298. content : LocalizedStrings.getUI("tooltip_undo"),
  299. delay: {
  300. show: time_show,
  301. hide: 0
  302. }
  303. });
  304. $('.redo_button').popup({
  305. content : LocalizedStrings.getUI("tooltip_redo"),
  306. delay: {
  307. show: time_show,
  308. hide: 0
  309. }
  310. });
  311. $('.run_button').popup({
  312. content : LocalizedStrings.getUI("tooltip_run"),
  313. delay: {
  314. show: time_show,
  315. hide: 0
  316. }
  317. });
  318. $('.assessment_button').popup({
  319. content : LocalizedStrings.getUI("tooltip_evaluate"),
  320. delay: {
  321. show: time_show,
  322. hide: 0
  323. }
  324. });
  325. $('.help_button').popup({
  326. content : LocalizedStrings.getUI("tooltip_help"),
  327. delay: {
  328. show: time_show,
  329. hide: 0
  330. }
  331. });
  332. $('.add_global_button').popup({
  333. content : LocalizedStrings.getUI("tooltip_add_global"),
  334. delay: {
  335. show: time_show,
  336. hide: 0
  337. }
  338. });
  339. $('.div_toggle_console').popup({
  340. content : LocalizedStrings.getUI("tooltip_console"),
  341. delay: {
  342. show: time_show,
  343. hide: 0
  344. }
  345. });
  346. Sortable.create(listWithHandle, {
  347. handle: '.glyphicon-move',
  348. animation: 100,
  349. ghostClass: 'ghost',
  350. group: 'functions_divs_drag',
  351. onEnd: function (evt) {
  352. updateSequenceFunction(evt.oldIndex, evt.newIndex);
  353. }
  354. });
  355. });
  356. function updateSequenceFunction (oldIndex, newIndex) {
  357. program_obj.functions.splice(newIndex, 0, program_obj.functions.splice(oldIndex, 1)[0]);
  358. }
  359. function runCodeAssessment () {
  360. toggleConsole(true);
  361. window.studentGrade = null;
  362. studentTemp = null;
  363. const strCode = CodeManagement.generate();
  364. if (strCode == null) {
  365. return;
  366. }
  367. if(domConsole == null)
  368. domConsole = new DOMConsole("#ivprog-term");
  369. $("#ivprog-term").slideDown(500);
  370. const runner = new IVProgAssessment(strCode, testCases, domConsole);
  371. runner.runTest().then(grade => {
  372. if (!is_iassign) {
  373. parent.getEvaluationCallback(grade);
  374. } else {
  375. is_iassign = false;
  376. }
  377. }).catch( err => domConsole.err(err.message));
  378. }
  379. function runCode () {
  380. toggleConsole(true);
  381. const strCode = CodeManagement.generate();
  382. if (strCode == null) {
  383. return;
  384. }
  385. if(domConsole == null)
  386. domConsole = new DOMConsole("#ivprog-term");
  387. $("#ivprog-term").slideDown(500);
  388. try {
  389. const parser = IVProgParser.createParser(strCode);
  390. const analyser = new SemanticAnalyser(parser.parseTree());
  391. const data = analyser.analyseTree();
  392. const proc = new IVProgProcessor(data);
  393. proc.registerInput(domConsole);
  394. proc.registerOutput(domConsole);
  395. $("#ivprog-term").addClass('ivprog-term-active');
  396. proc.interpretAST().then( _ => {
  397. domConsole.info("Programa executado com sucesso!");
  398. $("#ivprog-term").removeClass('ivprog-term-active');
  399. }).catch(err => {
  400. domConsole.err(err.message);
  401. $("#ivprog-term").removeClass('ivprog-term-active');
  402. })
  403. } catch (error) {
  404. domConsole.err(error.message);
  405. console.log(error);
  406. }
  407. }
  408. function toggleConsole (is_running) {
  409. if (is_running) {
  410. $('.ivprog-term-div').css('display', 'block');
  411. $('#ivprog-term').css('min-height', '160px');
  412. $('#ivprog-term').css('margin-top', '-170px');
  413. return;
  414. }
  415. if ($('#ivprog-term').css('min-height') == '160px') {
  416. // esconder
  417. $('.ivprog-term-div').css('display', 'none');
  418. $('#ivprog-term').css('min-height', '0');
  419. $('#ivprog-term').css('margin-top', '-30px');
  420. $('#ivprog-term').css('padding', '5px');
  421. } else {
  422. // mostrar
  423. $('.ivprog-term-div').css('display', 'block');
  424. $('#ivprog-term').css('min-height', '160px');
  425. $('#ivprog-term').css('margin-top', '-170px');
  426. }
  427. }
  428. function waitToCloseConsole () {
  429. domConsole.info("Aperte qualquer tecla para fechar...");
  430. const p = new Promise((resolve, _) => {
  431. domConsole.requestInput(resolve, true);
  432. });
  433. p.then( _ => {
  434. domConsole.dispose();
  435. domConsole = null;
  436. $("#ivprog-term").hide();
  437. })
  438. }
  439. function toggleTextualCoding () {
  440. var code = CodeManagement.generate();
  441. $('.ivprog_visual_panel').css('display', 'none');
  442. $('.ivprog_textual_panel').css('display', 'block');
  443. $('.ivprog_textual_panel').removeClass('loading');
  444. $('.ivprog_textual_code').text(code);
  445. $('.visual_coding_button').removeClass('active');
  446. $('.textual_coding_button').addClass('active');
  447. }
  448. function toggleVisualCoding () {
  449. $('.ivprog_textual_panel').addClass('loading');
  450. $('.ivprog_textual_panel').css('display', 'none');
  451. $('.ivprog_visual_panel').css('display', 'block');
  452. $('.textual_coding_button').removeClass('active');
  453. $('.visual_coding_button').addClass('active');
  454. }
  455. function removeParameter (function_obj, parameter_obj, parameter_container) {
  456. var index = function_obj.parameters_list.indexOf(parameter_obj);
  457. if (index > -1) {
  458. function_obj.parameters_list.splice(index, 1);
  459. }
  460. $(parameter_container).remove();
  461. }
  462. function updateParameterType(parameter_obj, new_type, new_dimensions = 0) {
  463. parameter_obj.type = new_type;
  464. parameter_obj.dimensions = new_dimensions;
  465. if (new_dimensions > 0) {
  466. parameter_obj.rows = new_dimensions;
  467. parameter_obj.columns = 2;
  468. }
  469. }
  470. function renderParameter (function_obj, parameter_obj, function_container) {
  471. var ret = "";
  472. ret += '<div class="ui label function_name_parameter">';
  473. ret += '<div class="ui dropdown parameter_type">';
  474. if (parameter_obj.dimensions > 0) {
  475. ret += '<div class="text">'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(parameter_obj.type);
  476. if (parameter_obj.dimensions == 1) {
  477. ret += ' [ ] ';
  478. } else {
  479. ret += ' [ ] [ ] ';
  480. }
  481. ret += '</div>';
  482. } else {
  483. ret += '<div class="text">'+LocalizedStrings.getUI(parameter_obj.type)+'</div>';
  484. }
  485. ret += '<div class="menu">';
  486. for (var tm in Types) {
  487. if (tm == Types.VOID.toUpperCase()) {
  488. continue;
  489. }
  490. ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
  491. }
  492. for (var tm in Types) {
  493. if (tm == Types.VOID.toUpperCase()) {
  494. continue;
  495. }
  496. ret += '<div class="item">'
  497. + '<i class="dropdown icon"></i>'
  498. + LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())
  499. + '<div class="menu">'
  500. + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1">[ ]</div>'
  501. + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] [ ] " data-type="'+tm+'" data-dimensions="2">[ ] [ ] </div>'
  502. + '</div>'
  503. + '</div>';
  504. }
  505. ret += '</div></div>';
  506. ret += '<div class="parameter_div_edit"><span class="span_name_parameter label_enable_name_parameter">'+parameter_obj.name+'</span></div> ';
  507. ret += ' <i class="red icon times remove_parameter"></i></div>';
  508. ret = $(ret);
  509. function_container.find('.container_parameters_list').append(ret);
  510. ret.find('.remove_parameter').on('click', function(e){
  511. removeParameter(function_obj, parameter_obj, ret);
  512. });
  513. ret.find('.ui.dropdown.parameter_type').dropdown({
  514. onChange: function(value, text, $selectedItem) {
  515. if ($selectedItem.data('dimensions')) {
  516. updateParameterType(parameter_obj, Types[$selectedItem.data('type')], $selectedItem.data('dimensions'));
  517. } else {
  518. updateParameterType(parameter_obj, Types[$selectedItem.data('type')]);
  519. }
  520. }
  521. });
  522. ret.find('.label_enable_name_parameter').on('click', function(e){
  523. enableNameParameterUpdate(parameter_obj, ret);
  524. });
  525. }
  526. var opened_name_parameter = false;
  527. var opened_input_parameter = null;
  528. function enableNameParameterUpdate (parameter_obj, parent_node) {
  529. if (opened_name_parameter) {
  530. opened_input_parameter.focus();
  531. return;
  532. }
  533. opened_name_parameter = true;
  534. parent_node = $(parent_node);
  535. var input_field;
  536. parent_node.find('.span_name_parameter').text('');
  537. input_field = $( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"+parameter_obj.name+"' />" );
  538. input_field.insertBefore(parent_node.find('.span_name_parameter'));
  539. input_field.on('input', function() {
  540. var inputWidth = input_field.textWidth()+10;
  541. opened_input_parameter = input_field;
  542. input_field.focus();
  543. var tmpStr = input_field.val();
  544. input_field.val('');
  545. input_field.val(tmpStr);
  546. input_field.css({
  547. width: inputWidth
  548. })
  549. }).trigger('input');
  550. input_field.focusout(function() {
  551. /// update array:
  552. if (input_field.val().trim()) {
  553. parameter_obj.name = input_field.val().trim();
  554. parent_node.find('.span_name_parameter').text(parameter_obj.name);
  555. }
  556. input_field.off();
  557. input_field.remove();
  558. /// update elements:
  559. opened_name_parameter = false;
  560. opened_input_parameter = false;
  561. });
  562. input_field.on('keydown', function(e) {
  563. var code = e.keyCode || e.which;
  564. if(code == 13) {
  565. if (input_field.val().trim()) {
  566. parameter_obj.name = input_field.val().trim();
  567. parent_node.find('.span_name_parameter').text(parameter_obj.name);
  568. }
  569. input_field.off();
  570. input_field.remove();
  571. /// update elements:
  572. opened_name_parameter = false;
  573. opened_input_parameter = false;
  574. }
  575. if(code == 27) {
  576. parent_node.find('.span_name_parameter').text(parameter_obj.name);
  577. input_field.off();
  578. input_field.remove();
  579. /// update elements:
  580. opened_name_parameter = false;
  581. opened_input_parameter = false;
  582. }
  583. });
  584. input_field.select();
  585. }
  586. var opened_name_function = false;
  587. var opened_input = null;
  588. var previousPadding = null;
  589. function enableNameFunctionUpdate (function_obj, parent_node) {
  590. if (opened_name_function) {
  591. opened_input.focus();
  592. return;
  593. }
  594. parent_node = $(parent_node);
  595. parent_node.find('.span_name_function').text('');
  596. var input_field;
  597. if (!previousPadding) {
  598. previousPadding = parent_node.find('.span_name_function').css('padding-left');
  599. }
  600. parent_node.find('.span_name_function').css('padding-left', '0');
  601. parent_node.find('.span_name_function').css('padding-right', '0');
  602. input_field = $( "<input type='text' class='width-dynamic input_name_function' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' value='"+function_obj.name+"' />" );
  603. input_field.insertBefore(parent_node.find('.span_name_function'));
  604. input_field.on('input', function() {
  605. var inputWidth = input_field.textWidth()+10;
  606. opened_input = input_field;
  607. input_field.focus();
  608. var tmpStr = input_field.val();
  609. input_field.val('');
  610. input_field.val(tmpStr);
  611. input_field.css({
  612. width: inputWidth
  613. })
  614. }).trigger('input');
  615. input_field.focusout(function() {
  616. /// update array:
  617. if (input_field.val().trim()) {
  618. function_obj.name = input_field.val().trim();
  619. }
  620. input_field.off();
  621. input_field.remove();
  622. parent_node.find('.span_name_function').css('padding-left', previousPadding);
  623. parent_node.find('.span_name_function').css('padding-right', previousPadding);
  624. parent_node.find('.span_name_function').text(function_obj.name);
  625. /// update elements:
  626. opened_name_function = false;
  627. opened_input = false;
  628. });
  629. input_field.on('keydown', function(e) {
  630. var code = e.keyCode || e.which;
  631. if(code == 13) {
  632. if (input_field.val().trim()) {
  633. function_obj.name = input_field.val().trim();
  634. }
  635. input_field.off();
  636. input_field.remove();
  637. parent_node.find('.span_name_function').css('padding-left', previousPadding);
  638. parent_node.find('.span_name_function').css('padding-right', previousPadding);
  639. parent_node.find('.span_name_function').text(function_obj.name);
  640. /// update elements:
  641. opened_name_function = false;
  642. opened_input = false;
  643. }
  644. if(code == 27) {
  645. input_field.off();
  646. input_field.remove();
  647. parent_node.find('.span_name_function').css('padding-left', previousPadding);
  648. parent_node.find('.span_name_function').css('padding-right', previousPadding);
  649. parent_node.find('.span_name_function').text(function_obj.name);
  650. /// update elements:
  651. opened_name_function = false;
  652. opened_input = false;
  653. }
  654. });
  655. input_field.select();
  656. }