functions_sidebar.js 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404
  1. import $ from 'jquery';
  2. import { Types } from './types';
  3. import * as Models from './ivprog_elements_sidebar';
  4. import { LocalizedStrings } from './../services/localizedStringsService';
  5. import * as GlobalsManagement from './globals_sidebar';
  6. import * as VariablesManagement from './variables';
  7. import * as CommandsManagement from './commands_sidebar';
  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_sidebar';
  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. }
  657. /****************************************************
  658. //DOUGLAS
  659. *******************************************************/
  660. export function generateMenuButton(function_obj) {
  661. 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> <span class="function_name">' + function_obj.name + '</span> (<span class="function_params"></span>) : <span class="function_return_type">' + LocalizedStrings.getUI(function_obj.return_type) + '</span></button>';
  662. var params = "";
  663. menu_button = $(menu_button);
  664. for (var j = 0; j < function_obj.parameters_list.length; j++) {
  665. if (j > 0)
  666. params += ',';
  667. params += LocalizedStrings.getUI(function_obj.parameters_list[j].type);
  668. }
  669. menu_button
  670. .data('fun',function_obj)
  671. .on('dragstart', function(e) {
  672. program_obj.dataTransfer = {type:"function",content:function_obj};
  673. e.originalEvent.dataTransfer.setData("text",JSON.stringify({type:"function",content:function_obj}));
  674. //evt.originalEvent.dataTransfer.setData("text",$(this).data('command'));
  675. })
  676. .find('.function_params').text(params)
  677. .find('.function_return_type').text(function_obj.type);
  678. return menu_button;
  679. }
  680. removeFunction = function(function_obj) {
  681. var index = program.functions.indexOf(function_obj);
  682. if (index > -1) {
  683. program.functions.splice(index, 1);
  684. }
  685. $('.functions_labels > [data-function=' + function_obj.name + ']').remove();
  686. }
  687. renderFunction = function(function_obj) {
  688. var appender = '<div class="ui secondary segment function_div list-group-item">';
  689. if (function_obj.function_comment) {
  690. //appender += renderComment(function_obj.function_comment, sequence, true, -1);
  691. }
  692. appender += '<span class="glyphicon glyphicon-move move_function" aria-hidden="true"><i class="icon sort alternate vertical"></i></span>';
  693. 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>')
  694. + '<button class="ui icon button tiny minimize_function_button"><i class="icon window minimize"></i></button>';
  695. 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>';
  696. appender += '<div class="ui icon button dropdown menu_commands" ><i class="icon code"></i> <div class="menu"> ';
  697. appender += '<a class="item" data-command="'+Models.COMMAND_TYPES.reader+'"><i class="download icon"></i> ' +LocalizedStrings.getUI('text_read_var')+ '</a>'
  698. + '<a class="item" data-command="'+Models.COMMAND_TYPES.writer+'"><i class="upload icon"></i> '+LocalizedStrings.getUI('text_write_var')+'</a>'
  699. + '<a class="item" data-command="'+Models.COMMAND_TYPES.comment+'"><i class="quote left icon"></i> '+LocalizedStrings.getUI('text_comment')+'</a>'
  700. + '<a class="item" data-command="'+Models.COMMAND_TYPES.attribution+'"><i class="arrow left icon"></i> '+LocalizedStrings.getUI('text_attribution')+'</a>'
  701. + '<a class="item" data-command="'+Models.COMMAND_TYPES.functioncall+'"><i class="hand point right icon"></i> '+LocalizedStrings.getUI('text_functioncall')+'</a>'
  702. + '<a class="item" data-command="'+Models.COMMAND_TYPES.iftrue+'" ><i class="random icon"></i> '+LocalizedStrings.getUI('text_iftrue')+'</a>'
  703. + '<a class="item" data-command="'+Models.COMMAND_TYPES.repeatNtimes+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_repeatNtimes')+'</a>'
  704. + '<a class="item" data-command="'+Models.COMMAND_TYPES.whiletrue+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_whiletrue')+'</a>'
  705. + '<a class="item" data-command="'+Models.COMMAND_TYPES.dowhiletrue+'"><i class="sync icon"></i> '+LocalizedStrings.getUI('text_dowhiletrue')+'</a>'
  706. + '<a class="item" data-command="'+Models.COMMAND_TYPES.switch+'"><i class="list icon"></i> '+LocalizedStrings.getUI('text_switch')+'</a>'
  707. + '<a class="item" data-command="'+Models.COMMAND_TYPES.return+'"><i class="reply icon"></i> '+LocalizedStrings.getUI('text_btn_return')+'</a>'
  708. + '</div></div></div>';
  709. appender += '<div class="function_signature_div">'+LocalizedStrings.getUI("function")+' ';
  710. if (function_obj.is_main) {
  711. 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> '
  712. + '( <div class="ui large labels parameters_list">';
  713. } else {
  714. appender += '<div class="ui function_return"></div>';
  715. appender += '<div class="function_name_div function_name_div_updated"><span class="span_name_function name_function_updated">'+function_obj.name+'</span> </div> '
  716. + ' <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">';
  717. $('.functions_labels').append(generateMenuButton(function_obj));
  718. console.log("aqui");
  719. //var menu_button = $('.functions_labels > [data-function=' + function_obj.name + ']');
  720. //var params = "";
  721. //menu_button
  722. }
  723. appender += '</div> ) </div>'
  724. + (function_obj.is_hidden ? ' <div class="function_area" style="display: none;"> ' : ' <div class="function_area"> ')
  725. + '<div class="ui top attached segment variables_list_div">'
  726. /*+ renderVariables(function_obj, sequence)*/
  727. + '</div>'
  728. + '<div class="ui bottom attached segment commands_list_div" id="function_drag_cmd_">';
  729. appender += '</div>';
  730. appender += '<div class="function_close_div"></div>'
  731. + '</div>'
  732. + '</div>';
  733. appender = $(appender);
  734. $('.all_functions').append(appender);
  735. appender.data('fun', function_obj);
  736. appender.find('.commands_list_div')
  737. .data('fun', function_obj)
  738. .attr('droppable',true)
  739. .on('dragenter',function(e) {
  740. e.preventDefault();
  741. console.log('dragenter');
  742. console.log(e.target)
  743. $(e.target).addClass('div-over')
  744. //e.stopPropagation();
  745. }).on('dragover',function(e){
  746. e.preventDefault();
  747. })
  748. .on('dragleave',function(e) {
  749. e.preventDefault();
  750. //e.stopPropagation();
  751. console.log("dragleave")
  752. $(e.target).removeClass('div-over')
  753. console.log(e.target)
  754. })
  755. .on('drop',function(e){
  756. e.preventDefault();
  757. console.log('ondrop ' + e.originalEvent.dataTransfer.getData("text"));
  758. console.log(e)
  759. $(e.target).removeClass('div-over')
  760. //var data = JSON.parse(e.originalEvent.dataTransfer.getData("text"));
  761. var data = program_obj.dataTransfer;
  762. if (data.type == 'command')
  763. CommandsManagement.prepareManageCommand(function_obj, $(e.target).closest('.function_div'), e, data.content);
  764. if (data.type == 'var')
  765. CommandsManagement.prepareManageCommand(function_obj, $(e.target).closest('.function_div'), e, "attribution", data.content);
  766. else {
  767. if(!data.content.parameters_list)
  768. data.content.parameters_list = [];
  769. CommandsManagement.prepareManageCommand(function_obj, $(e.target).closest('.function_div'), e, "functioncall", data.content);
  770. }
  771. delete program_obj.dataTransfer;
  772. });
  773. renderFunctionReturn(function_obj, appender);
  774. addHandlers(function_obj, appender);
  775. // Rendering parameters:
  776. for (var j = 0; j < function_obj.parameters_list.length; j++) {
  777. renderParameter(function_obj, function_obj.parameters_list[j], appender);
  778. }
  779. // Rendering variables:
  780. for (var j = 0; j < function_obj.variables_list.length; j++) {
  781. VariablesManagement.renderVariable(appender, function_obj.variables_list[j], function_obj);
  782. }
  783. // Rendering commands:
  784. for (var j = 0; j < function_obj.commands.length; j++) {
  785. CommandsManagement.renderCommand(function_obj.commands[j], $(appender.find('.commands_list_div')[0]), 3, function_obj);
  786. }
  787. console.log('kk')
  788. console.log($($('.function_div')[0]).data('fun'))
  789. console.log(appender.data('fun'))
  790. }
  791. initVisualUI = function() {
  792. // MUST USE CONST, LET, OR VAR !!!!!!
  793. const mainDiv = $('#visual-main-div');
  794. // fill mainDiv with functions and globals...
  795. // renderAlgorithm()...
  796. $('.add_function_button').on('click', () => {
  797. addFunctionHandler();
  798. });
  799. $('.add_global_button').on('click', () => {
  800. GlobalsManagement.addGlobal(program);
  801. });
  802. $('.run_button').on('click', () => {
  803. runCode();
  804. });
  805. $('.visual_coding_button').on('click', () => {
  806. toggleVisualCoding();
  807. });
  808. $('.textual_coding_button').on('click', () => {
  809. toggleTextualCoding();
  810. });
  811. $('.assessment').on('click', () => {
  812. runCodeAssessment();
  813. is_iassign = true;
  814. });
  815. $('.div_toggle_console').on('click', () => {
  816. toggleConsole();
  817. });
  818. var commands = [
  819. {type: Models.COMMAND_TYPES.break, icon: "stop", text: LocalizedStrings.getUI('text_break')},
  820. {type: Models.COMMAND_TYPES.reader, icon: "download", text: LocalizedStrings.getUI('text_read_var')},
  821. {type: Models.COMMAND_TYPES.writer, icon: "upload", text: LocalizedStrings.getUI('text_write_var')},
  822. {type: Models.COMMAND_TYPES.comment, icon: "quote left", text: LocalizedStrings.getUI('text_comment')},
  823. {type: Models.COMMAND_TYPES.attribution, icon: "arrow left", text: LocalizedStrings.getUI('text_attribution')},
  824. //{type: Models.COMMAND_TYPES.functioncall, icon: "hand point right", text: LocalizedStrings.getUI('text_functioncall')},
  825. {type: Models.COMMAND_TYPES.iftrue, icon: "random", text: LocalizedStrings.getUI('text_iftrue')},
  826. {type: Models.COMMAND_TYPES.repeatNtimes, icon: "sync", text: LocalizedStrings.getUI('text_repeatNtimes')},
  827. {type: Models.COMMAND_TYPES.whiletrue, icon: "sync", text: LocalizedStrings.getUI('text_whiletrue')},
  828. {type: Models.COMMAND_TYPES.dowhiletrue, icon: "sync", text: LocalizedStrings.getUI('text_dowhiletrue')},
  829. {type: Models.COMMAND_TYPES.switch, icon: "list", text: LocalizedStrings.getUI('text_switch')}
  830. ];
  831. for (var i = 0; i < commands.length; i++) {
  832. 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>';
  833. command = $(command);
  834. command.on('dragstart', function(evt){
  835. //evt.originalEvent.dataTransfer.setData("text",$(this).data('command'));
  836. //evt.originalEvent.dataTransfer.setData("text",JSON.stringify({type:"command",content:$(this).data('command')}));
  837. program_obj.dataTransfer = {type:"command",content:$(this).data('command')};
  838. console.log('dragstart')
  839. // $('.commands_list_div').attr('droppable',true)
  840. // .on('dragenter',function(e) {
  841. // e.preventDefault();
  842. // //e.stopPropagation();
  843. // console.log("dragenter")
  844. // e.originalEvent.dataTransfer.setData("text",$(this).data('command'));
  845. // console.log($(this).data('command'))
  846. // $(e.target).addClass('div-over')
  847. // console.log(e.target)
  848. // }).on('dragover',function(e){
  849. // e.preventDefault();
  850. // })
  851. // .on('dragleave',function(e) {
  852. // e.preventDefault();
  853. // //e.stopPropagation();
  854. // console.log("dragleave")
  855. // $(e.target).removeClass('div-over')
  856. // console.log(e.target)
  857. // })
  858. // .on('drop',function(e){
  859. // e.preventDefault();
  860. // console.log('ondrop ' + e.originalEvent.dataTransfer.getData("text"))
  861. // CommandsManagement.prepareManageCommand(null, null, e, e.originalEvent.dataTransfer.getData("text"));
  862. // })
  863. /*$(".commands_list_div, .commands_list_div, .block_commands, .command_container").hover(
  864. function(e) {
  865. console.log("enter =>")
  866. $(e.currentTarget).addClass('div-over');
  867. console.log({target: e.target, currentTarget: e.currentTarget, relatedTarget: e.relatedTarget, delegateTarget: e.delegateTarget})
  868. },
  869. function(e) {
  870. console.log("leave =>")
  871. $(e.currentTarget).removeClass('div-over');
  872. console.log({target: e.target, currentTarget: e.currentTarget, relatedTarget: e.relatedTarget, delegateTarget: e.delegateTarget})
  873. }
  874. )
  875. CommandsManagement.createFloatingCommand(null, null, $(this).data('command'), evt);*/
  876. });
  877. $('.list-commands').prepend(command);
  878. }
  879. var library = {
  880. "math": {
  881. functions_list: [
  882. {
  883. name: "sen",
  884. parameters_list: [Types.REAL],
  885. return_type: Types.REAL,
  886. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Calcula o seno um valor."),
  887. },
  888. {
  889. name: "sen",
  890. parameters_list: [Types.INTEGER],
  891. return_type: Types.REAL,
  892. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Calcula o seno um valor.")
  893. },
  894. {
  895. name: "cos",
  896. parameters_list: [Types.REAL],
  897. return_type: Types.REAL,
  898. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Calcula o coseno um valor.")
  899. },
  900. {
  901. name: "cos",
  902. parameters_list: [Types.INTEGER],
  903. return_type: Types.REAL,
  904. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Calcula o coseno um valor.")
  905. },
  906. {
  907. name: "tan",
  908. parameters_list: [Types.REAL],
  909. return_type: Types.REAL,
  910. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Calcula o tangente um valor.")
  911. },
  912. {
  913. name: "tan",
  914. parameters_list: [Types.INTEGER],
  915. return_type: Types.REAL,
  916. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Calcula o tangente um valor.")
  917. },
  918. {
  919. name: "raiz_quadrada",
  920. parameters_list: [Types.REAL],
  921. return_type: Types.REAL,
  922. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Calcula a raiz quadrada um valor.")
  923. },
  924. {
  925. name: "raiz_quadrada",
  926. parameters_list: [Types.INTEGER],
  927. return_type: Types.REAL,
  928. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Calcula a raiz quadrada um valor.")
  929. },
  930. {
  931. name: "pot",
  932. parameters_list: [Types.REAL],
  933. return_type: Types.REAL,
  934. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Eleva a 2 um valor.")
  935. },
  936. {
  937. name: "pot",
  938. parameters_list: [Types.INTEGER],
  939. return_type: Types.REAL,
  940. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Eleva a 2 um valor.")
  941. },
  942. {
  943. name: "log",
  944. parameters_list: [Types.REAL],
  945. return_type: Types.REAL,
  946. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Logaritmo de um valor na base 10.")
  947. },
  948. {
  949. name: "log",
  950. parameters_list: [Types.INTEGER],
  951. return_type: Types.REAL,
  952. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Logaritmo de um valor na base 10.")
  953. },
  954. {
  955. name: "modulo",
  956. parameters_list: [Types.REAL],
  957. return_type: Types.REAL,
  958. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Obtém o valor absoluto de um número.")
  959. },
  960. {
  961. name: "modulo",
  962. parameters_list: [Types.INTEGER],
  963. return_type: Types.INTEGER,
  964. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Obtém o valor absoluto de um número.")
  965. },
  966. {
  967. name: "trocar_sinal",
  968. parameters_list: [Types.REAL],
  969. return_type: Types.REAL,
  970. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Inverte o sinal de um valor.")
  971. },
  972. {
  973. name: "trocar_sinal",
  974. parameters_list: [Types.INTEGER],
  975. return_type: Types.INTEGER,
  976. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Inverte o sinal de um valor.")
  977. },
  978. {
  979. name: "inverter_valor",
  980. parameters_list: [Types.REAL],
  981. return_type: Types.REAL,
  982. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Inverte um valor.")
  983. },
  984. {
  985. name: "inverter_valor",
  986. parameters_list: [Types.INTEGER],
  987. return_type: Types.REAL,
  988. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Inverte um valor.")
  989. },
  990. {
  991. name: "maximo",
  992. parameters_list: [Types.REAL], //vetor
  993. return_type: Types.REAL,
  994. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Retorna o valor máximo em uma série.")
  995. },
  996. {
  997. name: "maximo",
  998. parameters_list: [Types.INTEGER],
  999. return_type: Types.INTEGER,
  1000. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Retorna o valor máximo em uma série.")
  1001. },
  1002. {
  1003. name: "minimo",
  1004. parameters_list: [Types.REAL], //vetor,
  1005. return_type: Types.REAL,
  1006. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Retorna o valor mínimo em uma série.")
  1007. },
  1008. {
  1009. name: "minimo",
  1010. parameters_list: [Types.INTEGER],
  1011. return_type: Types.INTEGER,
  1012. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Retorna o valor mínimo em uma série.")
  1013. }
  1014. ]
  1015. },
  1016. "text": {
  1017. functions_list: [
  1018. {
  1019. name: "subcadeia",
  1020. parameters_list: [Types.TEXT, Types.INTEGER, Types.INTEGER],
  1021. return_type: Types.TEXT,
  1022. tip: LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI("Retorna o valor mínimo em uma série.")
  1023. }
  1024. ]
  1025. }
  1026. }
  1027. var library_labels = $('.library_labels')
  1028. for (var key in library) {
  1029. var val = library[key];
  1030. for (var func in val.functions_list) {
  1031. var parameters_list = [];
  1032. for (var param in func.parameters_list) {
  1033. parameters_list.push(new Models.Variable(param, LocalizedStrings.getUI("new_parameter") + "_" + func.parameters_list.indexOf(param)));
  1034. }
  1035. var function_obj = new Models.Function(LocalizedStrings.getUI(func), func.return_type, 0, parameters_list, false, false, []);
  1036. library_labels.append(generateMenuButton(function_obj));
  1037. console.log(function_obj)
  1038. }
  1039. }
  1040. }
  1041. /*
  1042. renderParameter = function(function_obj, parameter_obj, function_container) {
  1043. var ret = "";
  1044. 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>';
  1045. ret += '<div class="ui dropdown parameter_type">';
  1046. if (parameter_obj.dimensions > 0) {
  1047. ret += '<div class="text">'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(parameter_obj.type);
  1048. ret += '</div>';
  1049. } else {
  1050. ret += '<div class="text">'+LocalizedStrings.getUI(parameter_obj.type)+'</div>';
  1051. }
  1052. ret += '<i class="dropdown icon"></i>'
  1053. + '<div class="menu">';
  1054. for (var tm in Types) {
  1055. if (tm == Types.VOID.toUpperCase()) {
  1056. continue;
  1057. }
  1058. ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
  1059. }
  1060. for (var tm in Types) {
  1061. if (tm == Types.VOID.toUpperCase()) {
  1062. continue;
  1063. }
  1064. ret += '<div class="item">'
  1065. + '<i class="dropdown icon"></i>'
  1066. + LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())
  1067. + '<div class="menu">'
  1068. + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1">[ ]</div>'
  1069. + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] [ ] " data-type="'+tm+'" data-dimensions="2">[ ] [ ] </div>'
  1070. + '</div>'
  1071. + '</div>';
  1072. }
  1073. ret += '</div></div>';
  1074. ret += ' <i class="red icon times remove_parameter"></i></div>';
  1075. ret = $(ret);
  1076. function_container.find('.container_parameters_list').append(ret);
  1077. ret.find('.remove_parameter').on('click', function(e){
  1078. removeParameter(function_obj, parameter_obj, ret);
  1079. });
  1080. ret.find('.ui.dropdown.parameter_type').dropdown({
  1081. onChange: function(value, text, $selectedItem) {
  1082. if ($($selectedItem).data('dimensions')) {
  1083. updateParameterType(parameter_obj, Types[$($selectedItem).data('type')], $($selectedItem).data('dimensions'));
  1084. } else {
  1085. updateParameterType(parameter_obj, Types[$($selectedItem).data('type')]);
  1086. }
  1087. }
  1088. });
  1089. ret.find('.label_enable_name_parameter').on('click', function(e){
  1090. enableNameParameterUpdate(parameter_obj, ret);
  1091. });
  1092. }
  1093. enableNameFunctionUpdate = function(function_obj, parent_node) {
  1094. if (opened_name_function) {
  1095. $(opened_input).focus();
  1096. return;
  1097. }
  1098. $(parent_node).find('.span_name_function').text('');
  1099. $( "<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'));
  1100. $('.width-dynamic').on('input', function() {
  1101. var inputWidth = $(this).textWidth()+10;
  1102. opened_input = this;
  1103. $(this).focus();
  1104. var tmpStr = $(this).val();
  1105. $(this).val('');
  1106. $(this).val(tmpStr);
  1107. $(this).css({
  1108. width: inputWidth
  1109. })
  1110. }).trigger('input');
  1111. $('.width-dynamic').focusout(function() {
  1112. /// update array:
  1113. if ($(this).val().trim()) {
  1114. function_obj.name = $(this).val().trim();
  1115. }
  1116. $(this).remove();
  1117. $(parent_node).find('.span_name_function').text(function_obj.name);
  1118. /// update elements:
  1119. opened_name_function = false;
  1120. opened_input = false;
  1121. });
  1122. $('.width-dynamic').on('keydown', function(e) {
  1123. var code = e.keyCode || e.which;
  1124. if(code == 13) {
  1125. $('.functions_labels > [data-function=' + function_obj.name + ']')
  1126. .attr('data-function', $(this).val().trim())
  1127. .html('<i class="list icon"></i> ' + $(this).val().trim());
  1128. if ($(this).val().trim()) {
  1129. function_obj.name = $(this).val().trim();
  1130. }
  1131. $(this).remove();
  1132. $(parent_node).find('.span_name_function').text(function_obj.name);
  1133. /// update elements:
  1134. opened_name_function = false;
  1135. opened_input = false;
  1136. }
  1137. if(code == 27) {
  1138. $(this).remove();
  1139. $(parent_node).find('.span_name_function').text(function_obj.name);
  1140. /// update elements:
  1141. opened_name_function = false;
  1142. opened_input = false;
  1143. }
  1144. });
  1145. }
  1146. addParameter = function (function_obj, function_container) {
  1147. if (function_obj.parameters_list == null) {
  1148. function_obj.parameters_list = [];
  1149. }
  1150. var new_parameter = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI("new_parameter") + "_" + counter_new_parameters);
  1151. new_parameter.function_obj = function_obj;
  1152. function_obj.parameters_list.push(new_parameter);
  1153. counter_new_parameters ++;
  1154. renderParameter(function_obj, new_parameter, function_container);
  1155. //updateMenuButton(function_obj);
  1156. }
  1157. removeParameter = function (function_obj, parameter_obj, parameter_container) {
  1158. var index = function_obj.parameters_list.indexOf(parameter_obj);
  1159. if (index > -1) {
  1160. function_obj.parameters_list.splice(index, 1);
  1161. }
  1162. $(parameter_container).remove();
  1163. }*/
  1164. updateReturnType = function (function_obj, new_type, new_dimensions = 0) {
  1165. function_obj.return_type = new_type;
  1166. function_obj.return_dimensions = new_dimensions;
  1167. var menu_button = $('.functions_labels > [data-function=' + function_obj.name + ']');
  1168. menu_button.find('.function_return_type').text(LocalizedStrings.getUI(new_type));
  1169. }
  1170. /*
  1171. updateParameterType = function (parameter_obj, new_type, new_dimensions = 0) {
  1172. parameter_obj.type = new_type;
  1173. parameter_obj.dimensions = new_dimensions;
  1174. if (new_dimensions > 0) {
  1175. parameter_obj.rows = new_dimensions;
  1176. parameter_obj.columns = 2;
  1177. }
  1178. //updateMenuButton(parameter_obj.function_obj);
  1179. }*/