{"version":3,"sources":["https://lively-kernel.org/lively4/lively-connectors/src/components/tools/lively-connection-editor.js"],"names":["Morph","Connection","Rasterize","CloneDeepHTML","LivelyConnectionEditor","initialize","registerButtons","activeChanged","startDrawingArrowToSource","get","getAttribute","saveConnection","setConnection","connection","getClassName","addPictureForElement","element","container","copiedSource","deepCopyAsHTML","setGlobalPosition","pt","appendChild","chooseNewElement","isSource","addEventListener","document","e","onPointerMove","capture","onPointerUp","saveNewElement","object","elementUnderHand","evt","path","composedPath","showElement","removeEventListener","morph","sourcePicture","targetPicture","toString","activityCheckbox","onNewSourceButton","onNewTargetButton","onDrawConnectionArrowButton","onDestroyButton","remove","onSaveButton","trackingCodeField","modifyingCodeField","onCopyButton","copiedConnection","openEditorForConnection","editor","openComponentInWindow","onToggleDirectionButton","from","to","line","getGlobalCenter","showPath","livelyPrepareSave","setAttribute","livelyPreMigrate","livelyMigrate","other","livelyInspect","contentNode","inspector","livelyExample"],"mappings":"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","file":"lively-connection-editor.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport Connection from \"src/components/halo/Connection.js\";\nimport Rasterize, { CloneDeepHTML } from 'src/client/rasterize.js';\n\nexport default class LivelyConnectionEditor extends Morph {\n  async initialize() {\n    this.windowTitle = \"LivelyConnectionEditor\";\n    this.registerButtons();\n    this.activityCheckbox.addEventListener(\"click\", () => this.activeChanged());\n    this.sourcePicture.addEventListener('mouseenter', () => this.startDrawingArrowToSource(this.sourcePicture.children[0], this.connection.getSource()))\n    this.targetPicture.addEventListener('mouseenter', () => this.startDrawingArrowToSource(this.targetPicture.children[0], this.connection.getTarget()))\n    this.get(\"#labelField\").value = this.getAttribute(\"data-mydata-label\") || 0;\n    this.trackingCodeField.editorLoaded().then(() => {this.trackingCodeField.doSave = () => this.saveConnection()})\n    this.modifyingCodeField.editorLoaded().then(() => {this.modifyingCodeField.doSave = () => this.saveConnection()})\n  }\n\n  setConnection(connection) {\n    this.connection = connection;\n    this.get(\"#labelField\").value = this.connection.getLabel();\n    this.get(\"#sourceLabel\").innerHTML = 'Source: ' + this.getClassName(this.connection.getSource());\n    this.get(\"#targetLabel\").innerHTML = 'Target: ' + this.getClassName(this.connection.getTarget());\n    this.activityCheckbox.checked = this.connection.isActive;\n    this.addPictureForElement(this.connection.getSource(), this.sourcePicture);\n    this.addPictureForElement(this.connection.getTarget(), this.targetPicture);\n    this.get(\"#trackingCodeField\").editorLoaded().then(() => this.get('#trackingCodeField').value = this.connection.getTrackingCode())\n    this.get(\"#modifyingCodeField\").editorLoaded().then(() => this.get('#modifyingCodeField').value = this.connection.getModifyingCode())\n  }\n\n  addPictureForElement(element, container) {\n    let copiedSource = CloneDeepHTML.deepCopyAsHTML(element);\n    document.body.appendChild(copiedSource);\n    lively.setGlobalPosition(copiedSource, lively.pt(0, 0));\n    container.innerHTML = '';\n    container.appendChild(copiedSource);\n    copiedSource.style.position = 'relative';\n    copiedSource.style.top = '0px';\n    copiedSource.style.left = '0px';\n  }\n\n  chooseNewElement(isSource) {\n    this._toBeChangedElementIsSource = isSource;\n    \n     lively.addEventListener(\"Connectors\", document.body.parentElement, \"pointermove\",\n      e => this.onPointerMove(e), { capture: true });\n    lively.addEventListener(\"Connectors\", document.body.parentElement, \"pointerup\",\n      e => this.onPointerUp(e), { capture: true });\n  }\n  \n  saveNewElement(object) {\n    if(this._toBeChangedElementIsSource) {\n      this.connection.setSource(object);\n    } else {\n      this.connection.setTarget(object);\n    }\n    this.setConnection(this.connection);\n  }\n  \n  elementUnderHand(evt) {\n    var path = evt.composedPath().slice(evt.composedPath().indexOf(evt.srcElement))\n    return path[0]\n  }\n  \n  onPointerMove(evt) {\n    if (this.dropIndicator) this.dropIndicator.remove()\n    this.dropTarget = this.elementUnderHand(evt)\n    if (this.dropTarget) {\n      this.dropIndicator = lively.showElement(this.dropTarget)\n      this.dropIndicator.style.border = \"3px dashed rgba(0,100,0,0.5)\"\n      this.dropIndicator.innerHTML = \"\"\n    }\n  }\n  \n  onPointerUp(evt) {\n    lively.removeEventListener(\"Connectors\")\n    \n    if (this.dropIndicator) this.dropIndicator.remove()\n    var morph = this.elementUnderHand(evt)\n    \n    this.saveNewElement(morph);\n  }\n  \n  get sourcePicture() {\n    return this.get(\"#sourcePicture\");\n  }\n\n  get targetPicture() {\n    return this.get(\"#targetPicture\");\n  }\n\n  getClassName(object){\n    return (object.constructor&&object.constructor.name) || object.toString()\n  }\n  \n  activeChanged() {\n    this.connection.setActive(this.activityCheckbox.checked);\n  }\n\n  get activityCheckbox() {\n    return this.get(\"#activityCheckbox\");\n  }\n  \n  onNewSourceButton() {\n    this.chooseNewElement(true)\n  }\n  \n  onNewTargetButton() {\n    this.chooseNewElement(false)\n  }\n\n  onDrawConnectionArrowButton() {\n    this.connection.drawConnectionLine();\n  }\n  \n  onDestroyButton() {\n    this.connection.destroy();\n    if (this.parentElement && this.parentElement.localName === 'lively-window') {\n      this.parentElement.remove();\n    } else {\n      this.remove();\n    }\n  }\n\n  onSaveButton() {\n    this.saveConnection();\n  }\n  \n  saveConnection() {\n    this.connection.setLabel(this.get(\"#labelField\").value);\n    this.trackingCodeField.editorLoaded().then(() => this.connection.setTrackingCode(this.trackingCodeField.value))\n    this.modifyingCodeField.editorLoaded().then(() => this.connection.setModifyingCode(this.modifyingCodeField.value))\n  }\n  \n  get trackingCodeField() {\n    return this.get(\"#trackingCodeField\")\n  }\n  \n  get modifyingCodeField() {\n    return this.get(\"#modifyingCodeField\")\n  }\n  \n  onCopyButton() {\n    let copiedConnection = this.connection.copyAndActivate();\n    this.openEditorForConnection(copiedConnection);\n  }\n  \n  async openEditorForConnection(connection) {\n    let editor = await lively.openComponentInWindow('lively-connection-editor')\n    editor.setConnection(connection)\n  }\n  \n  onToggleDirectionButton() {\n    this.connection.toggleDirection();\n    this.setConnection(this.connection);\n  }\n\n  startDrawingArrowToSource(from, to) {\n    let line = [lively.getGlobalCenter(from), lively.getGlobalCenter(to)];\n    lively.showPath(line, \"rgba(80,180,80,1)\", true);\n  }\n  \n  /* Lively-specific API */\n\n  // store something that would be lost\n  livelyPrepareSave() {\n    this.setAttribute(\"data-mydata-label\", this.get(\"#labelField\").value)\n  }\n\n  livelyPreMigrate() {\n    // is called on the old object before the migration\n  }\n\n  livelyMigrate(other) {\n    this.setConnection(other.connection);\n  }\n\n  livelyInspect(contentNode, inspector) {\n    // do nothing\n  }\n\n  async livelyExample() {\n    // this customizes a default instance to a pretty example\n    this.setConnection(new Connection(1, 'value', 2, 'value', false));\n  }\n\n}"]}