{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/client/clipboard.js"],"names":["pt","Halo","generateUUID","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","child","initLivelyObject","id","getAttribute","otherMe","elementByID","newId","other","i","attributes","attr","value","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 as generateUUID } 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    all.forEach(child => {\n      persistence.initLivelyObject(child)      \n      var id = child.getAttribute(\"data-lively-id\")    \n      // if we have an ID, some other me might be lying around somewhere...\n      if (id) {\n        var otherMe = lively.elementByID(id)\n        if (otherMe) {\n          // so there is an identiy crysis... so we have to become somebody new...\n          var newId = generateUUID()\n          // ... and I have to notify my buddies that I am no longer myself\n          all.forEach(other => {\n            for(var i=0; i < other.attributes.length; i++) {\n              var attr = other.attributes[i]\n              if (attr.value == id) {\n                // lively.notify(\"found a reference to me: \" + other + \".\" + attr.name)\n                attr.value = newId\n              }\n            }\n          })\n        }\n      }\n     })\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.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()"]}