{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-function-completion/src/client/morphic/selecting.js"],"names":["Selecting","shouldHandle","e","altKey","HaloService","isDragging","load","window","lively","setTimeout","removeEventListener","addEventListener","document","documentElement","evt","handleMouseDown","handleMouseUp","handleSelect","stopPropagation","preventDefault","console","log","target","tagName","composedPath","find","ea","isHaloItem","hideHalos","isIgnoredOnMagnify","element","HTMLElement","SVGElement","ShadowRoot","getAttribute","isMetaNode","isSelection","classList","contains","body","slicePathIfContainerContent","path","isContainer","containerIndex","isContent","forEach","index","id","slice","rootNode","findRootNode","lastPath","filter","shiftKey","idx","indexOf","onMagnify","node","parentNode","grabTarget","that","parents","_","reject","areHalosActive","showHalos","el","self","lastIndicator","style","border","querySelector","color"],"mappings":"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","file":"selecting.js","sourcesContent":["\nexport default class Selecting {\n\n  static shouldHandle(e) {\n    return e.altKey && !HaloService.isDragging;\n  }\n  \n  static load() {\n     if (!window.lively) {\n      return setTimeout(() => {Selecting.load()}, 100) // defere\n    }\n    // use capture to prevent the default behavior...\n    lively.removeEventListener(\"selecting\"); // in case of a reload\n    // #UseCase #COP get rid of the explict \"selecting\" context/domain and replace it with the context of the module \"Selecting.js\"\n    lively.addEventListener(\"selecting\", document.documentElement, 'pointerdown', \n      (evt) => this.handleMouseDown(evt), true);\n    lively.addEventListener(\"selecting\", document.documentElement, 'pointerup', \n      (evt) => this.handleMouseUp(evt), true);\n    lively.addEventListener(\"selecting\", document.documentElement, 'click', \n      (evt) => this.handleSelect(evt), true);\n  }\n\n  static handleMouseDown(e) {\n    // lively.showElement(e.composedPath()[0])\n    \n    if (this.shouldHandle(e)) {\n  \n   \n      \n      // lively.showElement(e.composedPath()[0])\n    \n      \n      // if (e.composedPath().find(ea => ea.tagName == \"LIVELY-HALO\")) {\n      //   lively.notify(\"clicked on halo\")\n      //   this.hideHalos()\n      //   e.stopPropagation();\n      //   e.preventDefault();\n      //   return\n      // }\n      \n      // console.log(\"mouse down \" + e.target.tagName)\n      e.stopPropagation();\n      e.preventDefault();\n    }\n  }\n\n  static handleMouseUp(e) {\n    if (this.shouldHandle(e)) {\n      console.log(\"mouse up \" + e.target.tagName)\n      e.stopPropagation();\n      e.preventDefault();\n    } else {\n      // if (e.composedPath()[0] == document.documentElement) {\n      // lively.notify(\"path: \" + e.composedPath())\n      if (e.composedPath().find(ea => ea.isHaloItem)) {\n        // lively.notify(\"we are doing someing\")\n      } else {\n        this.hideHalos()\n      }\n    }\n  }\n  \n  static isIgnoredOnMagnify(element) {\n    \n    return !((element instanceof HTMLElement) || (element instanceof SVGElement))\n      || element instanceof ShadowRoot \n      || element.getAttribute(\"data-is-meta\") \n      || (element.isMetaNode && !element.isSelection)\n      || (element.tagName == \"I\" && element.classList.contains(\"fa\")) // font-awesome icons\n      || (element.tagName == \"A\") // don't go into text, just structural \n      || element === window \n      || element === document \n      || element === document.body \n      || element === document.documentElement // <HTML> element\n  }\n\n  static slicePathIfContainerContent(path) {\n    // Special treatment of content in lively-container\n    var isContainer  = false;\n    var containerIndex;\n    var isContent = false;\n    path.forEach((ea, index) => {\n      if (ea.tagName == \"LIVELY-CONTAINER\") {\n        isContainer = true\n        containerIndex = index\n      }\n      if (ea.tagName == \"LIVELY-FIGURE\") {\n        isContainer = true\n        containerIndex = index\n      }\n      if (ea.id == \"container-content\") {\n        isContent = true\n      }\n    })\n    // lively.notify(\"container \" + isContainer  + \" content \" + isContent)\n    // e.composedPath().forEach(ea => lively.showElement(ea))\n    if (isContainer && isContent) {\n      // window.lastPath = e.composedPath()\n      path = path.slice(0, containerIndex)\n    }\n    return path\n  }\n  \n  static handleSelect(e) {\n    // lively.notify(\"path \" + e.composedPath().map(ea => ea.tagName))\n\n    \n    if (this.shouldHandle(e)) { \n    // lively.showElement(e.composedPath()[0],1300).textContent = \"path: \" + e.composedPath().map(ea => ea.tagName).join(\",\")\n\n      \n      var rootNode = this.findRootNode(document.body)\n      \n      var path = this.slicePathIfContainerContent(e.composedPath());\n      \n      // var rootNode = lively.findWorldContext(path)\n      \n      // workaround weird toplevel event issues... the halo should not get the event\n      // lively.notify(\"path \" + e.composedPath().map(ea => ea.tagName))\n      if (e.composedPath().find(ea => ea.tagName == \"LIVELY-HALO\")) {\n        path = this.lastPath || e.composedPath()\n      }      \n      this.lastPath = path\n      path = path\n        // .reverse()\n        .filter(ea => ! this.isIgnoredOnMagnify(ea))\n      \n      if (e.shiftKey) {\n        var idx = e.composedPath().indexOf(document.body);\n        path= path\n      } else {\n        // by default: don't go into the shadows\n        path = path.filter(ea => rootNode === this.findRootNode(ea))\n      }\n      var target = path[0]\n      this.onMagnify(target, e, path);     \n      e.stopPropagation();\n      e.preventDefault();        \n    } else {\n      // lively.focusWithoutScroll(document.body)\n    }\n  }\n  \n  static findRootNode(node) {\n    if (!node.parentNode) return node\n    return this.findRootNode(node.parentNode)\n  }\n\n  static onMagnify(target, e, path) {\n    if (!target) {\n      this.hideHalos()\n      return \n    }\n    var grabTarget = target;\n    var that = window.that;\n    \n    // console.log(\"onMagnify \" + grabTarget + \" that: \" + that);\n    var parents = _.reject(path, \n        ea =>  this.isIgnoredOnMagnify(ea))\n    if (that && this.areHalosActive()) {\n      var index = parents.indexOf(that);\n      grabTarget = parents[index + 1] || grabTarget;\n    }\n    // if there was no suitable parent, cycle back to the clicked element itself\n    window.that = grabTarget;\n    this.showHalos(grabTarget, parents || path);\n  }\n\n\n\n  static showHalos(el, path) {\n    path = path || []\n    \n    // if (HaloService.lastIndicator) HaloService.lastIndicator.remove();\n    // HaloService.lastIndicator = lively.showElement(el);\n    if (!self.HaloService) return;\n    \n    if (HaloService.lastIndicator) {\n      HaloService.lastIndicator.style.border = \"1px dashed blue\"\n      HaloService.lastIndicator.querySelector(\"pre\").style.color = \"blue\"\n\n    //   var div = document.createElement(\"div\")\n    //   div.innerHTML = path.reverse().map(ea => (ea === el ? \"<b>\" : \"\") + (ea.tagName ? ea.tagName : \"\") + \" \" + (ea.id ? ea.id : \"\") \n    //     + \" \" + (ea.getAttribute && ea.getAttribute(\"class\")) + (ea === el ? \"</b>\" : \"\")).join(\"<br>\")\n    //   this.lastIndicator.appendChild(div)\n      \n    //   div.style.fontSize = \"8pt\"\n    //   div.style.color = \"gray\"\n    }\n    \n    HaloService.showHalos(el, path);\n  }\n\n  static hideHalos() {\n    if (!self.HaloService) return;\n    HaloService.hideHalos();\n  }\n\n  static areHalosActive() {\n    return HaloService.areHalosActive();\n  }\n}\n\nSelecting.load()\n"]}