1
0

variable_value_menu.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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 AttribuitionsManagement from './attribution';
  8. import WatchJS from 'melanke-watchjs';
  9. var watch = WatchJS.watch;
  10. export const VAR_OR_VALUE_TYPES = Object.freeze({only_variable: 1, only_value: 2, only_function: 3, variable_and_function: 4, variable_and_value_opt: 5,
  11. value_and_function: 6, all: 7});
  12. export function renderMenu (command, ref_object, dom_object, function_obj, size_field = 2) {
  13. var menu_var_or_value = '<div class="ui dropdown menu_var_or_value_dom"><div class="text"></div><i class="dropdown icon"></i><div class="menu">';
  14. if ((ref_object.variable_and_value == VAR_OR_VALUE_TYPES.only_function) || (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.variable_and_function)
  15. || (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.value_and_function) || (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.all)) {
  16. menu_var_or_value += '<div class="item" data-option="'+VAR_OR_VALUE_TYPES.only_function+'"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('btn_function')+'</div>';
  17. }
  18. if (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.only_variable) {
  19. menu_var_or_value = '<div class="ui dropdown menu_var_or_value_dom"><div class="text"></div><i class="dropdown icon"></i><div class="menu menu_only_vars">';
  20. menu_var_or_value += '</div>';
  21. }
  22. if ((ref_object.variable_and_value == VAR_OR_VALUE_TYPES.variable_and_function) || (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.variable_and_value_opt) || (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.all)) {
  23. menu_var_or_value += '<div class="item" data-option="'+VAR_OR_VALUE_TYPES.only_variable+'"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('variable');
  24. menu_var_or_value += '<div class="menu menu_only_vars">';
  25. menu_var_or_value += '</div></div>';
  26. }
  27. if (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.only_value) {
  28. menu_var_or_value = '<input type="text" class="width-dynamic" size="'+size_field+'" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" />';
  29. }
  30. if ((ref_object.variable_and_value == VAR_OR_VALUE_TYPES.variable_and_value_opt)
  31. || (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.value_and_function) || (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.all)) {
  32. menu_var_or_value += '<div class="item" data-option="'+VAR_OR_VALUE_TYPES.only_value+'">'+LocalizedStrings.getUI('text_value')+'</div>';
  33. }
  34. menu_var_or_value += '</div></div>';
  35. menu_var_or_value = $(menu_var_or_value);
  36. $(dom_object).append(menu_var_or_value);
  37. addHandlers(command, ref_object, dom_object, menu_var_or_value, function_obj);
  38. addVariablesToMenu(function_obj, menu_var_or_value, ref_object);
  39. }
  40. function addVariablesToMenu (function_obj, menu_var_or_value, ref_object) {
  41. watch(window.program_obj.globals, function(){
  42. addVariablesToMenu(function_obj, menu_var_or_value, ref_object);
  43. }, 1);
  44. watch(function_obj.parameters_list, function(){
  45. addVariablesToMenu(function_obj, menu_var_or_value, ref_object);
  46. }, 1);
  47. watch(function_obj.variables_list, function(){
  48. addVariablesToMenu(function_obj, menu_var_or_value, ref_object);
  49. }, 1);
  50. var sub_menu = $(menu_var_or_value).find('.menu_only_vars');
  51. $(sub_menu).text('');
  52. if (window.program_obj.globals) {
  53. if (ref_object.include_constant) {
  54. for (var i = 0; i < window.program_obj.globals.length; i++) {
  55. var temp = $('<div class="item" data-option="'+VAR_OR_VALUE_TYPES.only_variable+'">' + window.program_obj.globals[i].name + ' </div>');
  56. $(temp).data('variable_reference', window.program_obj.globals[i]);
  57. $(sub_menu).append(temp);
  58. }
  59. } else {
  60. for (var i = 0; i < window.program_obj.globals.length; i++) {
  61. if (!window.program_obj.globals[i].is_constant) {
  62. var temp = $('<div class="item" data-option="'+VAR_OR_VALUE_TYPES.only_variable+'">' + window.program_obj.globals[i].name + ' </div>');
  63. $(temp).data('variable_reference', window.program_obj.globals[i]);
  64. $(sub_menu).append(temp);
  65. }
  66. }
  67. }
  68. }
  69. if (function_obj.parameters_list) {
  70. for (var i = 0; i < function_obj.parameters_list.length; i++) {
  71. var temp = $('<div class="item" data-option="'+VAR_OR_VALUE_TYPES.only_variable+'">' + function_obj.parameters_list[i].name + ' </div>');
  72. $(temp).data('variable_reference', function_obj.parameters_list[i]);
  73. $(sub_menu).append(temp);
  74. }
  75. }
  76. if (function_obj.variables_list) {
  77. for (var i = 0; i < function_obj.variables_list.length; i++) {
  78. var temp = $('<div class="item" data-option="'+VAR_OR_VALUE_TYPES.only_variable+'">' + function_obj.variables_list[i].name + ' </div>');
  79. $(temp).data('variable_reference', function_obj.variables_list[i]);
  80. $(sub_menu).append(temp);
  81. }
  82. }
  83. }
  84. function addHandlers (command, ref_object, dom_object, menu_var_or_value, function_obj) {
  85. if (ref_object.variable_and_value != VAR_OR_VALUE_TYPES.only_value) {
  86. $(menu_var_or_value).dropdown({
  87. onChange: function(value, text, $selectedItem) {
  88. $(dom_object).find('.var_name').remove();
  89. switch ($($selectedItem).data('option')) {
  90. case VAR_OR_VALUE_TYPES.only_function:
  91. console.log("foi função");
  92. break;
  93. case VAR_OR_VALUE_TYPES.only_value:
  94. openInputToValue(command, ref_object, dom_object, menu_var_or_value, function_obj);
  95. break;
  96. case VAR_OR_VALUE_TYPES.only_variable:
  97. openInputToVariable(command, ref_object, dom_object, menu_var_or_value, function_obj, $($selectedItem).data('variable_reference'));
  98. break;
  99. }
  100. }
  101. });
  102. }
  103. $(dom_object).find('.width-dynamic').on('input', function() {
  104. var inputWidth = $(this).textWidth()+10;
  105. $(this).focus();
  106. var tmpStr = $(this).val();
  107. $(this).val('');
  108. $(this).val(tmpStr);
  109. $(this).css({
  110. width: inputWidth
  111. })
  112. }).trigger('input');
  113. }
  114. function openInputToVariable (command, ref_object, dom_object, menu_var_or_value, function_obj, variable_selected) {
  115. $(menu_var_or_value).find('.text').text(' ');
  116. $(dom_object).find('.menu_var_or_value_dom').remove();
  117. var variable_render = '<div class="variable_rendered"> <span class="var_name">'+variable_selected.name+'</span>';
  118. if (variable_selected.dimensions == 1) {
  119. variable_render += ' <span>[ </span> <div class="column_container"></div> <span> ]</span>';
  120. }
  121. if (variable_selected.dimensions == 2) {
  122. variable_render += ' <span>[ </span> <div class="row_container"></div> <span> ]</span> ';
  123. variable_render += ' <span>[ </span> <div class="column_container"></div> <span> ]</span>';
  124. }
  125. variable_render += '</div>';
  126. variable_render = $(variable_render);
  127. $(dom_object).append(variable_render);
  128. if (variable_selected.dimensions == 1) {
  129. var nova_var_menu = new Models.VariableValueMenu(VAR_OR_VALUE_TYPES.all, null, null, null, true);
  130. renderMenu(command, nova_var_menu, $(variable_render).find('.column_container'), function_obj);
  131. }
  132. if (variable_selected.dimensions == 2) {
  133. var nova_var_menu_row = new Models.VariableValueMenu(VAR_OR_VALUE_TYPES.all, null, null, null, true);
  134. renderMenu(command, nova_var_menu_row, $(variable_render).find('.row_container'), function_obj);
  135. var nova_var_menu_column = new Models.VariableValueMenu(VAR_OR_VALUE_TYPES.all, null, null, null, true);
  136. renderMenu(command, nova_var_menu_column, $(variable_render).find('.column_container'), function_obj);
  137. }
  138. var context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">';
  139. context_menu += '<div class="item" data-clear="true">'+LocalizedStrings.getUI('btn_clear')+'</div>';
  140. context_menu += '</div></div>';
  141. context_menu = $(context_menu);
  142. $( context_menu ).insertAfter( $(dom_object).find('.variable_rendered') );
  143. $(context_menu).dropdown({
  144. onChange: function(value, text, $selectedItem) {
  145. if ($($selectedItem).data('clear')) {
  146. $(dom_object).text('');
  147. renderMenu(command, ref_object, dom_object, function_obj);
  148. }
  149. }
  150. });
  151. if (command.type == Models.COMMAND_TYPES.attribution) {
  152. AttribuitionsManagement.renderMenuOperations(command, ref_object, dom_object, menu_var_or_value, function_obj, variable_selected);
  153. }
  154. }
  155. function openInputToValue (command, ref_object, dom_object, menu_var_or_value, function_obj) {
  156. $(menu_var_or_value).find('.text').text(' ');
  157. var field = $('<input type="text" size="2" />');
  158. $( field ).insertBefore($(dom_object).find('.menu_var_or_value_dom'));
  159. field.focus();
  160. $(dom_object).find('.menu_var_or_value_dom').remove();
  161. var context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">';
  162. context_menu += '<div class="item" data-clear="true">'+LocalizedStrings.getUI('btn_clear')+'</div>';
  163. context_menu += '</div></div>';
  164. context_menu = $(context_menu);
  165. $( context_menu ).insertAfter( field );
  166. $(context_menu).dropdown({
  167. onChange: function(value, text, $selectedItem) {
  168. if ($($selectedItem).data('clear')) {
  169. $(dom_object).text('');
  170. renderMenu(command, ref_object, dom_object, function_obj);
  171. }
  172. }
  173. });
  174. if (command.type == Models.COMMAND_TYPES.attribution) {
  175. AttribuitionsManagement.renderMenuOperations(command, ref_object, dom_object, menu_var_or_value, function_obj);
  176. }
  177. }
  178. $.fn.textWidth = function(text, font) {
  179. if (!$.fn.textWidth.fakeEl) $.fn.textWidth.fakeEl = $('<span>').hide().appendTo(document.body);
  180. $.fn.textWidth.fakeEl.text(text || this.val() || this.text() || this.attr('placeholder')).css('font', font || this.css('font'));
  181. return $.fn.textWidth.fakeEl.width();
  182. };