{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/components/halo/lively-halo-grab-item.js"],"names":["HaloItem","nodes","events","pt","Preferences","Grid","HaloGrabItem","droppingBlacklist","initialize","registerMouseEvents","startCustomDragging","start","evt","isDragging","console","log","grabTarget","window","that","grabStartEventPosition","globalPosition","grabOffset","subPt","lively","getGlobalPosition","preventDefault","move","noticableDistanceTo","haloGrabStart","initGrabShadow","prepareGrabTarget","haloGrabMove","moveGrabbedNodeToEvent","stop","haloGrabStop","stopGrabbingAtEvent","grabShadow","document","body","appendChild","classList","add","style","position","removeProperty","cloneNode","opacity","eventPosition","clientX","clientY","pos","dropAtEvent","setGlobalPosition","optSnapPosition","dropIndicator","remove","dropTargetIndicator","insertGrabTargetBeforeShadow","removeGrabShadow","setPosition","getPosition","parentElement","parentNode","removeChild","droptarget","droptargetAtEvent","moveGrabShadowToTargetAtEvent","showElement","color","textContent","elementToCSSName","border","SVGElement","element","foreignObject","createElementNS","insertBefore","node","elementsUnderCursor","allElementsFromPoint","filter","elementUnder","i","length","targetNode","canDropInto","localName","root","getContentRoot","markdown","querySelector","get","children","childNodes","nextChild","Array","from","find","child","nodeType","nodeComesBehind","shiftKey","dist","targetTag","tagName","toLowerCase","worldContext","findWorldContext","result","isMetaNode","getElementsByTagName","includes","livelyAcceptsDrop","bounds","getBoundingClientRect","toTheRight","top","y","bottom","left","x","below","livelyUpdate"],"mappings":"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","file":"lively-halo-grab-item.js","sourcesContent":["/*\n * # LivelyHaloGrabItem\n * The GrabHaloItem removes the selected node from its parent element\n * drags it to a new position and places it relative or aboslute \n * (distance or holding shift pressed) into another node. \n */\n \nimport HaloItem from 'src/components/halo/lively-halo-item.js';\nimport * as nodes from 'src/client/morphic/node-helpers.js';\nimport * as events from 'src/client/morphic/event-helpers.js';\nimport {pt} from 'src/client/graphics.js';\nimport Preferences from 'src/client/preferences.js';\nimport {Grid} from 'src/client/morphic/snapping.js';\n\n\nexport default class HaloGrabItem extends HaloItem {\n \n static get droppingBlacklist() {\n      return {\"*\": \n        [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\", \"lively-window\", \"button\", \"input\", \"lively-halo\", \"html\",  \"lively-selection\", \"lively-connector\", \"lively-code-mirror\",  \"lively-presentation\"] // \"lively-markdown\",\n      }\n  }\n \n  initialize() {\n    this.registerMouseEvents()\n    this.startCustomDragging();\n  }\n\n  // DRAG API\n\n  start(evt) {\n    if (this.isDragging) {\n      console.log(\"isDragging \" + this.isDragging)\n      return;\n    }\n    this.grabTarget = window.that;\n    if (this.grabTarget) {\n      this.grabStartEventPosition = events.globalPosition(evt);\n      this.grabOffset =  events.globalPosition(evt).subPt(lively.getGlobalPosition(this.grabTarget));\n\n      evt.preventDefault();\n    }\n  }\n\n  \n  move(evt) {\n    if (this.grabTarget && !this.isDragging && \n      events.noticableDistanceTo(evt, this.grabStartEventPosition)) {\n      // drag detected\n        if (this.grabTarget.haloGrabStart) {\n          this.grabTarget.haloGrabStart(evt, this, this.grabStartEventPosition)\n        } else {\n          this.initGrabShadow();\n          this.prepareGrabTarget();\n        }\n        this.isDragging = true;\n    }\n    if (this.isDragging && this.grabTarget) {\n      if (this.grabTarget.haloGrabMove) {\n        this.grabTarget.haloGrabMove(evt, this)\n      } else {\n        this.moveGrabbedNodeToEvent(evt);\n      }\n    }\n  }\n  \n  stop(evt) {\n    try {\n    if (this.isDragging && this.grabTarget) {\n      if (this.grabTarget.haloGrabStop) {\n        this.grabTarget.haloGrabStop(evt, this)\n      } else {\n        this.stopGrabbingAtEvent(evt);\n      }\n    }\n    } finally {\n      this.isDragging = false;\n      this.grabTarget = null;\n      this.grabStartEventPosition = null;\n      this.grabShadow = null;\n    }\n  }\n  \n  // HELPERS\n  \n  prepareGrabTarget() {\n    document.body.appendChild(this.grabTarget);\n    this.grabTarget.classList.add(\"lively4-grabbed\")\n    this.grabTarget.style.position = 'absolute';\n    this.grabTarget.style.removeProperty('top');\n    this.grabTarget.style.removeProperty('left');\n  }\n  \n  initGrabShadow() {\n    this.grabShadow = this.grabTarget.cloneNode(true);\n    this.grabShadow.style.opacity = '0.5';\n    this.grabShadow.style.position = 'relative';\n    this.grabShadow.style.removeProperty('top');\n    this.grabShadow.style.removeProperty('left');\n  }\n  \n  moveGrabbedNodeToEvent(evt) {\n    var eventPosition = pt(evt.clientX, evt.clientY);\n    var pos = eventPosition.subPt(this.grabOffset)\n    \n    this.dropAtEvent(this.grabShadow, evt);\n    lively.setGlobalPosition(this.grabTarget, Grid.optSnapPosition(pos, evt))\n    evt.preventDefault();\n  }\n  \n  stopGrabbingAtEvent(evt) {\n    if (this.dropIndicator) this.dropIndicator.remove()\n    if (this.dropTargetIndicator) this.dropTargetIndicator.remove()\n      \n    this.grabTarget.classList.remove(\"lively4-grabbed\")\n    if (this.grabShadow.style.position == 'absolute') {\n\n        this.insertGrabTargetBeforeShadow();\n        this.removeGrabShadow();\n        lively.setPosition(this.grabTarget, lively.getPosition(this.grabShadow))\n    } else {    \n      this.insertGrabTargetBeforeShadow();\n      this.removeGrabShadow();\n    \n      this.grabTarget.style.position = 'relative';\n      this.grabTarget.style.removeProperty('top');\n      this.grabTarget.style.removeProperty('left');\n    }\n    evt.preventDefault();\n    this.isDragging = false;\n    \n    if (this.grabTarget.parentElement == document.body) {\n      this.grabTarget.classList.add(\"lively-content\"); // \"desktop content will be preserved\"\n    }\n    \n  }\n  \n  removeGrabShadow() {\n    this.grabShadow.parentNode.removeChild(this.grabShadow);\n  }\n  \n  dropAtEvent(grabShadow, evt) {\n    var droptarget = this.droptargetAtEvent(grabShadow, evt);\n    if (droptarget) {      \n      this.moveGrabShadowToTargetAtEvent(droptarget, evt);\n      \n      if (this.dropIndicator) this.dropIndicator.remove()\n      this.dropIndicator = lively.showElement(droptarget)      \n      this.dropIndicator.style.color = \"gray\"\n      this.dropIndicator.textContent = lively.elementToCSSName(droptarget)\n      this.dropIndicator.style.border = \"1px dashed lightgray\"\n      this.dropIndicator.classList.add(\"no\")\n      \n      if (this.dropTargetIndicator) this.dropTargetIndicator.remove()\n      this.dropTargetIndicator = lively.showElement(grabShadow)\n      this.dropTargetIndicator.textContent = \"\"\n\n      this.dropTargetIndicator.style.border = \"1px dashed gray\"\n      // lively.showPoint(lively.getGlobalPosition(grabShadow))\n      lively.setGlobalPosition(this.dropTargetIndicator, \n        lively.getGlobalPosition(grabShadow))\n    }\n  }\n  \n  insertGrabTargetBeforeShadow() {\n    if (this.grabShadow && this.grabTarget) {\n      \n      if (this.grabShadow.parentNode instanceof SVGElement) {\n        var element = this.grabTarget\n        var foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", \"foreignObject\")\n        foreignObject.appendChild(element)\n        lively.setPosition(foreignObject, pt(0,0))\n        this.grabShadow.parentNode.insertBefore(foreignObject, this.grabShadow);        \n      } else {\n        this.grabShadow.parentNode.insertBefore(this.grabTarget, this.grabShadow);\n      }\n      \n      \n      \n    }\n  }\n  \n  droptargetAtEvent(node, evt) {\n    \n    // var elementsUnderCursor = Array.from(events.elementsUnder(evt)).filter( (elementUnder) => {\n    var elementsUnderCursor = lively.allElementsFromPoint(lively.getPosition(evt)).filter( (elementUnder) => {\n      return elementUnder !== this.grabTarget && elementUnder !== this.grabShadow;\n    });\n    for (var i = 0; i < elementsUnderCursor.length; i++) {\n      var targetNode = elementsUnderCursor[i];\n      if (HaloGrabItem.canDropInto(node, targetNode) ) {\n        \n        // #TODO redirect drops into components... that want their drops go into the shadow\n        if (targetNode.localName == \"lively-container\") {\n          var root = targetNode.getContentRoot() \n          // we could still be in markdown...\n          var markdown = root.querySelector(\"lively-markdown\")\n          if (markdown) {\n            return markdown.get(\"#content\")   \n          }\n          return root\n        } if (targetNode.localName == \"lively-markdown\") {\n          return targetNode.get(\"#content\") \n        } else {\n          return targetNode;\n        }\n      }\n    }\n    return document.body;\n  }\n  \n  moveGrabShadowToTargetAtEvent(targetNode, evt) {\n    var pos = pt(evt.clientX, evt.clientY)\n    \n    var children = targetNode.childNodes;\n    var nextChild = Array.from(children).find(child => {\n      return child !== this.grabShadow && child !== this.grabTarget &&\n        child.nodeType === 1 && this.nodeComesBehind(child, pos);\n    });\n    \n    targetNode.insertBefore(this.grabShadow, nextChild);\n    this.grabShadow.style.position = 'relative';\n    this.grabShadow.style.removeProperty('top');\n    this.grabShadow.style.removeProperty('left'); \n\n    if (evt.shiftKey || \n      lively.getGlobalPosition(this.grabShadow).dist(lively.getGlobalPosition(this.grabTarget)) > 100) {\n      this.grabShadow.parentElement.appendChild(this.grabShadow)\n      this.grabShadow.style.opacity = 0;\n      lively.setPosition(this.grabShadow, pt(0,0))\n      \n      var pos = lively.getGlobalPosition(this.grabTarget);\n      // lively.showPoint(pos)\n      // lively.showElement(this.grabTarget)\n\n\n      // console.log(\"set global position: \" + pos)\n      lively.setGlobalPosition(this.grabShadow, pos); // localize\n      // lively.setGlobalPosition(this.grabShadow, pos); // localize\n\n\n      // var mysteriousOffset = pos.subPt(lively.getGlobalPosition(this.grabShadow))\n      // lively.moveBy(this.grabShadow,mysteriousOffset )\n      \n      // lively.showPoint(lively.getGlobalPosition(this.grabShadow))\n    } else {\n      // drag position is near enough to relative position, so SNAP  \n      this.grabShadow.style.opacity = 0.5;\n    }\n  }\n  \n  static canDropInto(node, targetNode) {\n    \n    if (!targetNode || !node) return false\n    var targetTag = targetNode.tagName.toLowerCase();\n    \n    \n    var worldContext = lively.findWorldContext(targetNode);\n    if (!(worldContext === document.body)) return false;\n    \n    //       || (worldContext.id == \"container-root\")\n    // || (worldContext.host && worldContext.host.tagName == \"LIVELY-MARKDOWN\")\n    \n    var result =  node !== targetNode &&\n      !targetNode.isMetaNode &&\n      !Array.from(node.getElementsByTagName('*')).includes(targetNode) &&\n      !(this.droppingBlacklist[node.tagName.toLowerCase()] || []).includes(targetTag) &&\n      !(this.droppingBlacklist['*'] || []).includes(targetTag) && \n      (!targetNode.livelyAcceptsDrop || targetNode.livelyAcceptsDrop(node))\n    \n    // console.log(\"canDropInto \" + lively.elementToCSSName(targetNode)  + \" worldContext \" + worldContext + \" -> \" + result)\n    return result\n  }\n  \n  nodeComesBehind(node, pos) {\n    var bounds = node.getBoundingClientRect()\n    var toTheRight = \n      (bounds.top <= pos.y <= bounds.bottom) && (bounds.left > pos.x);\n    var below = bounds.top > pos.y;\n    return toTheRight || below;\n  }\n  \n  // called after code changes...\n  livelyUpdate() {\n    // this.style.backgroundColor = \"\"\n  }\n  \n}\n\n\n"]}