{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/client/clipboard.js"],"names":["pt","Halo","uuid","persistence","Clipboard","load","lively","removeEventListener","document","body","addEventListener","evt","onBodyMouseDown","onPaste","onCut","onCopy","setAttribute","clipboard","HaloService","areHalosActive","that","selection","nodes","length","forEach","ea","remove","hideHalos","nodesToHTML","node","querySelectorAll","livelyPrepareSave","map","outerHTML","join","preventDefault","stopPropagation","undefined","html","clipboardData","setData","initializeElements","all","makeLivelyIdNonConflicting","me","idAttribute","id","getAttribute","otherMe","elementByID","newId","pattern","RegExp","other","i","attributes","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","Map","set","style","zIndex","offset","subPt","result","contains","tagName","moveBy","sleep","then","get","childElementCount","setGlobalPosition","height","components","loadUnresolved","pasteTextDataInto","pasteFileInto","fileItem","blob","getAsFile","reader","FileReader","onload","event","img","src","target","readAsDataURL","hasGlobalFocus","notify","getData","lastTarget","items","index","item","kind","highlight","element","_highlight","showElement","border","composedPath","parentElement","find","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,HaloService */\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\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) {\n    function makeLivelyIdNonConflicting(me, all) {\n      const idAttribute = \"data-lively-id\";\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 = lively.elementByID(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      // ... 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        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    all.forEach(child => makeLivelyIdNonConflicting(child, all));\n    all.forEach(child => persistence.initLivelyObject(child));\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 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(\"paste\")\n    var data = evt.clipboardData.getData('text/html')\n    if (data) {\n      this.pasteHTMLDataInto(data, this.lastTarget) \n      return \n    }\n\n    data = evt.clipboardData.getData('text/plain')\n    if (data) {\n       this.pasteTextDataInto(data, 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()"]}