{"version":3,"sources":["https://lively-kernel.org/lively4/composed-offset/src/client/clipboard.js"],"names":["pt","Halo","HaloService","default","uuid","persistence","Clipboard","load","lively","removeEventListener","document","body","addEventListener","evt","onBodyMouseDown","onPaste","onCut","onCopy","setAttribute","clipboard","areHalosActive","that","selection","nodes","length","forEach","ea","remove","hideHalos","nodesToHTML","node","querySelectorAll","livelyPrepareSave","map","outerHTML","join","preventDefault","stopPropagation","undefined","html","clipboardData","setData","initializeElements","all","searchInshadow","idMap","Map","worldElements","allElements","worldElementByID","id","find","ele","getAttribute","makeLivelyIdNonConflicting","me","idAttribute","otherMe","newId","set","pattern","RegExp","other","attributes","i","attr","value","replace","child","initLivelyObject","getTopLeft","elements","topLeft","getGlobalPosition","minPt","pasteHTMLDataInto","data","container","flat","pos","lastClickPos","div","createElement","classList","add","setExtent","innerHTML","appendChild","setPosition","topLevel","Array","from","zIndexMap","style","zIndex","offset","subPt","result","contains","tagName","moveBy","sleep","then","get","childElementCount","setGlobalPosition","height","components","loadUnresolved","pasteTextDataInto","pasteBibtexDataInto","bibtex","setBibtex","pasteFileInto","fileItem","blob","getAsFile","reader","FileReader","onload","event","img","src","target","readAsDataURL","hasGlobalFocus","notify","textData","getData","htmlData","match","lastTarget","items","index","item","kind","highlight","element","_highlight","showElement","border","composedPath","parentElement","isEditing","activeElement","shadowRoot","contentEditable","constructor","name","globalFocus","livelyTarget","clientX","clientY"],"mappings":"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","file":"clipboard.js","sourcesContent":["// #Clipboard - Cut,Copy, and Paste for Lively4\n\n/* global that */\n\nimport {pt} from 'src/client/graphics.js';\nimport Halo from \"src/components/halo/lively-halo.js\";\nimport { uuid } from 'utils';\nimport persistence from \"src/client/persistence.js\"\n\nimport {default as HaloService} from \"src/components/halo/lively-halo.js\"\n\nexport default class Clipboard {\n  \n  static load() {\n    lively.removeEventListener(\"Clipboard\", document)\n    lively.removeEventListener(\"Clipboard\", document.body)\n    \n    lively.addEventListener(\"Clipboard\", document, \"mousedown\", evt => this.onBodyMouseDown(evt), true)\n    lively.addEventListener(\"Clipboard\", document.body, \"paste\", evt => this.onPaste(evt), true)\n    lively.addEventListener(\"Clipboard\", document.body, \"cut\", evt => this.onCut(evt))\n    lively.addEventListener(\"Clipboard\", document.body, \"copy\", evt => this.onCopy(evt))\n    \n    document.body.setAttribute(\"tabindex\", 0) // just ensure focusabiltity\n\n    lively.clipboard = Clipboard; // #TODO make cyclic dependencies work\n  }\n  \n  static onCut(evt) {\n    if ((!HaloService.areHalosActive() || !that)) {\n      return;\n    }\n    this.onCopy(evt)\n    if (lively.selection.nodes.length > 0) {\n      lively.selection.nodes.forEach(ea => {\n        ea.remove()\n      })\n      lively.selection.remove()\n       \n    } else {\n      that.remove()\n    }\n    Halo.hideHalos()\n  }\n  \n  static nodesToHTML(nodes) {\n    // prepare for serialization\n    nodes.forEach(node => {\n      node.querySelectorAll(\"*\").forEach( ea => {\n        if (ea.livelyPrepareSave) ea.livelyPrepareSave();\n      });\n    })\n    \n    return nodes.map(ea => ea.outerHTML).join(\"\\n\")\n  }\n  \n  static onCopy(evt) {\n    if ((!HaloService.areHalosActive() || !that)) {\n      return;\n    }\n    evt.preventDefault(); \n    evt.stopPropagation()\n    var nodes = []\n    if (lively.selection.nodes.length > 0) {\n      nodes = lively.selection.nodes\n    } else if ((that !== undefined)) {\n      nodes = [that]\n    }\n    var html = this.nodesToHTML(nodes)\n    evt.clipboardData.setData('text/plain', html);\n    evt.clipboardData.setData('text/html', html);\n  }\n  \n  static initializeElements(all, searchInshadow = true) {\n    const idMap = new Map();\n    \n    const worldElements = [...lively.allElements(searchInshadow)];\n    function worldElementByID(id) {\n      return worldElements.find(ele => ele && ele.getAttribute && ele.getAttribute(\"data-lively-id\") == id)\n    }\n\n    function makeLivelyIdNonConflicting(me, all) {\n      const idAttribute = \"data-lively-id\";\n      if (!me  || !me.getAttribute) return;\n      const id = me.getAttribute(idAttribute);\n      if (!id) { return; }\n\n      // if we have an ID, some other me might be lying around somewhere...\n      const otherMe = worldElementByID(id);\n      if (!otherMe) { return; }\n\n      // so there is an identiy crisis... so we have to become somebody new...\n      const newId = uuid();\n      me.setAttribute(idAttribute, newId);\n      \n      idMap.set(id, newId);\n\n      // ... and I have to notify my buddies that I am no longer myself\n      const pattern = new RegExp(id, 'ig');\n      all.forEach(other => {\n        if (other.attributes) {\n          for(let i = 0; i < other.attributes.length; i++) {\n            const attr = other.attributes[i];\n            attr.value = attr.value.replace(pattern, newId);\n          }          \n        }\n      })\n    }\n    \n    all.forEach(child => makeLivelyIdNonConflicting(child, all));\n    all.forEach(child => persistence.initLivelyObject(child));\n    \n    return idMap\n  }\n  \n  static getTopLeft(elements) {\n    var topLeft\n    elements.forEach(ea => {\n      if (!topLeft) \n        topLeft = lively.getGlobalPosition(ea);\n      else\n        topLeft = topLeft.minPt(lively.getGlobalPosition(ea))\n    })\n    return topLeft || pt(0,0)\n  }\n  \n  static pasteHTMLDataInto(data, container, flat, pos=this.lastClickPos) {\n    // add everthing into a container \n    var div = document.createElement(\"div\")\n    div.classList.add(\"lively-content\")\n    lively.setExtent(div, pt(800,10))\n    div.innerHTML = data\n    container.appendChild(div)\n    lively.setPosition(div, pt(0,0))\n    \n    // paste oriented at a shared topLeft\n    var topLevel = Array.from(div.querySelectorAll(\":scope > *\"))\n    var all = Array.from(div.querySelectorAll(\"*\"))\n    \n    this.initializeElements(all)\n    \n    \n    // somehow zIndex gets lost...\n    var zIndexMap = new Map()\n    topLevel.forEach(ea => {\n       zIndexMap.set(ea, ea.style.zIndex)\n    })\n    \n    \n    // topLevel = _.sortBy(topLevel, ea => ea.style && ea.style.zIndex).reverse()\n    // topLevel.forEach(ea => ea.remove())\n    // topLevel.forEach(ea => ea.style.zIndex = \"\")\n    topLevel.forEach(ea => div.appendChild(ea))\n    var offset = (pos || pt(0,0)).subPt(this.getTopLeft(topLevel))\n    var result = div\n    \n    // #TODO #CleanUp\n    \n    topLevel.forEach(child => {\n      if (child.classList.contains(\"lively-content\") || child.tagName == \"LIVELY-WINDOW\") {\n        container.appendChild(child)\n        lively.moveBy(child, offset)\n        result = child; // return last result?\n      }\n    })\n    \n    // restore zIndex in an Async way... it seems focus is responsible for it #Hack\n    lively.sleep(0).then(() => {\n      topLevel.forEach(ea => {\n        ea.style.zIndex = zIndexMap.get(ea)\n      })\n    })\n    \n    // clean up if neccesary\n    \n    if (div.childElementCount == 0) {\n      div.remove() // and get rid of the tmp container\n    } else {\n      // ajust position and content size\n      lively.setGlobalPosition(div, pos || pt(0,0))\n      div.style.height = \"max-content\"\n    }\n    if (flat) {\n      return topLevel\n    }\n    lively.components.loadUnresolved(result, true, \"pasteHTMLDataInto\", true)\n    \n    return result\n  }\n  \n  static pasteTextDataInto(data, container) {\n    var div = document.createElement(\"div\")\n    div.innerHTML = data\n    div.classList.add(\"lively-content\")\n    container.appendChild(div)\n    lively.components.loadUnresolved(div, true, \"pasteHTMLDataInto\", true)\n    lively.setGlobalPosition(div, this.lastClickPos)\n  }\n  \n  static async pasteBibtexDataInto(data, container) {\n    var bibtex = await (<lively-bibtex class=\"lively-content\"></lively-bibtex>)\n    bibtex.setBibtex(data)\n    container.appendChild(bibtex)\n    lively.setGlobalPosition(bibtex, this.lastClickPos)\n  }\n  \n   static pasteFileInto(fileItem, container) {\n    var blob = fileItem.getAsFile();\n    var reader = new FileReader();\n    reader.onload = (event) => {\n      var img = document.createElement(\"img\")\n      img.src = event.target.result\n      img.classList.add(\"lively-content\")\n      container.appendChild(img)\n      lively.setGlobalPosition(img, this.lastClickPos)\n    }; // data url!\n    reader.readAsDataURL(blob);\n  }\n\n  static onPaste(evt) {\n    if (!this.lastClickPos) return; // we don't know where to paste it...this.lastClickPos\n    // lively.notify(\"onPaste in \" + this.lastTarget)\n    \n    if (!lively.hasGlobalFocus()) return\n    \n    evt.stopPropagation()\n    evt.preventDefault(); \n    lively.notify(\"[clipboard] paste\")\n    \n    var textData = evt.clipboardData.getData('text/plain')\n    var htmlData = evt.clipboardData.getData('text/html')\n    \n    // guess it is bibtex? Maybe we should allow pattern matting like in drag and drop?\n    if (textData.match(/@[A-Za-z]+{/)) {\n      return this.pasteBibtexDataInto(textData, this.lastTarget)\n    }\n    \n    if (htmlData) {\n      this.pasteHTMLDataInto(htmlData, this.lastTarget) \n      return \n    }\n \n    \n    if (textData) {\n       this.pasteTextDataInto(textData, this.lastTarget) \n      return \n    }\n    \n    var items = (event.clipboardData || evt.clipboardData).items;\n    if (items.length> 0) {\n      for (var index in items) {\n        var item = items[index];\n        if (item.kind === 'file') {\n          this.pasteFileInto(item, this.lastTarget) \n        }\n      }\n      evt.stopPropagation()\n      evt.preventDefault(); \n      return \n    }\n  }\n\n  static highlight(element) {\n    if (this._highlight) this._highlight.remove()\n    this._highlight = lively.showElement(element)\n    this._highlight.innerHTML = \"\"  + element.id\n    this._highlight.style.border = \"1px solid blue\"\n  }\n\n  static onBodyMouseDown(evt) {\n    var target = evt.composedPath()[0]\n    if (target == document.body.parentElement) target = document.body\n    \n    if(target && target.classList) {\n      if (target.classList.contains(\"lively-no-paste\")) {\n        target = evt.composedPath().find(ea => ea.tagName == \"LIVELY-CONTAINER\")\n      } else {\n        var container = evt.composedPath().find(ea => ea.tagName == \"LIVELY-CONTAINER\")\n        if (container && !container.isEditing()) {\n          target = container\n          var activeElement = container.shadowRoot.activeElement\n          if (activeElement && \n              (activeElement.tagName == \"INPUT\" || activeElement.contentEditable)) {         \n          // the element itself will handle the paste\n            this.lastTarget = null\n            this.lastClickPos = null\n            return \n          }\n        } else {\n            // this.lastTarget = container\n          // } else {\n          if (evt.composedPath().find(ea => ea.constructor.name == \"ShadowRoot\")) { // #TODO is there a better test for the shadow root?\n            // lively.notify(\"shadow\")\n            this.lastTarget = null\n            this.lastClickPos = null\n            return // we are in the shadows\n          }                    \n        }\n        \n      }\n      // this.highlight(target)\n      lively.globalFocus()\n      this.lastTarget = target\n      if (this.lastTarget.livelyTarget) {\n        this.lastTarget = this.lastTarget.livelyTarget()\n        // lively.showElement(this.lastTarget)\n      }\n      this.lastClickPos = pt(evt.clientX,evt.clientY)\n    }\n  }\n}\n\n\nClipboard.load()"]}