{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-leo/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","onSelect","selection","selectMethodExtraction","changedSelectionInMenu","selectPaths","selectedPaths","onDeselect","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    onSelect: () => {\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    onDeselect: () => {\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"]}