{"version":3,"sources":["https://lively-kernel.org/lively4/swt21-debugging/src/client/morphic/selecting.js"],"names":["HaloService","default","Selecting","shouldHandle","e","altKey","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","lastPath","worldContexts","map","findWorldContext","filter","length","rootNode","findRootNode","shiftKey","onMagnify","node","parentNode","grabTarget","that","parents","_","reject","areHalosActive","indexOf","showHalos","el","lastIndicator","style","border","querySelector","color"],"mappings":"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","file":"selecting.js","sourcesContent":["import {default as HaloService} from \"src/components/halo/lively-halo.js\"\n\n\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      // lively.showElement(e.composedPath()[0])\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    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  // #important\n  static handleSelect(e) {\n    // lively.notify(\"path \" + e.composedPath().map(ea => ea.tagName))\n\n    if (this.shouldHandle(e)) { \n      // lively.showElement(e.composedPath()[0],1300).textContent = \"path: \" + e.composedPath().map(ea => ea.tagName).join(\",\")\n      var path = this.slicePathIfContainerContent(e.composedPath());\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      \n      // some inception: deal with containers that should behave as if they are their own document\n      // if we have found one, treat them as root\n      var worldContexts = path\n        .map(ea => lively.findWorldContext(ea))\n        .filter(ea => ea)\n        .filter(ea => ea.id == \"container-root\")\n      if (worldContexts.length > 0) {\n        var rootNode = this.findRootNode(worldContexts[0])\n      } else {\n        rootNode = this.findRootNode(document.body)\n      }\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 = ...\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  static showHalos(el, path) {\n    path = path || []\n    \n    if (!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    HaloService.hideHalos();\n  }\n\n  static areHalosActive() {\n    return HaloService.areHalosActive();\n  }\n}\n\nSelecting.load()\n"]}