{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-constraints/src/components/demo/lively-petrinet.js"],"names":["Morph","ContextMenu","pt","LivelyPetrinet","initialize","registerButtons","addAllListeners","initializeConnectors","updateConnectorPosition","undefined","addEventListener","evt","onDblClick","onMouseMove","onContextMenu","place","addListeners","transition","connector","fromComponent","getComponentFrom","toComponent","error","newConnector","appendChild","connectPetrinetComponents","remove","attachedCallback","allElements","element","originalPosition","getPosition","setPosition","addPt","places","from","querySelectorAll","transitions","probTransitions","codeTransitions","connectors","start","setState","step","getCurrentStep","stepUntilFired","canFire","fire","persistPlaceState","onStep","placesBefore","getPlacesBefore","placesAfter","getPlacesAfter","firingIsPossible","every","transitionAllowsFiring","isActiveTransition","deleteToken","addToken","push","id","allComponents","component","persistState","stopPropagation","preventDefault","menu","addPlace","deletePlace","addTransition","deleteTransition","openIn","document","livelyExample","connector1","connector2","cursor","get","windowPosition","getGlobalPosition","x","y","offset","connectionIsStarted","startedConnection","deleteUnfinishedConnector","startConnectionFrom","append","connectFromPetrinetComponent","setExtent","connectTo","fromElement","manageNewConnection","updateAllConnectors","updateConnector","node","initializeElement","graphicElement","onElementClick","setInitialPosition","random","deleteSelectedElement","isSelectedElement","otherElement"],"mappings":"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","file":"lively-petrinet.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport ContextMenu from 'src/client/contextmenu.js';\nimport {pt} from 'src/client/graphics.js';\n\n\n\nexport default class LivelyPetrinet extends Morph {\n  \n  \n  \n  // Initialization\n  \n  \n\n  async initialize() {\n    this.windowTitle = \"LivelyPetrinet\";\n    this.registerButtons();\n    this.mouseIsOnNode = false;\n    \n    this.addAllListeners();\n    this.initializeConnectors();\n    this.updateConnectorPosition();\n    \n    this.selectedElement = undefined\n\n  }\n  \n  addAllListeners() {\n    lively.addEventListener(\"OnDblClick\", this, \"dblclick\", (evt) => this.onDblClick(evt))\n\n    lively.addEventListener(\"MouseDraw\", this, \"mousemove\", evt => this.onMouseMove(evt));\n    \n\n    this.addEventListener('contextmenu',  evt => this.onContextMenu(evt), false)\n    \n    for (const place of this.places) {\n      this.addListeners(place)\n    }\n    \n    for (const transition of this.transitions) {\n      this.addListeners(transition)\n    }\n  }\n  \n  // The connectors don't behave probperly when reloaded, because they are not connected to the components with the previous data-lively-id anymore. So we remove them and create new connectors instead (updating didnt properly work)\n  async initializeConnectors() {\n    for (const connector of this.connectors) {\n      const fromComponent = this.getComponentFrom(connector.fromComponentId);\n      const toComponent = this.getComponentFrom(connector.toComponentId);\n      if (!fromComponent || !toComponent) {\n        lively.error(\"Connector is not connected to component\");\n      }\n      const newConnector = await(<lively-petrinet-edge></lively-petrinet-edge>);\n      this.appendChild(newConnector);\n      newConnector.connectPetrinetComponents(fromComponent, toComponent);\n      connector.remove();\n    }\n  }\n  \n  attachedCallback() {\n    // The connector has some weird behaviour, in that it is not 100% connected to the elements in the beginning. We fix this by manually updating its position.\n    setTimeout(() => this.updateConnectorPosition(), 1000);\n  }\n  \n  updateConnectorPosition() {\n    // This is very hacky. We set a minimal (impossible to see) position change, which triggers the\n    // update position function of the edge. We observed that updateConnector() didn't work for this.\n    const allElements = [...this.places, ...this.transitions];\n    for (const element of allElements) {\n      const originalPosition = lively.getPosition(element);\n      lively.setPosition(element, originalPosition.addPt(pt(0,0.01)));\n    }\n  }\n  \n  \n  \n  // Access Methods\n  \n  \n  \n  get places() {\n    return Array.from(this.querySelectorAll(\"lively-petrinet-place\"));\n  }\n  \n  get transitions() {\n    const probTransitions = Array.from(this.querySelectorAll(\"lively-petrinet-prob-transition\"));\n    const codeTransitions = Array.from(this.querySelectorAll(\"lively-petrinet-code-transition\"));\n    return [...probTransitions, ...codeTransitions]\n  }\n  \n  get connectors() {\n    return Array.from(this.querySelectorAll(\"lively-petrinet-edge\"))\n  }\n  \n  \n  \n  // Methods For Simulation\n  \n  \n  \n  start() {\n    for (const place of this.places) {\n      place.start();\n    }\n  }\n  \n  setState(step) {\n    for (const place of this.places) {\n      place.setState(step);\n    }\n  }\n  \n  getCurrentStep() {\n    return this.places[0].history.length\n  }\n  \n  *stepUntilFired() {\n    while (true) {\n       for (const transition of this.transitions) {\n        if (this.canFire(transition)) {\n          this.fire(transition);\n          yield;\n        }\n        this.persistPlaceState()\n      }\n    }\n  }\n  \n  onStep() {\n       for (const transition of this.transitions) {\n          if (this.canFire(transition)) {\n            this.fire(transition)\n          }\n      }\n      this.persistPlaceState();\n  }\n  \n  canFire(transition) {\n      const placesBefore = this.getPlacesBefore(transition);\n      const placesAfter = this.getPlacesAfter(transition);\n      const firingIsPossible = placesBefore.every((place) => place.tokens.length > 0);\n      const transitionAllowsFiring = transition.isActiveTransition();\n      if (!firingIsPossible || !transitionAllowsFiring) {\n        return false;\n      }\n      return true;\n  }\n  \n  fire(transition) {\n      const placesBefore = this.getPlacesBefore(transition);\n      const placesAfter = this.getPlacesAfter(transition);\n      for (const place of placesBefore) {\n        place.deleteToken();\n      }\n      for (const place of placesAfter) {\n        place.addToken();\n      }\n      return\n  }\n\n  getPlacesBefore(transition) {\n    let placesBefore = [];\n    for (const connector of this.connectors) {\n      if (connector.toComponentId == transition.componentId) {\n        const fromComponent = this.getComponentFrom(connector.fromComponentId);\n        placesBefore.push(fromComponent);\n      }\n    }\n    if (placesBefore.length == 0) {\n      lively.error(\"Did not find any places from Connector\");\n    }\n    return placesBefore;\n  }\n\n  getPlacesAfter(transition) {\n    let placesAfter = [];\n    for (const connector of this.connectors) {\n      if (connector.fromComponentId == transition.componentId) {\n        const toComponent = this.getComponentFrom(connector.toComponentId);\n        placesAfter.push(toComponent);\n      }\n    }\n    if (placesAfter.length == 0) {\n      lively.error(\"Did not find any places from Connector\");\n    }\n    return placesAfter;\n  }\n  \n  getComponentFrom(id) {\n    const allComponents = [...this.places, ...this.transitions];\n    for (const component of allComponents) {\n      if (component.componentId == id) {\n        return component;\n      }\n    }\n  }\n  \n  persistPlaceState() {\n    for (const place of this.places) {\n      place.persistState();\n    }\n  }\n\n  \n  \n  // Lively Methods\n  \n  \n  \n  onContextMenu(evt) {\n    if (!evt.shiftKey) {\n        evt.stopPropagation();\n        evt.preventDefault();\n\n        var menu = new ContextMenu(this, [\n              [\"add place\", () => this.addPlace()],\n              [\"delete place\", () => this.deletePlace()],\n              [\"add transition\", () => this.addTransition()],\n              [\"delete transition\", () => this.deleteTransition()],\n          \n            ]);\n        menu.openIn(document.body, evt, this);\n        return true;\n      }\n  }\n  \n  async livelyExample() {\n    await this.addPlace();\n    this.places[0].addToken();\n    await this.addPlace();\n    await this.addTransition();\n    lively.setPosition(this.places[1], pt(500, 100))\n    lively.setPosition(this.transitions[0], pt(300, 100));\n    const connector1 = await(<lively-petrinet-edge></lively-petrinet-edge>);\n    this.appendChild(connector1);\n    connector1.connectPetrinetComponents(this.places[0], this.transitions[0]);\n    const connector2 = await(<lively-petrinet-edge></lively-petrinet-edge>);\n    this.appendChild(connector2);\n    connector2.connectPetrinetComponents(this.transitions[0],this.places[1]);\n  }\n  \n  \n  \n  // Connector Creation\n  \n  \n  \n  async onMouseMove(evt) { \n    const cursor = this.get(\"#cursor\");\n    const windowPosition = lively.getGlobalPosition(this);\n    const x = evt.clientX - windowPosition.x;\n    const y = evt.clientY - windowPosition.y;\n    const offset = 5;\n    if (this.connectionIsStarted()) {\n      lively.setPosition(cursor, pt(x - offset,y - offset));\n    }\n  }\n  \n  connectionIsStarted() {\n    const cursor = this.get(\"#cursor\");\n    const startedConnection = cursor != null;\n    return startedConnection;\n  }\n  \n  onDblClick(evt) {\n    if (this.mouseIsOnNode || !this.connectionIsStarted())      {\n        return;\n    }\n    this.deleteUnfinishedConnector(this.get(\"#cursor\"),   this.unfinishedConnector);\n  }\n  \n  async deleteUnfinishedConnector(cursor, connector) {\n    cursor.remove();\n    connector.remove();\n  }\n  \n  async startConnectionFrom(element) {\n    //Create Connector\n    var connector = await (<lively-petrinet-edge></lively-petrinet-edge>);\n    this.append(connector);\n    connector.connectFromPetrinetComponent(element);\n    \n    // Create Cursor That Moves Connector\n    var cursor = await (<div></div>)\n    cursor.style.backgroundColor = \"blue\"\n    cursor.id = \"cursor\"\n    lively.setExtent(cursor, pt(5,5))\n    lively.setPosition(cursor, lively.getPosition(element));\n    this.append(cursor);\n    \n    //Connect Cursor To Connector\n    connector.connectTo(cursor);\n    this.unfinishedConnector = connector;\n\n    return connector\n  }\n  \n  async connectTo(element) {\n    if (!this.unfinishedConnector) {\n      return;\n    }\n    const fromElement = this.unfinishedConnector.fromElement;\n    if (fromElement == element) {\n      this.deleteUnfinishedConnector(this.get(\"#cursor\"), this.unfinishedConnector);\n      return\n    }\n    this.unfinishedConnector.connectToPetrinetComponent(element);\n    this.get(\"#cursor\").remove();\n  }\n  \n  async manageNewConnection(element) {\n    if (!this.connectionIsStarted()) {\n      await this.startConnectionFrom(element);\n    } else {\n      await this.connectTo(element);\n    }\n  }\n  \n  updateAllConnectors() {\n    for (const connector of this.connectors) {\n      connector.updateConnector();\n    }\n  }\n  \n  \n  \n  // Add And Delete Elements\n  \n  \n  \n  async addPlace() {\n      var node = await (<lively-petrinet-place></lively-petrinet-place>);\n      this.initializeElement(node);\n      this.appendChild(node);\n  }\n  \n  async addListeners(element) {\n      element.onmouseover = () => this.mouseIsOnNode = true;\n      element.onmouseout = () => this.mouseIsOnNode = false;\n      lively.addEventListener(\"onDblClick\", element.graphicElement(), \"dblclick\", () =>     this.manageNewConnection(element));\n      lively.addEventListener(\"lively\", element, \"click\", (evt) => this.onElementClick(evt, element))\n  }\n  \n  setInitialPosition(element) {\n      var x = Math.random() * 50 + 50;\n      var y = Math.random() * 50 + 50;\n      lively.setPosition(element, pt(x,y));\n  }\n  \n  async initializeElement(element) {\n      this.setInitialPosition(element);\n      this.addListeners(element);\n  }\n\n  \n  async addTransition() {\n    var transition = await (<lively-petrinet-prob-transition></lively-petrinet-prob-transition>);\n    this.initializeElement(transition);\n    this.appendChild(transition);\n  }\n  \n  deleteSelectedElement(){\n    this.selectedElement.remove();\n  }\n  \n  isSelectedElement(element){\n    return element == this.selectedElement;\n  }\n\n  onElementClick(evt, element) {\n    evt.preventDefault();\n    evt.stopPropagation();\n    element.graphicElement().style.border = \"1px solid red\";\n    this.selectedElement = element;\n    for (const otherElement of [...this.transitions, ...this.places]) {\n      if (otherElement != element) {\n        otherElement.graphicElement().style.border = \"1px solid transparent\";\n      }\n    }\n  }\n  \n  \n\n}"]}