import * as Models from "../ivprog_elements"; import { LocalizedStrings } from "../../services/localizedStringsService"; import * as AttribuitionsManagement from "./attribution"; import * as RepeatNTimesManagement from "./repeatNtimes"; 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, value_and_function: 6, all: 7, }); export function renderMenu ( command, ref_object, dom_object, function_obj, size_field = 2, expression_element ) { // Verificar se o objeto atual trata-se de uma chamada de função e conferir se possui a quantidade correta de parâmetros // Caso não possua, tem que adicionar as variáveis que servirão de parâmetros: if (ref_object.function_called) { if (ref_object.function_called.parameters_list) { while ( ref_object.function_called.parameters_list.length != ref_object.parameters_list.length ) { if ( ref_object.parameters_list.length > ref_object.function_called.parameters_list.length ) { ref_object.parameters_list.pop(); } else { ref_object.parameters_list.push( new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.all, null, null, null, true ) ); } } } } let menu_var_or_value = '<div class="ui dropdown menu_var_or_value_dom" data-varmenu="true"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; if (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.only_variable) { menu_var_or_value = '<div class="ui dropdown menu_var_or_value_dom" data-varmenu="true"><div class="text"></div><i class="dropdown icon"></i><div class="menu menu_only_vars">'; menu_var_or_value += "</div>"; } 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 ) { menu_var_or_value += '<div class="item" data-option="' + VAR_OR_VALUE_TYPES.only_variable + '"><i class="dropdown icon"></i>' + LocalizedStrings.getUI("variable"); menu_var_or_value += '<div class="menu menu_only_vars">'; menu_var_or_value += "</div></div>"; } if (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.only_value) { menu_var_or_value = '<input type="text" class="width-dynamic" size="' + size_field + '" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" />'; } if ( ref_object.variable_and_value == VAR_OR_VALUE_TYPES.variable_and_value_opt || ref_object.variable_and_value == VAR_OR_VALUE_TYPES.value_and_function || ref_object.variable_and_value == VAR_OR_VALUE_TYPES.all ) { menu_var_or_value += '<div class="item" data-option="' + VAR_OR_VALUE_TYPES.only_value + '">' + LocalizedStrings.getUI("text_value") + "</div>"; } if (ref_object.variable_and_value == VAR_OR_VALUE_TYPES.only_function) { menu_var_or_value = '<div class="ui dropdown menu_var_or_value_dom" data-varmenu="true"><div class="text"></div><i class="dropdown icon"></i><div class="menu menu_only_functions">'; menu_var_or_value += "</div>"; } if ( ref_object.variable_and_value == VAR_OR_VALUE_TYPES.variable_and_function || ref_object.variable_and_value == VAR_OR_VALUE_TYPES.value_and_function || ref_object.variable_and_value == VAR_OR_VALUE_TYPES.all ) { menu_var_or_value += '<div class="item" data-option="' + VAR_OR_VALUE_TYPES.only_function + '"><i class="dropdown icon"></i>' + LocalizedStrings.getUI("btn_function"); menu_var_or_value += '<div class="menu menu_only_functions">'; menu_var_or_value += "</div></div>"; /* if (command.type == Models.COMMAND_TYPES.attribution) { menu_var_or_value += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); menu_var_or_value += '<div class="menu">'; menu_var_or_value += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; menu_var_or_value += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; menu_var_or_value += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; menu_var_or_value += '</div></div>'; }*/ } menu_var_or_value += "</div></div>"; menu_var_or_value = $(menu_var_or_value); menu_var_or_value.find('.width-dynamic').on('input', function() { var input_field = $(this); var inputWidth = input_field.textWidth()+10; inputWidth = inputWidth<50?50:inputWidth; input_field.css({ width: inputWidth }) }).trigger('input'); dom_object.append(menu_var_or_value); ref_object.dom_object = menu_var_or_value; addHandlers( command, ref_object, dom_object, menu_var_or_value, function_obj, expression_element ); addVariablesToMenu( function_obj, menu_var_or_value, ref_object, expression_element ); addFunctionsToMenu( function_obj, menu_var_or_value, ref_object, expression_element ); addIVProgFunctionsToMenu( function_obj, menu_var_or_value, ref_object, expression_element ); if (ref_object.content || ref_object.function_called) { if (ref_object.content) { // Verificar se a variável ainda existe: const variable_fun = isVarInProgram(ref_object.content, function_obj); if (variable_fun) { ref_object.content = variable_fun; renderPreviousContent( function_obj, menu_var_or_value, ref_object, dom_object, command, expression_element ); } else { if (ref_object.content && ref_object.content.type) { ref_object.content = null; appendSelectText(ref_object, menu_var_or_value); } else { renderPreviousContent( function_obj, menu_var_or_value, ref_object, dom_object, command, expression_element ); } } } else if (ref_object.function_called) { // Verificar se a função ainda existe: const ret_function = isFunctionInProgram(ref_object.function_called); if (ret_function) { ref_object.function_called = ret_function; renderPreviousContent( function_obj, menu_var_or_value, ref_object, dom_object, command, expression_element ); } else { ref_object.content = null; ref_object.row = null; ref_object.column = null; delete ref_object.function_called; delete ref_object.parameters_list; appendSelectText(ref_object, menu_var_or_value); } } } else { appendSelectText(ref_object, menu_var_or_value); } } function appendSelectText (ref_object, menu_var_or_value) { switch (ref_object.variable_and_value) { case VAR_OR_VALUE_TYPES.only_variable: menu_var_or_value .find(".text") .append("<i>" + LocalizedStrings.getUI("var_menu_select_var") + "</i>"); break; case VAR_OR_VALUE_TYPES.all: menu_var_or_value .find(".text") .append("<i>" + LocalizedStrings.getUI("var_menu_select_all") + "</i>"); break; case VAR_OR_VALUE_TYPES.variable_and_function: menu_var_or_value .find(".text") .append("<i>" + LocalizedStrings.getUI("var_menu_select_all") + "</i>"); break; case VAR_OR_VALUE_TYPES.only_function: menu_var_or_value .find(".text") .append( "<i>" + LocalizedStrings.getUI("var_menu_select_function") + "</i>" ); break; } } function isFunctionInProgram (function_called_obj) { if (function_called_obj.name) { if (window.program_obj.functions) { for (var i = 0; i < window.program_obj.functions.length; i++) { if (window.program_obj.functions[i] == function_called_obj) { return window.program_obj.functions[i]; } } for (var i = 0; i < window.program_obj.functions.length; i++) { if (window.program_obj.functions[i].name == function_called_obj.name) { return window.program_obj.functions[i]; } } } } else if (function_called_obj.identifier) { for (var i = 0; i < window.system_functions.length; i++) { if ( window.system_functions[i].identifier == function_called_obj.identifier ) { return window.system_functions[i]; } } } return null; } function isVarInProgram (var_obj, function_obj) { // Verify in locals: if (function_obj.variables_list) { for (var i = 0; i < function_obj.variables_list.length; i++) { if (function_obj.variables_list[i] == var_obj) { return function_obj.variables_list[i]; } } } // Verify in parameters: if (function_obj.parameters_list) { for (var i = 0; i < function_obj.parameters_list.length; i++) { if (function_obj.parameters_list[i] == var_obj) { return function_obj.parameters_list[i]; } } } // Verify in globals: if (window.program_obj.globals) { for (var i = 0; i < window.program_obj.globals.length; i++) { if (window.program_obj.globals[i] == var_obj) { return window.program_obj.globals[i]; } } } // If not found, verify if the reference was lost if (var_obj) { if (function_obj.variables_list) { for (var i = 0; i < function_obj.variables_list.length; i++) { if (function_obj.variables_list[i].name == var_obj.name) { return function_obj.variables_list[i]; } } } if (function_obj.parameters_list) { for (var i = 0; i < function_obj.parameters_list.length; i++) { if (function_obj.parameters_list[i].name == var_obj.name) { return function_obj.parameters_list[i]; } } } if (window.program_obj.globals) { for (var i = 0; i < window.program_obj.globals.length; i++) { if (window.program_obj.globals[i].name == var_obj.name) { return window.program_obj.globals[i]; } } } } return null; } function renderPreviousContent ( function_obj, menu_var_or_value, ref_object, dom_object, command, expression_element ) { if (ref_object.function_called) { menu_var_or_value.remove(); variableValueMenuCode( command, ref_object, dom_object, function_obj, menu_var_or_value, expression_element ); } else if (ref_object.content.type) { menu_var_or_value.remove(); variableValueMenuCode( command, ref_object, dom_object, function_obj, menu_var_or_value, expression_element ); } else { menu_var_or_value.remove(); variableValueMenuCode( command, ref_object, dom_object, function_obj, menu_var_or_value, expression_element ); } } function variableValueMenuCode ( command, variable_obj, dom_object, function_obj, menu_var_or_value, expression_element ) { if (variable_obj.content || variable_obj.function_called) { // Verificar se a variável ainda existe: const var_fun = isVarInProgram(variable_obj.content, function_obj); if (var_fun) { variable_obj.content = var_fun; } else { if (variable_obj.content && variable_obj.content.type) { variable_obj.content = null; appendSelectText(variable_obj, menu_var_or_value); } } } else { appendSelectText(variable_obj, menu_var_or_value); } if (variable_obj.content == null && variable_obj.function_called == null) { renderMenu( command, variable_obj, dom_object, function_obj, 2, expression_element ); return; } const ret = ""; if (variable_obj.function_called) { if ( variable_obj.function_called.parameters_list == null || variable_obj.function_called.length == 0 ) { menu_var_or_value.find(".text").text(" "); dom_object.find(".menu_var_or_value_dom").remove(); var parameters_menu; if (variable_obj.function_called.name) { parameters_menu = '<div class="parameters_function_called"> ' + variable_obj.function_called.name + " <span> ( </span>"; } else { parameters_menu = '<div class="parameters_function_called"> <i>' + LocalizedStrings.translateInternalFunction( variable_obj.function_called.identifier, variable_obj.function_called.category ) + "</i> <span> ( </span>"; } parameters_menu += "<span> ) </span></div>"; parameters_menu = $(parameters_menu); dom_object.append(parameters_menu); var context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution) { context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); context_menu.insertAfter(dom_object.find(".parameters_function_called")); context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); variable_obj.content = null; variable_obj.row = null; variable_obj.column = null; delete variable_obj.function_called; delete variable_obj.parameters_list; renderMenu( command, variable_obj, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, variable_obj, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); } else { menu_var_or_value.find(".text").text(" "); dom_object.find(".menu_var_or_value_dom").remove(); var parameters_menu; if (variable_obj.function_called.name) { parameters_menu = '<div class="parameters_function_called"> ' + variable_obj.function_called.name + " <span> ( </span>"; } else { parameters_menu = '<div class="parameters_function_called"> <i>' + LocalizedStrings.translateInternalFunction( variable_obj.function_called.identifier, variable_obj.function_called.category ) + "</i> <span> ( </span>"; } for ( let j = 0; j < variable_obj.function_called.parameters_list.length; j++ ) { parameters_menu += '<div class="render_style_param parameter_' + j + '"></div>'; if (j + 1 != variable_obj.function_called.parameters_list.length) { parameters_menu += " , "; } } parameters_menu += "<span> ) </span></div>"; parameters_menu = $(parameters_menu); dom_object.append(parameters_menu); for ( let j = 0; j < variable_obj.function_called.parameters_list.length; j++ ) { renderMenu( command, variable_obj.parameters_list[j], parameters_menu.find(".parameter_" + j), function_obj, 2, expression_element ); } let context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution) { context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); context_menu.insertAfter(parameters_menu); context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); variable_obj.content = null; variable_obj.row = null; variable_obj.column = null; delete variable_obj.function_called; delete variable_obj.parameters_list; renderMenu( command, variable_obj, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, variable_obj, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); } } else if (variable_obj.content.type) { let variable_render = ""; if (variable_obj.content.dimensions == 1 && variable_obj.dimensions != 1) { variable_render = '<div class="variable_rendered"> <span class="var_name">' + variable_obj.content.name + "</span>"; variable_render += ' <span>[ </span> <div class="column_container"></div> <span> ]</span>'; variable_render += "</div>"; variable_render = $(variable_render); dom_object.append(variable_render); let context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution) { context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); variable_render.append(context_menu); context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); variable_obj.content = null; variable_obj.row = null; variable_obj.column = null; delete variable_obj.function_called; delete variable_obj.parameters_list; renderMenu( command, variable_obj, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, variable_obj, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); if (!variable_obj.column) { variable_obj.column = new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.all, null, null, null, true ); } variableValueMenuCode( command, variable_obj.column, $(variable_render.find(".column_container")), function_obj, menu_var_or_value, expression_element ); } else if ( variable_obj.content.dimensions == 2 && variable_obj.dimensions != 2 ) { variable_render = '<div class="variable_rendered"> <span class="var_name">' + variable_obj.content.name + "</span>"; variable_render += ' <span>[ </span> <div class="row_container"></div> <span> ]</span>'; variable_render += ' <span>[ </span> <div class="column_container"></div> <span> ] </span>'; variable_render += "</div>"; variable_render = $(variable_render); dom_object.append(variable_render); let context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution) { context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); variable_render.append(context_menu); context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); variable_obj.content = null; variable_obj.row = null; variable_obj.column = null; delete variable_obj.function_called; delete variable_obj.parameters_list; renderMenu( command, variable_obj, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, variable_obj, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); if (!variable_obj.column) { variable_obj.column = new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.all, null, null, null, true ); } if (!variable_obj.row) { variable_obj.row = new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.all, null, null, null, true ); } variableValueMenuCode( command, variable_obj.row, $(variable_render.find(".row_container")), function_obj, menu_var_or_value, expression_element ); variableValueMenuCode( command, variable_obj.column, $(variable_render.find(".column_container")), function_obj, menu_var_or_value, expression_element ); } else { variable_render = '<div class="variable_rendered"> <span class="var_name">' + variable_obj.content.name + "</span>"; variable_render += "</div>"; variable_render = $(variable_render); dom_object.append(variable_render); let context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution && !dom_object.hasClass('var_attributed')) { console.log('dom_object6'); console.log(dom_object); context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); variable_render.append(context_menu); context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); variable_obj.content = null; variable_obj.row = null; variable_obj.column = null; delete variable_obj.function_called; delete variable_obj.parameters_list; renderMenu( command, variable_obj, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, variable_obj, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); } } else { let variable_render; variable_render = '<div class="variable_rendered"> <span class="var_name">'; if (isNaN(variable_obj.content)) { variable_render += variable_obj.content.replaceAll(" ", " "); } else { variable_render += variable_obj.content; } variable_render += "</span>"; variable_render += "</div>"; variable_render = $(variable_render); dom_object.append(variable_render); var context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution) { context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); if (variable_obj.variable_and_value != VAR_OR_VALUE_TYPES.only_value) { context_menu.insertAfter(variable_render); } context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); variable_obj.content = null; variable_obj.row = null; variable_obj.column = null; delete variable_obj.function_called; delete variable_obj.parameters_list; dom_object.find(".value_rendered").remove(); dom_object.find(".context_menu_clear").remove(); dom_object.find(".width-dynamic-minus").remove(); renderMenu( command, variable_obj, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, variable_obj, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); variable_render.on("click", function (e) { variable_render.remove(); variable_render.empty(); variable_render.remove(); dom_object.empty(); dom_object.append('<span class="menu_var_or_value_dom"> </span>'); openInputToValue( command, variable_obj, dom_object, menu_var_or_value, function_obj, expression_element ); }); } } function addIVProgFunctionsToMenu ( function_obj, menu_var_or_value, ref_object, expression_element ) { const sub_menu = menu_var_or_value.find(".menu_only_functions"); sub_menu.append( '<div class="divider"></div><div class="header">' + LocalizedStrings.getUI("text_header_ivprog_functions") + "</div>" ); sub_menu.append( '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI("text_menu_functions_math") + '<div class="menu menu_math_functions"></div></div>' ); sub_menu.append( '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI("text_menu_functions_text") + '<div class="menu menu_text_functions"></div></div>' ); sub_menu.append( '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI("text_menu_functions_array") + '<div class="menu menu_arrangement_functions"></div></div>' ); sub_menu.append( '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI("text_menu_functions_conversion") + '<div class="menu menu_conversion_functions"></div></div>' ); // Insert Math functions: for (let i = 0; i < window.system_functions.length; i++) { const t = $('<div class="item"></div>'); t.data("function_reference", window.system_functions[i]); t.data("option", VAR_OR_VALUE_TYPES.only_function); t.text( LocalizedStrings.translateInternalFunction( window.system_functions[i].identifier ) ); switch (window.system_functions[i].category) { case Models.SYSTEM_FUNCTIONS_CATEGORIES.math: sub_menu.find(".menu_math_functions").append(t); break; case Models.SYSTEM_FUNCTIONS_CATEGORIES.text: sub_menu.find(".menu_text_functions").append(t); break; case Models.SYSTEM_FUNCTIONS_CATEGORIES.arrangement: sub_menu.find(".menu_arrangement_functions").append(t); break; case Models.SYSTEM_FUNCTIONS_CATEGORIES.conversion: sub_menu.find(".menu_conversion_functions").append(t); break; } } } function addFunctionsToMenu ( function_obj, menu_var_or_value, ref_object, expression_element ) { const sub_menu = menu_var_or_value.find(".menu_only_functions"); sub_menu.text(""); for (let i = 0; i < window.program_obj.functions.length; i++) { const temp = $( '<div class="item" data-option="' + VAR_OR_VALUE_TYPES.only_function + '">' + window.program_obj.functions[i].name + " </div>" ); temp.data("function_reference", window.program_obj.functions[i]); sub_menu.append(temp); } } function addVariablesToMenu ( function_obj, menu_var_or_value, ref_object, expression_element ) { const sub_menu = menu_var_or_value.find(".menu_only_vars"); sub_menu.text(""); let is_there = false; if (window.program_obj.globals) { if (ref_object.include_constant) { for (var i = 0; i < window.program_obj.globals.length; i++) { var temp = $( '<div class="item" data-option="' + VAR_OR_VALUE_TYPES.only_variable + '">' + window.program_obj.globals[i].name + " </div>" ); temp.data("variable_reference", window.program_obj.globals[i]); sub_menu.append(temp); is_there = true; } } else { for (var i = 0; i < window.program_obj.globals.length; i++) { if (!window.program_obj.globals[i].is_constant) { var temp = $( '<div class="item" data-option="' + VAR_OR_VALUE_TYPES.only_variable + '">' + window.program_obj.globals[i].name + " </div>" ); temp.data("variable_reference", window.program_obj.globals[i]); sub_menu.append(temp); is_there = true; } } } } if (function_obj.parameters_list) { for (var i = 0; i < function_obj.parameters_list.length; i++) { var temp = $( '<div class="item" data-option="' + VAR_OR_VALUE_TYPES.only_variable + '">' + function_obj.parameters_list[i].name + " </div>" ); temp.data("variable_reference", function_obj.parameters_list[i]); sub_menu.append(temp); is_there = true; } } if (function_obj.variables_list) { for (var i = 0; i < function_obj.variables_list.length; i++) { var temp = $( '<div class="item" data-option="' + VAR_OR_VALUE_TYPES.only_variable + '">' + function_obj.variables_list[i].name + " </div>" ); temp.data("variable_reference", function_obj.variables_list[i]); sub_menu.append(temp); is_there = true; } } if (!is_there) { sub_menu.append( $( '<div class="header">' + LocalizedStrings.getUI("text_no_variable") + "</div>" ) ); sub_menu.append( $( '<div class="item disabled">' + LocalizedStrings.getUI("text_no_variable_instruction") + "</div>" ) ); } } function addHandlers ( command, ref_object, dom_object, menu_var_or_value, function_obj, expression_element ) { if (ref_object.variable_and_value != VAR_OR_VALUE_TYPES.only_value) { menu_var_or_value.dropdown({ onChange: function (value, text, $selectedItem) { dom_object.find(".var_name").remove(); switch ($selectedItem.data("option")) { case VAR_OR_VALUE_TYPES.only_function: openInputToFunction( command, ref_object, dom_object, menu_var_or_value, function_obj, $($selectedItem).data("function_reference"), expression_element ); break; case VAR_OR_VALUE_TYPES.only_value: openInputToValue( command, ref_object, dom_object, menu_var_or_value, function_obj, expression_element ); break; case VAR_OR_VALUE_TYPES.only_variable: openInputToVariable( command, ref_object, dom_object, menu_var_or_value, function_obj, $($selectedItem).data("variable_reference"), expression_element ); break; } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, ref_object, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } if (command.type == Models.COMMAND_TYPES.repeatNtimes) { RepeatNTimesManagement.manageExpressionElements( command, ref_object, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); } dom_object .find(".width-dynamic") .on("input", function () { const inputWidth = $(this).textWidth() + 10; $(this).focus(); const tmpStr = $(this).val(); $(this).val(""); $(this).val(tmpStr); $(this).css({ width: inputWidth, }); }) .trigger("input"); if (command.type == Models.COMMAND_TYPES.comment) { dom_object.parent().on("click", function (e) { dom_object.find(".value_rendered").remove(); dom_object.find(".value_rendered").empty(); dom_object.find(".value_rendered").remove(); dom_object.empty(); dom_object.append('<span class="menu_var_or_value_dom"> </span>'); openInputToValue( command, ref_object, dom_object, menu_var_or_value, function_obj, expression_element ); }); } } function openInputToFunction ( command, ref_object, dom_object, menu_var_or_value, function_obj, function_selected, expression_element ) { ref_object.function_called = function_selected; ref_object.parameters_list = []; if ( function_selected.parameters_list != null && function_selected.parameters_list.length > 0 ) { menu_var_or_value.find(".text").text(" "); dom_object.find(".menu_var_or_value_dom").remove(); var parameters_menu; if (function_selected.name) { parameters_menu = '<div class="parameters_function_called"> ' + function_selected.name + " <span> ( </span>"; } else { parameters_menu = '<div class="parameters_function_called"> <i>' + LocalizedStrings.translateInternalFunction( function_selected.identifier, function_selected.category ) + "</i> <span> ( </span>"; } for (var j = 0; j < function_selected.parameters_list.length; j++) { parameters_menu += '<div class="render_style_param parameter_' + j + '"></div>'; if (j + 1 != function_selected.parameters_list.length) { parameters_menu += " , "; } } parameters_menu += "<span> ) </span></div>"; parameters_menu = $(parameters_menu); dom_object.append(parameters_menu); for (var j = 0; j < function_selected.parameters_list.length; j++) { var temp; if (function_selected.parameters_list[j].dimensions > 0) { temp = new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.variable_and_function, null, null, null, true, function_selected.parameters_list[j].dimensions ); } else { temp = new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.all, null, null, null, true ); } ref_object.parameters_list.push(temp); renderMenu( command, temp, parameters_menu.find(".parameter_" + j), function_obj, 2, expression_element ); } var context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution) { context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); context_menu.insertAfter(dom_object.find(".parameters_function_called")); context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); ref_object.content = null; ref_object.row = null; ref_object.column = null; delete ref_object.function_called; delete ref_object.parameters_list; renderMenu( command, ref_object, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, ref_object, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); } else { menu_var_or_value.find(".text").text(" "); dom_object.find(".menu_var_or_value_dom").remove(); var parameters_menu; if (function_selected.name) { parameters_menu = '<div class="parameters_function_called"> ' + function_selected.name + " <span> ( </span>"; } else { parameters_menu = '<div class="parameters_function_called"> <i>' + LocalizedStrings.translateInternalFunction( function_selected.identifier, function_selected.category ) + "</i> <span> ( </span>"; } parameters_menu += "<span> ) </span></div>"; parameters_menu = $(parameters_menu); dom_object.append(parameters_menu); var context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution) { context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); context_menu.insertAfter(dom_object.find(".parameters_function_called")); context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); ref_object.content = null; ref_object.row = null; ref_object.column = null; delete ref_object.function_called; delete ref_object.parameters_list; renderMenu( command, ref_object, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, ref_object, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); } /*if (command.type == Models.COMMAND_TYPES.attribution) { AttribuitionsManagement.renderMenuOperations(command, ref_object, dom_object, menu_var_or_value, function_obj); }*/ } function openInputToVariable ( command, ref_object, dom_object, menu_var_or_value, function_obj, variable_selected, expression_element ) { ref_object.content = variable_selected; menu_var_or_value.find(".text").text(" "); dom_object.find(".menu_var_or_value_dom").remove(); let variable_render = '<div class="variable_rendered"> <span class="var_name">' + variable_selected.name + "</span>"; if (variable_selected.dimensions == 1 && ref_object.dimensions != 1) { variable_render += ' <span>[ </span> <div class="column_container"></div> <span> ]</span>'; } if (variable_selected.dimensions == 2 && ref_object.dimensions != 2) { variable_render += ' <span>[ </span> <div class="row_container"></div> <span> ]</span> '; variable_render += ' <span>[ </span> <div class="column_container"></div> <span> ]</span>'; } variable_render += "</div>"; variable_render = $(variable_render); dom_object.append(variable_render); if (variable_selected.dimensions == 1 && ref_object.dimensions != 1) { ref_object.column = new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.all, null, null, null, true ); renderMenu( command, ref_object.column, variable_render.find(".column_container"), function_obj, 2, expression_element ); } if (variable_selected.dimensions == 2 && ref_object.dimensions != 2) { ref_object.row = new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.all, null, null, null, true ); renderMenu( command, ref_object.row, variable_render.find(".row_container"), function_obj, 2, expression_element ); ref_object.column = new Models.VariableValueMenu( VAR_OR_VALUE_TYPES.all, null, null, null, true ); renderMenu( command, ref_object.column, variable_render.find(".column_container"), function_obj, 2, expression_element ); } let context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution && !dom_object.hasClass('var_attributed')) { console.log("dom_object 10: "); console.log(dom_object); context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); context_menu.insertAfter(dom_object.find(".variable_rendered")); context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); ref_object.content = null; ref_object.row = null; ref_object.column = null; delete ref_object.function_called; delete ref_object.parameters_list; renderMenu( command, ref_object, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, ref_object, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } if (command.type == Models.COMMAND_TYPES.repeatNtimes) { RepeatNTimesManagement.manageClearExpressionElements( command, ref_object, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); /*if (command.type == Models.COMMAND_TYPES.attribution) { AttribuitionsManagement.renderMenuOperations(command, ref_object, dom_object, menu_var_or_value, function_obj, variable_selected); }*/ } function openInputToValue ( command, ref_object, dom_object, menu_var_or_value, function_obj, expression_element ) { if (ref_object.content == null) { ref_object.content = ""; } menu_var_or_value.find(".text").text(" "); const field = $( '<input type="text" size="2" class="width-dynamic-minus" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" />' ); field.insertBefore(dom_object.find(".menu_var_or_value_dom")); field.on('input', function() { var input_field = $(this); var inputWidth = input_field.textWidth()+10; inputWidth = inputWidth<50?50:inputWidth; input_field.css({ width: inputWidth }) }).trigger('input'); const rendered = $('<div class="value_rendered"></div>'); rendered.insertBefore(field); field.focus(); field.val(ref_object.content); let context_menu = '<div class="ui dropdown context_menu_clear"><div class="text"></div><i class="dropdown icon"></i><div class="menu">'; context_menu += '<div class="item" data-clear="true">' + LocalizedStrings.getUI("btn_clear") + "</div>"; /*if (command.type == Models.COMMAND_TYPES.attribution) { context_menu += '<div class="item"><i class="dropdown icon"></i>' + LocalizedStrings.getUI('text_change'); context_menu += '<div class="menu">'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.exp_op_exp+'">EXP OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.op_exp+'">OP EXP</div>'; context_menu += '<div class="item" data-exp="'+Models.EXPRESSION_ELEMENTS.par_exp_par+'">( EXP )</div>'; context_menu += '</div></div>'; }*/ context_menu += "</div></div>"; context_menu = $(context_menu); dom_object.find(".menu_var_or_value_dom").remove(); if (ref_object.variable_and_value != VAR_OR_VALUE_TYPES.only_value) { context_menu.insertAfter(field); } context_menu.dropdown({ onChange: function (value, text, $selectedItem) { if ($selectedItem.data("clear")) { dom_object.text(""); dom_object.find(".value_rendered").remove(); dom_object.find(".context_menu_clear").remove(); dom_object.find(".width-dynamic-minus").remove(); ref_object.content = null; ref_object.row = null; ref_object.column = null; delete ref_object.function_called; delete ref_object.parameters_list; renderMenu( command, ref_object, dom_object, function_obj, 2, expression_element ); } if ($selectedItem.data("exp")) { AttribuitionsManagement.manageExpressionElements( command, ref_object, dom_object, menu_var_or_value, function_obj, $selectedItem, expression_element ); } }, selectOnKeydown: false, }); dom_object.find(".width-dynamic-minus").focusout(function () { /*if ( $(this) .val() .trim() ) { ref_object.content = $(this) .val() .trim(); }*/ ref_object.content = $(this) .val(); if (isNaN(ref_object.content)) { rendered.html(ref_object.content.replaceAll(" ", " ")); } else { rendered.text(ref_object.content); } $(this).remove(); }); dom_object.find(".width-dynamic-minus").on("keydown", function (e) { const code = e.keyCode || e.which; if (code == 13) { /*if ( $(this) .val() .trim() ) { ref_object.content = $(this) .val() .trim(); }*/ ref_object.content = $(this) .val(); if (isNaN(ref_object.content)) { rendered.html(ref_object.content.replaceAll(" ", " ")); } else { rendered.text(ref_object.content); } $(this).remove(); } if (code == 27) { if (isNaN(ref_object.content)) { rendered.html(ref_object.content.replaceAll(" ", " ")); } else { rendered.text(ref_object.content); } $(this).remove(); } }); if (command.type == Models.COMMAND_TYPES.comment) { /*rendered.parent().on('click', function(e) { rendered.parent().off(); console.log("TTT14"); rendered.remove(); rendered.empty(); rendered.remove(); dom_object.empty(); dom_object.append('<span class="menu_var_or_value_dom"> </span>'); openInputToValue(command, ref_object, dom_object, menu_var_or_value, function_obj, expression_element) });*/ } rendered.on("click", function (e) { rendered.empty(); rendered.remove(); dom_object.empty(); dom_object.append('<span class="menu_var_or_value_dom"> </span>'); openInputToValue( command, ref_object, dom_object, menu_var_or_value, function_obj, expression_element ); }); /*if (command.type == Models.COMMAND_TYPES.attribution) { AttribuitionsManagement.renderMenuOperations(command, ref_object, dom_object, menu_var_or_value, function_obj); }*/ } $.fn.textWidth = function (text, font) { if (!$.fn.textWidth.fakeEl) $.fn.textWidth.fakeEl = $("<span>") .hide() .appendTo(document.body); $.fn.textWidth.fakeEl .text(text || this.val() || this.text() || this.attr("placeholder")) .css("font", font || this.css("font")); return $.fn.textWidth.fakeEl.width(); };