attribution.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. import $ from 'jquery';
  2. import { Types } from '../types';
  3. import * as Models from '../ivprog_elements';
  4. import { LocalizedStrings } from '../../services/localizedStringsService';
  5. import * as GlobalsManagement from '../globals';
  6. import * as VariablesManagement from '../variables';
  7. import * as VariableValueMenu from './variable_value_menu';
  8. import * as VariableValueMenuManagement from './variable_value_menu';
  9. import * as CommandsManagement from '../commands';
  10. import * as ExpressionManagement from './generic_expression';
  11. export function createFloatingCommand () {
  12. return $('<div class="ui attribution created_element"> <i class="ui icon small arrow left"></i> <span> x = 1 + 1 </span></div>');
  13. }
  14. export function renderCommand (command, function_obj) {
  15. var el = $('<div class="ui attribution command_container"><i class="ui icon small arrow left command_drag"></i> <i class="ui icon times red button_remove_command"></i> <div class="var_attributed"></div> <span class="text_attr_receives span_command_spec">'+LocalizedStrings.getUI('text_receives')+'</span> '
  16. + '<div class="expression_elements"></div> </div>');
  17. el.data('command', command);
  18. VariableValueMenu.renderMenu(command, command.variable, el.find('.var_attributed'), function_obj);
  19. if (!command.expression || command.expression.length < 1) {
  20. var exp = new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true);
  21. command.expression.push(exp);
  22. }
  23. addHandlers(command, function_obj, el);
  24. ExpressionManagement.renderExpression(command, function_obj, el.find('.expression_elements'), command.expression);
  25. //renderExpressionElements(command, function_obj, el);
  26. return el;
  27. }
  28. export function manageExpressionElements (command, ref_object, dom_object, menu_var_or_value, function_obj, selectedItem, expression_element) {
  29. var index_to_move = expression_element.itens.indexOf(ref_object);
  30. switch (selectedItem.data('exp')) {
  31. case Models.EXPRESSION_ELEMENTS.exp_op_exp:
  32. var exp = new Models.ExpressionElement(Models.EXPRESSION_ELEMENTS.exp_op_exp, [expression_element.itens[index_to_move],
  33. Models.ARITHMETIC_TYPES.plus,
  34. new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true)]);
  35. expression_element.itens[index_to_move] = exp;
  36. break;
  37. case Models.EXPRESSION_ELEMENTS.op_exp:
  38. var exp = new Models.ExpressionElement(Models.EXPRESSION_ELEMENTS.op_exp, [Models.ARITHMETIC_TYPES.plus,
  39. expression_element.itens[index_to_move] ]);
  40. expression_element.itens[index_to_move] = exp;
  41. break;
  42. case Models.EXPRESSION_ELEMENTS.par_exp_par:
  43. var exp = new Models.ExpressionElement(Models.EXPRESSION_ELEMENTS.par_exp_par, [expression_element.itens[index_to_move]]);
  44. expression_element.itens[index_to_move] = exp;
  45. break;
  46. }
  47. renderExpressionElements(command, function_obj, dom_object);
  48. }
  49. function renderExpressionElements (command, function_obj, el) {
  50. var expression_div = el.find('.expression_elements');
  51. var command_container;
  52. if (el.hasClass("command_container") == false) {
  53. var hier = el.parentsUntil(".command_container");
  54. for (var i = 0; i < hier.length; i++) {
  55. if ($(hier[i]).hasClass("command_container")) {
  56. command_container = $(hier[i]);
  57. break;
  58. }
  59. if ($(hier[i]).hasClass("expression_elements")) {
  60. expression_div = $(hier[i]);
  61. break;
  62. }
  63. }
  64. }
  65. if (command_container) {
  66. expression_div = command_container.find('.expression_elements');
  67. }
  68. expression_div.text('');
  69. for (var i = 0; i < command.expression.length; i++) {
  70. var temp = $('<div class="expression_element"></div>');
  71. temp.data('ref_element', command.expression[i]);
  72. temp.data('ref_index', i);
  73. expression_div.append(temp);
  74. renderElement(command, function_obj, temp, command.expression[i]);
  75. }
  76. }
  77. function renderOperator (command, function_obj, temp_op, expression_element, index_op) {
  78. var context_menu = '<div class="ui dropdown"><div class="text">';
  79. switch (expression_element.itens[index_op]) {
  80. case Models.ARITHMETIC_TYPES.plus:
  81. context_menu += '+';
  82. break;
  83. case Models.ARITHMETIC_TYPES.minus:
  84. context_menu += '-';
  85. break;
  86. case Models.ARITHMETIC_TYPES.multiplication:
  87. context_menu += '*';
  88. break;
  89. case Models.ARITHMETIC_TYPES.division:
  90. context_menu += '/';
  91. break;
  92. case Models.ARITHMETIC_TYPES.module:
  93. context_menu += '%';
  94. break;
  95. case Models.ARITHMETIC_TYPES.none:
  96. context_menu += '...';
  97. break;
  98. }
  99. context_menu += '</div><div class="menu">';
  100. context_menu += '<div class="item" data-value="'+Models.ARITHMETIC_TYPES.plus+'">+</div>';
  101. context_menu += '<div class="item" data-value="'+Models.ARITHMETIC_TYPES.minus+'">-</div>';
  102. context_menu += '<div class="item" data-value="'+Models.ARITHMETIC_TYPES.multiplication+'">*</div>';
  103. context_menu += '<div class="item" data-value="'+Models.ARITHMETIC_TYPES.division+'">/</div>';
  104. context_menu += '<div class="item" data-value="'+Models.ARITHMETIC_TYPES.module+'">%</div>';
  105. context_menu += '<div class="item" data-value="'+Models.ARITHMETIC_TYPES.none+'" data-text="...">Nenhum</div>';
  106. context_menu += '</div></div>';
  107. context_menu = $(context_menu);
  108. temp_op.append(context_menu);
  109. context_menu.dropdown({
  110. onChange: function(value, text, $selectedItem) {
  111. expression_element.itens[index_op] = value;
  112. }
  113. });
  114. }
  115. function renderMenuAddExpression (command, function_obj, el, dom_append_menu, expression_append_new_expression) {
  116. if (el.hasClass("command_container") == false) {
  117. var hier = el.parentsUntil(".commands_list_div");
  118. for (var i = 0; i < hier.length; i++) {
  119. if ($(hier[i]).hasClass("command_container")) {
  120. el = $(hier[i]);
  121. break;
  122. }
  123. }
  124. }
  125. if (dom_append_menu.hasClass("expression_elements") == false) {
  126. var hier = el.parentsUntil(".commands_list_div");
  127. for (var i = 0; i < hier.length; i++) {
  128. if ($(hier[i]).hasClass("expression_elements")) {
  129. dom_append_menu = $(hier[i]);
  130. break;
  131. }
  132. }
  133. }
  134. var context_menu = '<div class="ui dropdown"><div class="text"></div><i class="ui icon arrow alternate circle right outline"></i><div class="menu">';
  135. context_menu += '<div class="item" data-value="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>';
  136. context_menu += '<div class="item" data-value="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>';
  137. context_menu += '<div class="item" data-value="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>';
  138. context_menu += '</div></div>';
  139. context_menu = $(context_menu);
  140. dom_append_menu.append(context_menu);
  141. context_menu.dropdown({
  142. onChange: function(value, text, $selectedItem) {
  143. switch (value) {
  144. case Models.EXPRESSION_ELEMENTS.exp_op_exp:
  145. var exp = new Models.ExpressionElement(Models.EXPRESSION_ELEMENTS.exp_op_exp, [new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true),
  146. Models.ARITHMETIC_TYPES.plus,
  147. new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true)]);
  148. expression_append_new_expression.push(exp);
  149. break;
  150. case Models.EXPRESSION_ELEMENTS.op_exp:
  151. var exp = new Models.ExpressionElement(Models.EXPRESSION_ELEMENTS.op_exp, [Models.ARITHMETIC_TYPES.plus,
  152. new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true)]);
  153. expression_append_new_expression.push(exp);
  154. break;
  155. case Models.EXPRESSION_ELEMENTS.par_exp_par:
  156. var exp = new Models.ExpressionElement(Models.EXPRESSION_ELEMENTS.par_exp_par, [new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true)]);
  157. expression_append_new_expression.push(exp);
  158. break;
  159. }
  160. renderExpressionElements(command, function_obj, el);
  161. }
  162. });
  163. }
  164. function renderElement (command, function_obj, el, expression_element) {
  165. switch (expression_element.type_exp) {
  166. case Models.EXPRESSION_ELEMENTS.exp_op_exp:
  167. var temp_op = $('<div class="component_element"></div>');
  168. var temp_exp_1 = $('<div class="component_element"></div>');
  169. var temp_exp_2 = $('<div class="component_element"></div>');
  170. el.append(temp_exp_1);
  171. el.append(temp_op);
  172. el.append(temp_exp_2);
  173. if (expression_element.itens[0].type) {
  174. VariableValueMenu.renderMenu(command, expression_element.itens[0], temp_exp_1, function_obj, 2, expression_element);
  175. } else {
  176. renderElement(command, function_obj, temp_exp_1, expression_element.itens[0]);
  177. }
  178. renderOperator(command, function_obj, temp_op, expression_element, 1);
  179. if (expression_element.itens[2].type) {
  180. VariableValueMenu.renderMenu(command, expression_element.itens[2], temp_exp_2, function_obj, 2, expression_element);
  181. } else {
  182. renderElement(command, function_obj, temp_exp_2, expression_element.itens[2]);
  183. }
  184. break;
  185. case Models.EXPRESSION_ELEMENTS.op_exp:
  186. var temp_op = $('<div class="component_element"></div>');
  187. var temp_exp = $('<div class="component_element"></div>');
  188. el.append(temp_op);
  189. el.append(temp_exp);
  190. renderOperator(command, function_obj, temp_op, expression_element, 0);
  191. if (expression_element.itens[1].type) {
  192. VariableValueMenu.renderMenu(command, expression_element.itens[1], temp_exp, function_obj, 2, expression_element);
  193. } else {
  194. renderElement(command, function_obj, temp_exp, expression_element.itens[1]);
  195. }
  196. break;
  197. case Models.EXPRESSION_ELEMENTS.par_exp_par:
  198. var temp_par_1 = $('<div class="component_element"> ( </div>');
  199. var temp_exp = $('<div class="component_element"></div>');
  200. var temp_par_2 = $('<div class="component_element"> ) </div>');
  201. el.append(temp_par_1);
  202. el.append(temp_exp);
  203. for (var j = 0; j < expression_element.itens.length; j++) {
  204. if (expression_element.itens[j].type) {
  205. VariableValueMenu.renderMenu(command, expression_element.itens[j], temp_exp, function_obj, 2, expression_element);
  206. } else {
  207. renderElement(command, function_obj, temp_exp, expression_element.itens[j]);
  208. }
  209. }
  210. //renderMenuAddExpression(command, function_obj, el, el, expression_element.itens);
  211. el.append(temp_par_2);
  212. break;
  213. }
  214. }
  215. function renderExpression (command, function_obj, el) {
  216. var expression_div = el.find('.expression_elements');
  217. expression_div.text('');
  218. var menu_add_item = $('<div class="menu_add_item"></div>');
  219. menu_add_item.data('index_add', 0);
  220. expression_div.append(menu_add_item);
  221. for (var i = 0; i < command.expression.length; i++) {
  222. if (command.expression[i].type) {
  223. var temp = $('<div class="expression_element"></div>');
  224. temp.data('ref_element', command.expression[i]);
  225. temp.data('ref_index', i);
  226. expression_div.append(temp);
  227. VariableValueMenu.renderMenu(command, command.expression[i], temp, function_obj);
  228. } else if (command.expression[i] == "(" || command.expression[i] == ")") {
  229. var temp = $('<div class="expression_element">'+command.expression[i]+'</div>');
  230. temp.data('ref_element', command.expression[i]);
  231. temp.data('ref_index', i);
  232. expression_div.append(temp);
  233. } else {
  234. var temp = '<div class="expression_element">';
  235. switch(command.expression[i]) {
  236. case Models.ARITHMETIC_TYPES.plus:
  237. temp += '+';
  238. break;
  239. case Models.ARITHMETIC_TYPES.minus:
  240. temp += '-';
  241. break;
  242. case Models.ARITHMETIC_TYPES.multiplication:
  243. temp += '*';
  244. break;
  245. case Models.ARITHMETIC_TYPES.division:
  246. temp += '/';
  247. break;
  248. case Models.ARITHMETIC_TYPES.module:
  249. temp += '%';
  250. break;
  251. }
  252. temp += '</div>';
  253. temp = $(temp);
  254. temp.data('ref_element', command.expression[i]);
  255. temp.data('ref_index', i);
  256. expression_div.append(temp);
  257. }
  258. var menu_add_item_seq = $('<div class="menu_add_item"></div>');
  259. var index_temp = (i + 1);
  260. menu_add_item_seq.data('index_add', index_temp);
  261. expression_div.append(menu_add_item_seq);
  262. }
  263. addMenuItens(command, function_obj, el);
  264. }
  265. function addMenuItens (command, function_obj, expression_div) {
  266. var divs_expression = expression_div.find('.menu_add_item');
  267. for (var i = 0; i < divs_expression.length; i++) {
  268. var temp = $(divs_expression[i]).data('index_add');
  269. var context_menu = '<div class="ui dropdown context_menu_clear"><i class="ui icon plus square outline"></i><div class="menu">';
  270. context_menu += '<div class="item" data-option="value" data-index="'+temp+'">'+LocalizedStrings.getUI('text_value')+'</div>';
  271. context_menu += '<div class="item" data-option="operator" data-index="'+temp+'">'+LocalizedStrings.getUI('text_operator')+'</div>';
  272. context_menu += '<div class="item" data-option="parentheses" data-index="'+temp+'">'+LocalizedStrings.getUI('text_parentheses')+'</div>';
  273. context_menu += '</div></div>';
  274. context_menu = $(context_menu);
  275. $(divs_expression[i]).append(context_menu);
  276. context_menu.dropdown({
  277. on: 'hover',
  278. onChange: function(value, text, $selectedItem) {
  279. switch ($selectedItem.data('option')) {
  280. case "value":
  281. command.expression.splice($selectedItem.data('index'), 0, new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true));
  282. renderExpression(command, function_obj, expression_div);
  283. break;
  284. case "operator":
  285. command.expression.splice($selectedItem.data('index'), 0, Models.ARITHMETIC_TYPES.plus);
  286. renderExpression(command, function_obj, expression_div);
  287. break;
  288. case "parentheses":
  289. command.expression.splice($selectedItem.data('index'), 0, "(");
  290. command.expression.splice($selectedItem.data('index') + 1, 0, new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true));
  291. command.expression.splice($selectedItem.data('index') + 2, 0, ")");
  292. renderExpression(command, function_obj, expression_div);
  293. break;
  294. }
  295. }
  296. });
  297. }
  298. }
  299. function addHandlers (command, function_obj, attribution_dom) {
  300. attribution_dom.find('.button_remove_command').on('click', function() {
  301. if (CommandsManagement.removeCommand(command, function_obj, attribution_dom)) {
  302. attribution_dom.fadeOut(400, function() {
  303. attribution_dom.remove();
  304. });
  305. }
  306. });
  307. attribution_dom.find('.button_refresh_attribution').on('click', function() {
  308. renderExpressionElements(command, function_obj, attribution_dom);
  309. });
  310. }
  311. export function renderMenuOperations (command, ref_object, dom_object, menu_var_or_value, function_obj, variable_selected) {
  312. /*console.log("recebido o seguinte DOM: ");
  313. console.log(dom_object);
  314. if (dom_object.hasClass('var_attributed')) {
  315. return;
  316. } else {
  317. var hier = dom_object.parentsUntil(".command_container");
  318. for (var i = 0; i < hier.length; i++) {
  319. if ($(hier[i]).hasClass('var_attributed') || $(hier[i]).hasClass('parameters_function_called')) {
  320. return;
  321. }
  322. }
  323. }
  324. dom_object.find('.context_menu_clear').remove();
  325. var menu_operations = '<div class="ui dropdown menu_operations"><div class="text"></div><i class="dropdown icon"></i><div class="menu">';
  326. for (var tm in Models.ARITHMETIC_TYPES) {
  327. menu_operations += '<div class="item" data-option="'+tm+'">'+LocalizedStrings.getUI('btn_arithmetic_' + tm)+'</div>';
  328. }
  329. menu_operations += '<div class="item" data-option="clear">'+LocalizedStrings.getUI('btn_clear')+'</div>';
  330. menu_operations += '</div></div>';
  331. menu_operations = $(menu_operations);
  332. dom_object.append(menu_operations);
  333. menu_operations.dropdown({
  334. onChange: function(value, text, $selectedItem) {
  335. switch ($($selectedItem).data('option')) {
  336. case "clear":
  337. $(dom_object).text('');
  338. VariableValueMenu.renderMenu(command, ref_object, dom_object, function_obj);
  339. break;
  340. default:
  341. createExpressionAround(command, ref_object, dom_object, function_obj);
  342. menu_operations.find('.text').text('');
  343. }
  344. }
  345. });*/
  346. }
  347. function createExpressionAround (command, ref_object, dom_object, function_obj) {
  348. $('<span> ( </span>').insertBefore(dom_object);
  349. $('<span> ) </span>').insertAfter(dom_object);
  350. VariableValueMenu.renderMenu(command, new Models.VariableValueMenu(VariableValueMenuManagement.VAR_OR_VALUE_TYPES.all, null, null, null, true), dom_object, function_obj);
  351. }