{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-eventsourcing/src/components/demo/lively-simulation-titlebar.js"],"names":["Morph","_","DEFAULT_NAME","UNNAMED","DEFAULT_BG_COLOR","HIGHLIGHT_BG_COLOR","LivelySimulationTitlebar","initialize","initializeDelete","initializeMenu","initializeDragDrop","initializeViewSwitch","initializeName","initializeLocate","name","cell","getCell","cellNameInput","get","setName","isMirrorCell","setAttribute","addEventListener","handleCellNameInputFocusOut","forEach","view","switchViewTo","menuIcon","handleMenuClick","locateIcon","handleLocateClick","deleteIcon","handleDelete","event","startGrabbing","simulation","cellNameProposal","getName","match","ensureUniqueCellName","shouldDelete","delete","openMenu","cellRef","getNormalizedName","getSimulation","toggleHighlight","resolve","create","livelyMenu","openOn","clone","toggleSkip","executeSelf","mirror","camelize","toAlphaNumeric","selector","shadowRoot","querySelector","str","replace","index","toLowerCase","toUpperCase","isFocused","isChildFocused","child","doc","document","getRootNode","highlight","menu","shouldSkip","execute"],"mappings":"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","file":"lively-simulation-titlebar.js","sourcesContent":["/*MD\n  ![](https://lively-kernel.org/lively4/lively4-core/demos/lively-simulation/screenshots/titlebar.png){width=500px}\nMD*/\n\n\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport _ from 'src/external/lodash/lodash.js';\n\nconst DEFAULT_NAME = 'New Cell';\nconst UNNAMED = 'Unnamed Cell';\nconst DEFAULT_BG_COLOR = '#778899';\nconst HIGHLIGHT_BG_COLOR = 'cornflowerblue';\n\nexport default class LivelySimulationTitlebar extends Morph {\n  \n  // life cycle\n  initialize() {\n    this.initializeDelete();\n    this.initializeMenu();\n    this.initializeDragDrop();\n    this.initializeViewSwitch();\n    this.initializeName();\n    this.initializeLocate();\n  }\n  \n  initializeName(name = DEFAULT_NAME) {\n    const cell = this.getCell();\n    const cellNameInput = this.get('#cellName');\n    this.setName(name);\n    if (cell && cell.isMirrorCell()) {\n      cellNameInput.setAttribute('disabled', true);\n    } else {\n      cellNameInput.addEventListener('focusout', () => this.handleCellNameInputFocusOut());\n    }\n  }\n  \n  initializeViewSwitch() {\n    _.forEach(['code', 'log', 'chart'], view => \n              this.get(`#${view}`).addEventListener('click', () => {\n      const cell = this.getCell();\n      if (!cell.switchViewTo) return;\n      cell.switchViewTo(`${view}View`);\n    }));\n  }\n  \n  initializeMenu() {\n    const menuIcon = this.get('#menu');\n    menuIcon.addEventListener('click', () => this.handleMenuClick());\n  }\n  \n  initializeLocate() {\n    const locateIcon = this.get('#locate');\n    locateIcon.addEventListener('click', () => this.handleLocateClick());\n  }\n  \n  initializeDelete() {\n    const deleteIcon = this.get('#delete');\n    deleteIcon.addEventListener('click', () => this.handleDelete());\n  }\n  \n  initializeDragDrop() {\n    this.get('#titleBar').addEventListener('pointerdown', event => {\n      const cell = this.getCell();\n      if (!cell || !cell.startGrabbing) return;\n      cell.startGrabbing(event, false)\n    });\n  }\n  \n  // event handler\n  handleCellNameInputFocusOut() {\n    const simulation = this.getCell().getSimulation();\n    if (!simulation.ensureUniqueCellName) return;\n    let cellNameProposal = this.getName().length ? this.getName() : UNNAMED;\n    if (!cellNameProposal.match(/^[a-zA-Z]/)) cellNameProposal = `Cell ${cellNameProposal}`;\n    this.setName(simulation.ensureUniqueCellName(cellNameProposal));\n  }\n  \n  handleDelete() {\n    const cell = this.getCell();\n    const shouldDelete = confirm(`Delete ${this.getName()}`);\n    if (shouldDelete && cell.delete) cell.delete();\n  }\n  \n  handleMenuClick() {\n    if (this.menu) {\n      this.menu.remove();\n      delete this.menu;\n    } else\n      this.openMenu();\n  }\n  \n  handleLocateClick() {\n    const cell = this.getCell();\n    if (!cell.getNormalizedName || !cell.getSimulation) return;\n    const cellRef = cell.getNormalizedName().toLowerCase();\n    const simulation = cell.getSimulation();\n    if (!simulation.toggleHighlight) return;\n    simulation.toggleHighlight(cellRef);\n  }\n\n  // other\n  openMenu() {\n    const cell = this.getCell();\n    const menuIcon = this.get('#menu');\n    return Promise.resolve(lively.create('lively-menu'))\n      .then(livelyMenu => {\n        this.menu = livelyMenu;\n        livelyMenu.openOn(menu(\n          (event) => cell.clone(event), \n          cell.shouldSkip, \n          () => cell.toggleSkip(), \n          () => cell.executeSelf(),\n          (event) => cell.mirror(event)));\n        this.shadowRoot.appendChild(livelyMenu);\n        livelyMenu.style.top = `${menuIcon.offsetHeight}px`;\n        setTimeout(() => livelyMenu.addEventListener('click', () => this.handleMenuClick()), 0);\n    });\n  }\n  \n  getNormalizedName() {\n    return this.camelize(this.toAlphaNumeric(this.getName()));\n  }\n  \n  getName() {\n    return this.get('#cellName').value.trim();\n  }\n  \n  setName(name) {\n    this.get('#cellName').value = name;\n  }\n  \n  get(selector) {\n    const { shadowRoot } = this;\n    return shadowRoot.querySelector(selector);\n  }\n  \n  camelize(str) {\n    // https://stackoverflow.com/questions/2970525/converting-any-string-into-camel-case\n    return str.replace(/(?:^\\w|[A-Z]|\\b\\w|\\s+)/g, function(match, index) {\n      if (+match === 0) return \"\"; // or if (/\\s+/.test(match)) for white spaces\n      return index === 0 ? match.toLowerCase() : match.toUpperCase();\n    });\n  }\n\n  toAlphaNumeric(str) {\n    return str.replace(/\\W/g, '');\n  }\n  \n  isFocused() {\n    return this.isChildFocused(this.get('#cellName'));\n  }\n  \n  isChildFocused(child, doc = document) {\n    if (doc.activeElement === child) return true;\n    if (doc.activeElement && doc.activeElement.shadowRoot)\n\t\t\treturn this.isChildFocused(child, doc.activeElement.shadowRoot)\n    return false;\n  }\n  \n  getCell() {\n    return this.getRootNode().host;\n  }\n  \n  highlight(highlight) {\n    this.get('#titleBar').style.backgroundColor = highlight ? HIGHLIGHT_BG_COLOR : DEFAULT_BG_COLOR;\n  }\n}\n\nconst menu = (clone, shouldSkip, toggleSkip, execute, mirror) => [\n  [\n    \"Clone\",\n    event => clone && clone(event),\n    \"\",\n    '<i class=\"fa fa-clone\"></i>'\n  ],\n  [\n    shouldSkip ? 'Enable' : 'Skip',\n    () => toggleSkip && toggleSkip(),\n    \"\",\n    shouldSkip ? '<i class=\"fa fa-play\"></i>' : '<i class=\"fa fa-forward\"></i>'\n  ],\n  [\n    'Execute',\n    () => execute && execute(),\n    \"\",\n    '<i class=\"fa fa-cogs\"></i>'\n  ],\n  [\n    'Mirror',\n    event => mirror && mirror(event),\n    \"\",\n    '<i class=\"fa fa-anchor\"></i>'\n  ]\n]"]}