functions_sidebar.js 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314
  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. if (function_obj.identifier) {
  662. var identifier = LocalizedStrings.getUI(system_functions[0].identifier);
  663. var menu_button = '<button class="fluid ui container segment labeled icon button list-group-item menu-item" draggable="true" data-function="' + identifier + '"><i class="list icon"></i> <span class="function_name">' + identifier + '</span> (<span class="function_params"></span>) : <span class="function_return_type">' + LocalizedStrings.getUI(function_obj.return_type) + '</span></button>';
  664. } else {
  665. 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>';
  666. }
  667. var params = "";
  668. menu_button = $(menu_button);
  669. for (var j = 0; j < function_obj.parameters_list.length; j++) {
  670. if (j > 0)
  671. params += ',';
  672. if (!function_obj.identifier) {
  673. params += LocalizedStrings.getUI(function_obj.parameters_list[j].type);
  674. } else {
  675. params += function_obj.parameters_list[j].type;
  676. }
  677. }
  678. menu_button
  679. .data('fun', function_obj)
  680. .on('dragstart', function (e) {
  681. program_obj.dataTransfer = { type: "function", content: function_obj };
  682. //e.originalEvent.dataTransfer.setData("text", JSON.stringify({type:"function",content:function_obj}));
  683. //evt.originalEvent.dataTransfer.setData("text",$(this).data('command'));
  684. })
  685. .find('.function_params').text(params)
  686. .find('.function_return_type').text(function_obj.type);
  687. menu_button
  688. .on('click', function (evt) {
  689. $(this).trigger('dragstart');
  690. if(window.ghostNode) {
  691. $(window.ghostNode).remove();
  692. $(document).off('mousemove');
  693. }
  694. window.ghostNode = $(this).clone();
  695. ghostNode.outerWidth($(this).outerWidth());
  696. ghostNode.draggable().appendTo('body');
  697. ghostNode.css('position', 'absolute');
  698. ghostNode.css('left', evt.pageX);
  699. ghostNode.css('top', evt.pageY);
  700. evt.type = 'drag';
  701. evt.target = ghostNode[0];
  702. ghostNode.trigger(evt);
  703. $(document).on('mousemove', function (evt) {
  704. ghostNode.css('left', evt.pageX);
  705. ghostNode.css('top', evt.pageY);
  706. });
  707. });
  708. return menu_button;
  709. }
  710. removeFunction = function (function_obj) {
  711. var index = program.functions.indexOf(function_obj);
  712. if (index > -1) {
  713. program.functions.splice(index, 1);
  714. }
  715. $('.functions_labels > [data-function=' + function_obj.name + ']').remove();
  716. }
  717. renderFunction = function (function_obj) {
  718. var appender = '<div class="ui secondary segment function_div list-group-item">';
  719. if (function_obj.function_comment) {
  720. //appender += renderComment(function_obj.function_comment, sequence, true, -1);
  721. }
  722. appender += '<span class="glyphicon glyphicon-move move_function" aria-hidden="true"><i class="icon sort alternate vertical"></i></span>';
  723. 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>')
  724. + '<button class="ui icon button tiny minimize_function_button"><i class="icon window minimize"></i></button>';
  725. 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>';
  726. appender += '<div class="ui icon button dropdown menu_commands" ><i class="icon code"></i> <div class="menu"> ';
  727. appender += '<a class="item" data-command="' + Models.COMMAND_TYPES.reader + '"><i class="download icon"></i> ' + LocalizedStrings.getUI('text_read_var') + '</a>'
  728. + '<a class="item" data-command="' + Models.COMMAND_TYPES.writer + '"><i class="upload icon"></i> ' + LocalizedStrings.getUI('text_write_var') + '</a>'
  729. + '<a class="item" data-command="' + Models.COMMAND_TYPES.comment + '"><i class="quote left icon"></i> ' + LocalizedStrings.getUI('text_comment') + '</a>'
  730. + '<a class="item" data-command="' + Models.COMMAND_TYPES.attribution + '"><i class="arrow left icon"></i> ' + LocalizedStrings.getUI('text_attribution') + '</a>'
  731. + '<a class="item" data-command="' + Models.COMMAND_TYPES.functioncall + '"><i class="hand point right icon"></i> ' + LocalizedStrings.getUI('text_functioncall') + '</a>'
  732. + '<a class="item" data-command="' + Models.COMMAND_TYPES.iftrue + '" ><i class="random icon"></i> ' + LocalizedStrings.getUI('text_iftrue') + '</a>'
  733. + '<a class="item" data-command="' + Models.COMMAND_TYPES.repeatNtimes + '"><i class="sync icon"></i> ' + LocalizedStrings.getUI('text_repeatNtimes') + '</a>'
  734. + '<a class="item" data-command="' + Models.COMMAND_TYPES.whiletrue + '"><i class="sync icon"></i> ' + LocalizedStrings.getUI('text_whiletrue') + '</a>'
  735. + '<a class="item" data-command="' + Models.COMMAND_TYPES.dowhiletrue + '"><i class="sync icon"></i> ' + LocalizedStrings.getUI('text_dowhiletrue') + '</a>'
  736. + '<a class="item" data-command="' + Models.COMMAND_TYPES.switch + '"><i class="list icon"></i> ' + LocalizedStrings.getUI('text_switch') + '</a>'
  737. + '<a class="item" data-command="' + Models.COMMAND_TYPES.return + '"><i class="reply icon"></i> ' + LocalizedStrings.getUI('text_btn_return') + '</a>'
  738. + '</div></div></div>';
  739. appender += '<div class="function_signature_div">' + LocalizedStrings.getUI("function") + ' ';
  740. if (function_obj.is_main) {
  741. 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> '
  742. + '( <div class="ui large labels parameters_list">';
  743. } else {
  744. appender += '<div class="ui function_return"></div>';
  745. appender += '<div class="function_name_div function_name_div_updated"><span class="span_name_function name_function_updated">' + function_obj.name + '</span> </div> '
  746. + ' <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">';
  747. $('.functions_labels').append(generateMenuButton(function_obj));
  748. console.log("aqui");
  749. //var menu_button = $('.functions_labels > [data-function=' + function_obj.name + ']');
  750. //var params = "";
  751. //menu_button
  752. }
  753. appender += '</div> ) </div>'
  754. + (function_obj.is_hidden ? ' <div class="function_area" style="display: none;"> ' : ' <div class="function_area"> ')
  755. + '<div class="ui top attached segment variables_list_div">'
  756. /*+ renderVariables(function_obj, sequence)*/
  757. + '</div>'
  758. + '<div class="ui bottom attached segment commands_list_div" id="function_drag_cmd_">';
  759. appender += '</div>';
  760. appender += '<div class="function_close_div"></div>'
  761. + '</div>'
  762. + '</div>';
  763. appender = $(appender);
  764. $('.all_functions').append(appender);
  765. appender.data('fun', function_obj);
  766. appender.find('.commands_list_div')
  767. .data('fun', function_obj)
  768. .attr('droppable', true)
  769. .on('dragenter', function (e) {
  770. e.preventDefault();
  771. console.log('dragenter');
  772. console.log(e.target)
  773. $(e.target).addClass('div-over')
  774. //e.stopPropagation();
  775. }).on('dragover', function (e) {
  776. e.preventDefault();
  777. })
  778. .on('dragleave', function (e) {
  779. e.preventDefault();
  780. //e.stopPropagation();
  781. console.log("dragleave")
  782. $(e.target).removeClass('div-over')
  783. console.log(e.target)
  784. })
  785. .on('drop', function (e, bundle) {
  786. e.preventDefault();
  787. if (bundle) {
  788. e.clientX = bundle.clientX;
  789. e.clientY = bundle.clientY;
  790. }
  791. //console.log('ondrop ' + e.originalEvent.dataTransfer.getData("text"));
  792. console.log(e)
  793. $(e.target).removeClass('div-over')
  794. //var data = JSON.parse(e.originalEvent.dataTransfer.getData("text"));
  795. var data = program_obj.dataTransfer;
  796. if (data.type == 'command')
  797. CommandsManagement.prepareManageCommand(function_obj, $(e.target).closest('.function_div'), e, data.content);
  798. else if (data.type == 'var')
  799. CommandsManagement.prepareManageCommand(function_obj, $(e.target).closest('.function_div'), e, "attribution", data.content);
  800. else {
  801. if (!data.content.parameters_list)
  802. data.content.parameters_list = [];
  803. CommandsManagement.prepareManageCommand(function_obj, $(e.target).closest('.function_div'), e, "functioncall", data.content);
  804. }
  805. //program_obj.dataTransfer;
  806. }).on('click', function (e) {
  807. if (window.ghostNode) {
  808. console.log("drop click");
  809. $(document).off('mousemove');
  810. $(window.ghostNode).remove();
  811. $(this).trigger('drop', [e]);
  812. $('.div-over').removeClass('div-over');
  813. delete window.ghostNode;
  814. }
  815. })
  816. .on('mouseover', function (evt) {
  817. if (window.ghostNode) {
  818. evt.type = 'dragenter';
  819. //$(this).trigger('dragenter');
  820. console.log('mouseover');
  821. $(this).trigger(evt);
  822. }
  823. })
  824. .on('mouseout', function (evt) {
  825. //$(this).trigger('dragleave');
  826. if (window.ghostNode) {
  827. evt.type = 'dragleave';
  828. console.log('mouseout');
  829. $(this).trigger(evt);
  830. }
  831. });
  832. renderFunctionReturn(function_obj, appender);
  833. addHandlers(function_obj, appender);
  834. // Rendering parameters:
  835. for (var j = 0; j < function_obj.parameters_list.length; j++) {
  836. renderParameter(function_obj, function_obj.parameters_list[j], appender);
  837. }
  838. // Rendering variables:
  839. for (var j = 0; j < function_obj.variables_list.length; j++) {
  840. VariablesManagement.renderVariable(appender, function_obj.variables_list[j], function_obj);
  841. }
  842. // Rendering commands:
  843. for (var j = 0; j < function_obj.commands.length; j++) {
  844. CommandsManagement.renderCommand(function_obj.commands[j], $(appender.find('.commands_list_div')[0]), 3, function_obj);
  845. }
  846. console.log('kk')
  847. console.log($($('.function_div')[0]).data('fun'))
  848. console.log(appender.data('fun'))
  849. }
  850. initVisualUI = function () {
  851. // MUST USE CONST, LET, OR VAR !!!!!!
  852. const mainDiv = $('#visual-main-div');
  853. // fill mainDiv with functions and globals...
  854. // renderAlgorithm()...
  855. $('.add_function_button').on('click', () => {
  856. addFunctionHandler();
  857. });
  858. $('.add_global_button').on('click', () => {
  859. GlobalsManagement.addGlobal(program);
  860. });
  861. $('.run_button').on('click', () => {
  862. runCode();
  863. });
  864. $('.visual_coding_button').on('click', () => {
  865. toggleVisualCoding();
  866. });
  867. $('.textual_coding_button').on('click', () => {
  868. toggleTextualCoding();
  869. });
  870. $('.assessment').on('click', () => {
  871. runCodeAssessment();
  872. is_iassign = true;
  873. });
  874. $('.div_toggle_console').on('click', () => {
  875. toggleConsole();
  876. });
  877. var commands = [
  878. { type: Models.COMMAND_TYPES.break, icon: "stop", text: LocalizedStrings.getUI('text_break') },
  879. { type: Models.COMMAND_TYPES.reader, icon: "download", text: LocalizedStrings.getUI('text_read_var') },
  880. { type: Models.COMMAND_TYPES.writer, icon: "upload", text: LocalizedStrings.getUI('text_write_var') },
  881. { type: Models.COMMAND_TYPES.comment, icon: "quote left", text: LocalizedStrings.getUI('text_comment') },
  882. { type: Models.COMMAND_TYPES.attribution, icon: "arrow left", text: LocalizedStrings.getUI('text_attribution') },
  883. //{type: Models.COMMAND_TYPES.functioncall, icon: "hand point right", text: LocalizedStrings.getUI('text_functioncall')},
  884. { type: Models.COMMAND_TYPES.iftrue, icon: "random", text: LocalizedStrings.getUI('text_iftrue') },
  885. { type: Models.COMMAND_TYPES.repeatNtimes, icon: "sync", text: LocalizedStrings.getUI('text_repeatNtimes') },
  886. { type: Models.COMMAND_TYPES.whiletrue, icon: "sync", text: LocalizedStrings.getUI('text_whiletrue') },
  887. { type: Models.COMMAND_TYPES.dowhiletrue, icon: "sync", text: LocalizedStrings.getUI('text_dowhiletrue') },
  888. { type: Models.COMMAND_TYPES.switch, icon: "list", text: LocalizedStrings.getUI('text_switch') }
  889. ];
  890. for (var i = 0; i < commands.length; i++) {
  891. 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>';
  892. command = $(command);
  893. command.on('dragstart', function (evt) {
  894. //evt.originalEvent.dataTransfer.setData("text",$(this).data('command'));
  895. //evt.originalEvent.dataTransfer.setData("text",JSON.stringify({type:"command",content:$(this).data('command')}));
  896. program_obj.dataTransfer = { type: "command", content: $(this).data('command') };
  897. console.log('dragstart')
  898. console.log(evt);
  899. });
  900. command.on('click', function (evt) {
  901. $(this).trigger('dragstart');
  902. if(window.ghostNode) {
  903. $(window.ghostNode).remove();
  904. $(document).off('mousemove');
  905. }
  906. window.ghostNode = $(this).clone();
  907. ghostNode.outerWidth($(this).outerWidth());
  908. ghostNode.draggable().appendTo('body');
  909. ghostNode.css('position', 'absolute');
  910. ghostNode.css('left', evt.pageX);
  911. ghostNode.css('top', evt.pageY);
  912. evt.type = 'drag';
  913. evt.target = ghostNode[0];
  914. ghostNode.trigger(evt);
  915. $(document).on('mousemove', function (evt) {
  916. ghostNode.css('left', evt.pageX);
  917. ghostNode.css('top', evt.pageY);
  918. });
  919. });
  920. $('.list-commands').prepend(command);
  921. }
  922. /*
  923. $(document).on('mousemove',function(evt) {
  924. if (typeof ghostNode !== 'undefined') {
  925. ghostNode.css('left', evt.pageX - 15);
  926. ghostNode.css('top', evt.pageY - 15);
  927. }
  928. });*/
  929. var library_labels = $('.library_labels');
  930. for (var i = 0; i < system_functions.length; i++) {
  931. var system_button = generateMenuButton(system_functions[i]);
  932. var category = system_functions[i].category;
  933. var cat_accord = null;
  934. if (library_labels.find('.' + category).length == 0) {
  935. cat_accord =
  936. '<div class="ui styled accordion ' + category + '"> \
  937. <div class="title"> \
  938. <i class="dropdown icon"></i> \
  939. ' + LocalizedStrings.getUI(category) + ' \
  940. </div> \
  941. <div class="content"><div>';
  942. library_labels.append(cat_accord);
  943. }
  944. cat_accord = $(library_labels.find('.' + category)[0]);
  945. cat_accord.find('.content').append(system_button);
  946. }
  947. $('.accordion').accordion();
  948. }
  949. /*
  950. renderParameter = function(function_obj, parameter_obj, function_container) {
  951. var ret = "";
  952. 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>';
  953. ret += '<div class="ui dropdown parameter_type">';
  954. if (parameter_obj.dimensions > 0) {
  955. ret += '<div class="text">'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(parameter_obj.type);
  956. ret += '</div>';
  957. } else {
  958. ret += '<div class="text">'+LocalizedStrings.getUI(parameter_obj.type)+'</div>';
  959. }
  960. ret += '<i class="dropdown icon"></i>'
  961. + '<div class="menu">';
  962. for (var tm in Types) {
  963. if (tm == Types.VOID.toUpperCase()) {
  964. continue;
  965. }
  966. ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
  967. }
  968. for (var tm in Types) {
  969. if (tm == Types.VOID.toUpperCase()) {
  970. continue;
  971. }
  972. ret += '<div class="item">'
  973. + '<i class="dropdown icon"></i>'
  974. + LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())
  975. + '<div class="menu">'
  976. + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1">[ ]</div>'
  977. + '<div class="item" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] [ ] " data-type="'+tm+'" data-dimensions="2">[ ] [ ] </div>'
  978. + '</div>'
  979. + '</div>';
  980. }
  981. ret += '</div></div>';
  982. ret += ' <i class="red icon times remove_parameter"></i></div>';
  983. ret = $(ret);
  984. function_container.find('.container_parameters_list').append(ret);
  985. ret.find('.remove_parameter').on('click', function(e){
  986. removeParameter(function_obj, parameter_obj, ret);
  987. });
  988. ret.find('.ui.dropdown.parameter_type').dropdown({
  989. onChange: function(value, text, $selectedItem) {
  990. if ($($selectedItem).data('dimensions')) {
  991. updateParameterType(parameter_obj, Types[$($selectedItem).data('type')], $($selectedItem).data('dimensions'));
  992. } else {
  993. updateParameterType(parameter_obj, Types[$($selectedItem).data('type')]);
  994. }
  995. }
  996. });
  997. ret.find('.label_enable_name_parameter').on('click', function(e){
  998. enableNameParameterUpdate(parameter_obj, ret);
  999. });
  1000. }
  1001. enableNameFunctionUpdate = function(function_obj, parent_node) {
  1002. if (opened_name_function) {
  1003. $(opened_input).focus();
  1004. return;
  1005. }
  1006. $(parent_node).find('.span_name_function').text('');
  1007. $( "<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'));
  1008. $('.width-dynamic').on('input', function() {
  1009. var inputWidth = $(this).textWidth()+10;
  1010. opened_input = this;
  1011. $(this).focus();
  1012. var tmpStr = $(this).val();
  1013. $(this).val('');
  1014. $(this).val(tmpStr);
  1015. $(this).css({
  1016. width: inputWidth
  1017. })
  1018. }).trigger('input');
  1019. $('.width-dynamic').focusout(function() {
  1020. /// update array:
  1021. if ($(this).val().trim()) {
  1022. function_obj.name = $(this).val().trim();
  1023. }
  1024. $(this).remove();
  1025. $(parent_node).find('.span_name_function').text(function_obj.name);
  1026. /// update elements:
  1027. opened_name_function = false;
  1028. opened_input = false;
  1029. });
  1030. $('.width-dynamic').on('keydown', function(e) {
  1031. var code = e.keyCode || e.which;
  1032. if(code == 13) {
  1033. $('.functions_labels > [data-function=' + function_obj.name + ']')
  1034. .attr('data-function', $(this).val().trim())
  1035. .html('<i class="list icon"></i> ' + $(this).val().trim());
  1036. if ($(this).val().trim()) {
  1037. function_obj.name = $(this).val().trim();
  1038. }
  1039. $(this).remove();
  1040. $(parent_node).find('.span_name_function').text(function_obj.name);
  1041. /// update elements:
  1042. opened_name_function = false;
  1043. opened_input = false;
  1044. }
  1045. if(code == 27) {
  1046. $(this).remove();
  1047. $(parent_node).find('.span_name_function').text(function_obj.name);
  1048. /// update elements:
  1049. opened_name_function = false;
  1050. opened_input = false;
  1051. }
  1052. });
  1053. }
  1054. addParameter = function (function_obj, function_container) {
  1055. if (function_obj.parameters_list == null) {
  1056. function_obj.parameters_list = [];
  1057. }
  1058. var new_parameter = new Models.Variable(Types.INTEGER, LocalizedStrings.getUI("new_parameter") + "_" + counter_new_parameters);
  1059. new_parameter.function_obj = function_obj;
  1060. function_obj.parameters_list.push(new_parameter);
  1061. counter_new_parameters ++;
  1062. renderParameter(function_obj, new_parameter, function_container);
  1063. //updateMenuButton(function_obj);
  1064. }
  1065. removeParameter = function (function_obj, parameter_obj, parameter_container) {
  1066. var index = function_obj.parameters_list.indexOf(parameter_obj);
  1067. if (index > -1) {
  1068. function_obj.parameters_list.splice(index, 1);
  1069. }
  1070. $(parameter_container).remove();
  1071. }*/
  1072. /*
  1073. updateReturnType = function (function_obj, new_type, new_dimensions = 0) {
  1074. function_obj.return_type = new_type;
  1075. function_obj.return_dimensions = new_dimensions;
  1076. var menu_button = $('.functions_labels > [data-function=' + function_obj.name + ']');
  1077. menu_button.find('.function_return_type').text(LocalizedStrings.getUI(new_type));
  1078. }*/
  1079. /*
  1080. updateParameterType = function (parameter_obj, new_type, new_dimensions = 0) {
  1081. parameter_obj.type = new_type;
  1082. parameter_obj.dimensions = new_dimensions;
  1083. if (new_dimensions > 0) {
  1084. parameter_obj.rows = new_dimensions;
  1085. parameter_obj.columns = 2;
  1086. }
  1087. //updateMenuButton(parameter_obj.function_obj);
  1088. }*/