{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-event-sourcing/src/client/graffle.js"],"names":["pt","Halo","SVG","debounce","Grid","events","Graffle","load","lively","removeEventListener","document","body","addEventListener","evt","onKeyDown","onKeyUp","documentElement","onMouseDown","onMouseMove","onMouseUp","onSelectionHide","onSelectionChange","keysDown","showStyleBalloon","target","styleBalloon","openPart","style","zIndex","appendChild","setGlobalPosition","getGlobalBounds","bottomLeft","hideStyleBalloon","remove","selection","window","getSelection","activeElement","isContentEditable","shadowRoot","anchorNode","isCollapsed","element","getRangeAt","endContainer","parentElement","includes","tagName","preferences","get","isGlobalKeyboardFocusElement","composedPath","key","String","fromCharCode","keyCode","specialKeyDown","ctrlKey","metaKey","disabled","altKey","stopPropagation","preventDefault","hand","ensureHand","visibility","info","textContent","userSelect","changeFontSize","factor","fontSize","match","Math","round","Number","replace","changeCurrentFontSize","range","commonAncestorContainer","oldSize","execCommand","changeTextColor","color","startContainer","changeHiliteColor","currentPath","HaloService","showHaloItems","eventPosition","clientX","clientY","startShapeDrawing","shape","createElement","backgroundColor","border","openAsLivelyContent","startTextDrawing","text","classList","add","width","height","whiteSpace","padding","contentEditable","touchAction","ensureTargetContainer","startConnectorDrawing","startPathDrawing","startFreehandDrawing","connector","components","openIn","targetContainer","that","showHalos","cp","halo","ensureControlPoint","getPath","currentControlPoint","setVerticePosition","start","targetElement","connectFrom","connectTo","freehand","create","currentFreehand","setExtent","onPointerDown","continueDrawing","path","offset","getGlobalPosition","pos","subPt","snapPt","setPosition","svgPath","querySelector","vertices","getPathVertices","length","addControlPoint","eventOffset","lastMouseUpPos","div","currentElement","lastMouseDown","find","ea","localName","showElement","move","onPointerMove","extent","getPosition","stop","hideHaloItems","onPointerUp","svg","bounds","childBounds","p1","p2","x","y","delta","moveBy","scaleBy","contains","focus","lastElement","currentConnectFrom"],"mappings":"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","file":"graffle.js","sourcesContent":["import {pt} from 'src/client/graphics.js';\nimport Halo from \"src/components/halo/lively-halo.js\"\nimport SVG from \"src/client/svg.js\"\nimport { debounce } from \"utils\";\nimport {Grid} from 'src/client/morphic/snapping.js';\nimport * as events from 'src/client/morphic/event-helpers.js'\n\nexport default class Graffle {\n  \n  // Graffle.keysDown \n  static load() {\n    lively.removeEventListener(\"Graffle\", document.body)\n    lively.removeEventListener(\"Graffle\", document)\n    lively.addEventListener(\"Graffle\", document.body, \"keydown\", \n      (evt) => { this.onKeyDown(evt)}, true)\n    lively.addEventListener(\"Graffle\", document.body, \"keyup\", \n      (evt) => { this.onKeyUp(evt) }, true)\n    lively.removeEventListener(\"GraffleMouse\", document.documentElement)\n    lively.addEventListener(\"GraffleMouse\", document.documentElement, \"pointerdown\", \n      (evt) => { this.onMouseDown(evt) }, true)\n    lively.addEventListener(\"GraffleMouse\", document.documentElement, \"pointermove\", \n      (evt) => { this.onMouseMove(evt) })\n    lively.addEventListener(\"GraffleMouse\", document.documentElement, \"pointerup\", \n      (evt) => { this.onMouseUp(evt) })\n    lively.addEventListener(\"Graffle\", document, \"selectionchange\", \n      (evt) => { this.onSelectionHide(evt) } )\n    lively.addEventListener(\"Graffle\", document, \"selectionchange\", \n      ((evt) => { this.onSelectionChange(evt) })::debounce(600) )\n    this.keysDown = {}\n  }\n\n  \n  static async showStyleBalloon(target) {\n    if (!target) {\n      return;\n    }\n    // console.log(\"show balloon \" + target)\n    // lively.showElement(target)\n    if (!lively.styleBalloon) {\n      lively.styleBalloon = await lively.openPart(\"formatting\")\n      lively.styleBalloon.style.zIndex = 500\n    }\n    document.body.appendChild(lively.styleBalloon);\n    // lively.showElement(lively.styleBalloon)\n\n    // console.log(\"pos \" + lively.getGlobalBounds(target).bottomLeft())\n    lively.setGlobalPosition(lively.styleBalloon,\n      lively.getGlobalBounds(target).bottomLeft())\n  }\n  \n    \n  static async hideStyleBalloon() {\n    // console.log(\"hide balloon\")\n    if (lively.styleBalloon) {\n      lively.styleBalloon.remove()\n      \n      // lively.styleBalloon = null; // for developing\n    }\n  }\n  \n   static onSelectionHide(evt) {\n    // var selection = window.getSelection()\n    // if (!document.activeElement || !document.activeElement.isContentEditable) {\n    //   if (document.activeElement === document.body) {\n    //     this.hideStyleBalloon() \n    //   }\n    // } else if (!selection.anchorNode || !selection.isCollapsed) {\n    //   this.hideStyleBalloon() \n    // }\n    this.hideStyleBalloon() \n   }\n  \n  static onSelectionChange(evt) {\n    var selection = window.getSelection()\n    if (!document.activeElement || !document.activeElement.isContentEditable) {\n      return\n    }\n    if (document.activeElement.shadowRoot) {\n      selection = document.activeElement.shadowRoot.getSelection()\n    }\n    if (selection.anchorNode && !selection.isCollapsed) {\n      var element = selection.getRangeAt(0).endContainer.parentElement;\n      while([\"SPAN\", \"FONT\", \"A\", \"B\", \"I\"].includes(element.tagName)) {\n        element = element.parentElement\n      }\n      this.showStyleBalloon(element)\n    }\n  }\n  \n  static async onKeyDown(evt) {        \n    if (!lively.preferences.get(\"GraffleMode\")) return;\n\n    if (!lively.isGlobalKeyboardFocusElement(evt.composedPath()[0])) \n      return; \n    var key = String.fromCharCode(evt.keyCode)\n\n    // console.log(\"\" + Date.now() + \" down \" + key + \" \" +  evt.altKey)\n\n    this.keysDown[key] = true\n    if (this.specialKeyDown() && !(evt.ctrlKey || evt.metaKey)) {\n      lively.selection.disabled = true\n      if (!evt.ctrlKey && !evt.altKey && !evt.altKey) {\n        // console.log('disable ' + evt.keyCode)\n        evt.stopPropagation()\n        evt.preventDefault()\n      }\n      var hand = await lively.ensureHand();\n      if (hand) {\n        hand.style.visibility = \"visible\"\n        var info = \"\"\n        // #KeyboardShortcut HOLD-S+Drag create shape\n        if (this.keysDown[\"S\"]) {\n          info = \"shape\"\n        }\n        // #KeyboardShortcut HOLD-C+Drag create connector\n        if (this.keysDown[\"C\"]) {\n          info = \"connect\"\n        }\n        // #KeyboardShortcut HOLD-T+Drag create text\n        if (this.keysDown[\"T\"]) {\n          info = \"text\"\n        }\n        // #KeyboardShortcut HOLD-D+Drag create svg path\n        if (this.keysDown[\"D\"]) {\n          info = \"draw\"\n        }\n        // #KeyboardShortcut HOLD-F+Drag create freehand drawing\n        if (this.keysDown[\"F\"]) {\n          info = \"freehand\"\n        }\n\n        if (hand.info)\n          hand.info.textContent = info;\n          hand.info.style.userSelect = \"none\"\n      }\n    }\n  }\n  \n  static changeFontSize(element, factor) {\n      if (element) {\n        var fontSize = element.style.fontSize\n        if (!fontSize || !fontSize.match(/%$/)) {\n          fontSize = \"100%\"\n        }    \n        fontSize = \"\" + (Math.round(Number(fontSize.replace(/%/,\"\")) * factor)) + \"%\"\n        element.style.fontSize = fontSize\n        // lively.notify(\"font size: \" +  element.style.fontSize)\n      }\n  }  \n\n  \n  static changeCurrentFontSize(factor) {\n    var range = window.getSelection().getRangeAt(0);\n    var element = range.commonAncestorContainer.parentElement\n    var oldSize = element.style.fontSize\n\n    // make a new region \n    document.execCommand(\"styleWithCSS\", true, true)\n    document.execCommand(\"fontSize\", true, 1)    \n    element = window.getSelection().getRangeAt(0).commonAncestorContainer.parentElement\n    element.style.fontSize  = oldSize.match(\"%$\") ? oldSize : \"100%\";\n    this.changeFontSize(element, factor)\n  }  \n\n\n  static changeTextColor() {\n    var color = \"orange\"; // #TODO make this interactive... \n    var element = window.getSelection().getRangeAt(0).startContainer.parentElement;\n    if (element.style.color == color) {\n      color = \"black\"; // TODO how can we unset a color? \n    }\n    document.execCommand(\"styleWithCSS\", true, true)\n    document.execCommand(\"foreColor\", true, color)\n  }  \n  \n  static changeHiliteColor() {\n    var color = \"yellow\"; // #TODO make this interactive... \n    var element = window.getSelection().getRangeAt(0).startContainer.parentElement;\n    if (element.style.color == color) {\n      color = \"transparent\"; // TODO how can we unset a color? \n    }\n    document.execCommand(\"styleWithCSS\", true, true)\n    document.execCommand(\"hiliteColor\", true, color)\n  }  \n  \n  \n  static async onKeyUp(evt) {\n    var key = String.fromCharCode(evt.keyCode)\n    this.keysDown[key] = false\n    \n    // console.log(\"\" + Date.now() + \" up \" + key + \" \" +  evt.altKey)\n    \n    if (key == \"D\" || key == \"C\") {\n      this.currentPath = null;\n      HaloService.showHaloItems()\n    }\n    \n    lively.selection.disabled = false\n  \n    var hand = await lively.ensureHand();\n    if (hand) {\n      hand.style.visibility = \"hidden\"\n      if (hand.info) hand.info.textContent = \"\"\n    }\n    // if (this.lastElement)\n    //   this.lastElement.focus(); // no, we can focus.... and continue typing\n\n    if (evt.altKey &&   evt.keyCode == 187 /* + */) {\n      this.changeCurrentFontSize(1.1)\n    }\n    \n    if (evt.altKey &&  evt.keyCode == 189 /* - */) {\n      this.changeCurrentFontSize(0.9)\n    }\n\n    if (evt.altKey && key == \"C\") {\n      this.changeTextColor()\n    }\n\n    if (evt.altKey && key == \"H\") {\n      this.changeHiliteColor()\n    }\n  }\n  \n  static specialKeyDown() {\n    return this.keysDown[\"S\"] || this.keysDown[\"T\"] || this.keysDown[\"C\"] || this.keysDown[\"D\"] || this.keysDown[\"F\"]\n  }\n  \n  static eventPosition(evt) {\n     return pt(evt.clientX, evt.clientY)\n  }\n  \n  static async startShapeDrawing(evt) {\n    var shape = document.createElement(\"div\")\n    shape.style.backgroundColor = \"lightgray\"\n    shape.style.border = \"1px solid gray\"    \n    this.openAsLivelyContent(shape, evt)\n    return shape\n  }\n  \n  static async startTextDrawing(evt) {\n    var text = document.createElement(\"div\")\n    text.textContent = \"\"\n    text.classList.add(\"lively-text\")\n    \n    // #TODO move this to CSS as defaults?\n    text.style.width = \"auto\"\n    text.style.height = \"auto\"\n    text.style.whiteSpace = \"nowrap\";\n    text.style.padding = \"3px\"\n    \n    text.contentEditable = true\n    this.openAsLivelyContent(text, evt)\n    return text\n  }\n  \n   static async onMouseDown(evt) {    \n    if (!this.specialKeyDown()) return\n    evt.stopPropagation()\n    evt.preventDefault()\n    document.documentElement.style.touchAction = \"none\"    \n    this.ensureTargetContainer(evt)\n    if (this.keysDown[\"S\"]) {\n      await this.startShapeDrawing(evt)\n    } else if (this.keysDown[\"T\"]) {\n      await this.startTextDrawing(evt)\n    }  else if (this.keysDown[\"C\"]) {\n      await this.startConnectorDrawing(evt)\n    }  else if (this.keysDown[\"D\"]) {\n      await this.startPathDrawing(evt)\n    } else if (this.keysDown[\"F\"]) {\n      await this.startFreehandDrawing(evt)\n    }\n  }\n\n  static async startConnectorDrawing(evt) {\n    var connector = document.createElement(\"lively-connector\")\n    await lively.components.openIn(this.targetContainer, connector)\n    \n    // var connector = await (<lively-connector></lively-connector>)\n    // var connector = await lively.create(lively-connector, this.targetContainer)\n    \n    lively.setGlobalPosition(connector, pt(evt.clientX, evt.clientY))\n    window.that = connector\n    HaloService.showHalos(connector)\n    let cp = lively.halo.ensureControlPoint(connector.getPath(), 1, true)\n    this.currentControlPoint = cp\n    cp.setVerticePosition(pt(0,0))\n    cp.start(evt, connector)\n    this.currentPath = connector        \n    this.openAsLivelyContent(connector, evt)\n    if (cp.targetElement) {\n      connector.connectFrom(cp.targetElement)\n    }   \n    connector.connectTo(lively.hand)\n    return connector\n  }\n  \n  static async startFreehandDrawing(evt) {\n    var freehand = await lively.create(\"lively-drawboard\")\n    freehand.freehand()\n    this.currentFreehand = freehand\n    this.openAsLivelyContent(freehand, evt)\n    lively.setExtent(freehand, pt(100,100))\n    freehand.onPointerDown(evt)\n    return freehand\n  }\n  \n  static async startPathDrawing(evt) {\n    var continueDrawing = true && this.currentPath;\n    if (!this.currentPath) {\n      var path = await lively.openPart(\"path\", this.targetContainer)\n      this.currentPath = path\n      window.that = path\n      this.openAsLivelyContent(path, evt) \n      // split position in global and local part to snap locally...\n      var offset = lively.getGlobalPosition(path.parentElement)\n      var pos = pt(evt.clientX, evt.clientY).subPt(offset)\n      \n      if (!evt.ctrlKey) {\n        pos = Grid.snapPt(pos, 10, 5) \n      }\n      HaloService.showHalos(path)\n      lively.setPosition(path, pos)\n    } \n    var svgPath = this.currentPath.querySelector(\"path\")\n    var vertices = SVG.getPathVertices(svgPath)\n    let cp = lively.halo.ensureControlPoint(svgPath, vertices.length - 1)\n    this.currentControlPoint = cp\n    if (continueDrawing) {\n      cp.addControlPoint()        \n    } else {\n      cp.setVerticePosition(pt(0,0))\n    }\n    cp.start(evt, this.currentPath)\n    if (continueDrawing) {\n      cp.eventOffset = this.lastMouseUpPos // #ContinueHere \n    }\n    return path\n  }\n  \n  static openAsLivelyContent(div, evt) {\n    div.classList.add(\"lively-content\")\n    this.currentElement = div\n    this.targetContainer.appendChild(div)\n    var pos = this.eventPosition(evt)    \n    \n    lively.setGlobalPosition(div, pos)\n    this.lastMouseDown = pos;\n    return div\n  }\n  \n  static ensureTargetContainer(evt) {\n    \n    var targetContainer = evt.composedPath().find(ea => ea.localName == \"lively-figure\")\n    if (!targetContainer) {\n      targetContainer = evt.composedPath().find(ea => ea.tagName == \"LIVELY-CONTAINER\")\n    }\n    if (targetContainer) {\n      lively.showElement(targetContainer)\n      this.targetContainer = targetContainer\n    } else {\n      this.targetContainer = document.body\n    }\n  }\n  \n  static onMouseMove(evt) {\n    if (this.specialKeyDown()) {\n        lively.setGlobalPosition(lively.hand, pt(evt.clientX - 2, evt.clientY -2))    \n    }\n    if (this.currentControlPoint) {\n      this.currentControlPoint.move(evt)\n    }\n    if (this.currentFreehand) {\n      this.currentFreehand.onPointerMove(evt)\n    }\n    \n    if (!this.lastMouseDown || !this.currentElement) return;\n    var extent = this.eventPosition(evt).subPt(this.lastMouseDown)\n    if (!this.currentPath && !this.currentFreehand) {\n      lively.setExtent(this.currentElement, extent)\n    }\n  }\n\n  static onMouseUp(evt) {\n    if (!evt) return;\n    this.lastMouseUpPos = lively.getPosition(evt)\n    if (this.currentControlPoint) {\n      this.currentControlPoint.stop(evt)\n       if (!this.keysDown[\"T\"]) {\n          HaloService.hideHaloItems()        \n        } \n    }\n    if (this.currentFreehand) {\n      this.currentFreehand.onPointerUp(evt)      \n      var svg = this.currentFreehand.get(\"#svg\")\n      var path = svg.querySelector(\"path\")\n\n      var bounds = SVG.childBounds(svg)\n      var p1 = lively.getGlobalPosition(this.currentFreehand)\n      if (!bounds) return;\n      \n      var p2 = pt(bounds.x, bounds.y)\n      var delta = p2.subPt(p1)\n\n      lively.moveBy(this.currentFreehand, delta)\n      lively.moveBy(path, delta.scaleBy(-1))\n      lively.setExtent(this.currentFreehand, pt(bounds.width, bounds.height))\n      \n      this.currentFreehand = null\n      this.currentElement = null\n      // lively.showElement(svg)\n  \n      // lively.setGlobalPosition(this.currentFreehand, bounds.topLeft())\n      // lively.setExtent(this.currentFreehand, pt(bounds.width, bounds.height))\n    } else if(this.currentElement) {\n      if (this.currentElement.classList.contains(\"lively-text\")) {\n        if (!this.keysDown[\"T\"]) {\n          this.currentElement.focus()        \n        } \n      }\n      this.lastMouseDown = null\n      this.currentElement = null\n      this.lastElement = this.currentElement\n      document.documentElement.style.touchAction = \"\"\n    } else {\n      this.lastElement = null\n    }\n    this.currentControlPoint = null\n    this.currentConnectFrom = null\n  }\n}\n\nGraffle.load()"]}