{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/src/components/widgets/lively-code-mirror-context-menu.js"],"names":["ContextMenu","openMenu","astCapabilities","codeMirror","livelyCodeMirror","fa","name","modifiers","map","m","join","generateGenerationSubmenu","submenu","menu","remove","generateClass","selectedPath","getInnermostPathContainingSelection","programPath","firstSelection","isInDescribe","unshift","generateTestCase","isDirectlyIn","push","generateGetter","generateSetter","generateImportSubmenu","identName","functions","classes","findImports","length","forEach","url","replace","lively4url","addImport","cl","menuItems","extractExpressionIntoLocalVariable","inlineLocalVariable","wrapExpressionIntoActiveExpression","rename","extractMethod","selection","selectMethodExtraction","changedSelectionInMenu","selectPaths","selectedPaths","undoSelection","generateHTMLAccessors","printAllBindings","menuPosition","cursorCoords","openIn","document","body","clientX","left","clientY","bottom","undefined","addEventListener","focus"],"mappings":"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","file":"lively-code-mirror-context-menu.js","sourcesContent":["import ContextMenu from 'src/client/contextmenu.js';\n\nexport default async function openMenu(astCapabilities, codeMirror, livelyCodeMirror) {\n\n  function fa(name, ...modifiers) {\n    return `<i class=\"fa fa-${name} ${modifiers.map(m => 'fa-' + m).join(' ')}\"></i>`;\n  }\n  \n  /*MD ### Generate Submenus MD*/\n\n  async function generateGenerationSubmenu() {\n\n    // for now, classes can be generated everywhere\n    // if this isn't wanted anymore, scope checks can be done as can be seen below\n    let submenu = [['Class', () => {\n        menu.remove();\n        astCapabilities.generateClass();\n      }, '→', fa('suitcase')]];\n\n    const selectedPath = astCapabilities.getInnermostPathContainingSelection(astCapabilities.programPath, astCapabilities.firstSelection);\n    \n    //add testcase if in describe\n    if (astCapabilities.isInDescribe(selectedPath)) {\n      submenu.unshift(['Testcase', () => {\n        menu.remove();\n        astCapabilities.generateTestCase();\n      }, '→', fa('suitcase')]);\n    }\n    \n    //add getter / setter if directly in ClassBody or ObjectExpression\n    if (astCapabilities.isDirectlyIn([\"ClassBody\", \"ObjectExpression\"], selectedPath)) {\n      submenu.push(['Getter', () => {\n        menu.remove();\n        astCapabilities.generateGetter();\n      }, '→', fa('suitcase')], ['Setter', () => {\n        menu.remove();\n        astCapabilities.generateSetter();\n      }, '→', fa('suitcase')]);\n    }\n\n    return submenu;\n  }\n\n  async function generateImportSubmenu() {\n    let { identName, functions, classes } = await astCapabilities.findImports();\n    let submenu = [];\n    if (!identName || functions.length == 0 && classes.length == 0) {\n      submenu.push(['none', () => {\n        menu.remove();\n      }, '', '']);\n    } else {\n      functions.forEach(url => submenu.push([url.replace(lively4url, ''), () => {\n        menu.remove();\n        astCapabilities.addImport(url, identName, true);\n      }, '-', fa('share-square-o')]));\n      classes.forEach(cl => submenu.push([cl.name + \", \" + cl.url.replace(lively4url, ''), () => {\n        menu.remove();\n        astCapabilities.addImport(cl.url, cl.name, false);\n      }, '-', fa('share-square-o')]));\n    }\n    return submenu;\n  }\n\n  /*MD ### Generate Factoring Menu MD*/\n\n  const menuItems = [['selection to local variable', () => {\n    menu.remove();\n    astCapabilities.extractExpressionIntoLocalVariable();\n  }, '→', fa('share-square-o', 'flip-horizontal')], ['inline variable', () => {\n    menu.remove();\n    astCapabilities.inlineLocalVariable();\n  }, '→', fa('external-link', 'flip-vertical')], ['wrap into active expression', () => {\n    menu.remove();\n    astCapabilities.wrapExpressionIntoActiveExpression();\n  }, '→', fa('suitcase')], ['Rename', () => {\n    menu.remove();\n    astCapabilities.rename();\n  }, 'Alt+R', fa('suitcase')], ['Extract Method', () => {\n    menu.remove();\n    astCapabilities.extractMethod();\n  }, 'Alt+M', fa('suitcase'), () => {\n    const selection = astCapabilities.selectMethodExtraction(astCapabilities.programPath, true);\n    if (selection) {\n      openMenu.changedSelectionInMenu = true;\n      astCapabilities.selectPaths(selection.selectedPaths);\n    } else {\n      openMenu.changedSelectionInMenu = false;\n    }\n  }, () => {\n    if (openMenu.changedSelectionInMenu) {\n      codeMirror.undoSelection();\n    }\n  }], ['Generate HTML Accessors', () => {\n    menu.remove();\n    astCapabilities.generateHTMLAccessors();\n  }, 'Alt+H', fa('suitcase')], ['Print References', () => {\n    astCapabilities.printAllBindings();\n    menu.remove();\n  }, 'Alt+I', fa('suitcase')], ['Generate', generateGenerationSubmenu()], ['Import', generateImportSubmenu()]];\n  var menuPosition = codeMirror.cursorCoords(false, \"window\");\n\n  const menu = await ContextMenu.openIn(document.body, { clientX: menuPosition.left, clientY: menuPosition.bottom }, undefined, document.body, menuItems);\n  menu.addEventListener(\"DOMNodeRemoved\", () => {\n    livelyCodeMirror.focus();\n  });\n}\n"]}