{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-croquet/src/components/widgets/lively-morph.js"],"names":["Morph","HTMLElement","connectedCallback","get","selector","getSubmorph","morph","querySelector","shadowRoot","setWindowSize","width","height","parentElement","style","windowTitle","string","_windowTitle","titleSpan","setAttribute","windowIcon","_windowIcon","getAllSubmorphs","morphs","Array","from","querySelectorAll","concat","filter","m","withAttributeDo","name","func","value","getAttribute","undefined","registerButtons","forEach","node","id","funcName","camelCase","replace","c","toUpperCase","addEventListener","evt","Function","alert","registerSignalEnter","rootElement","domain","lively","removeEventListener","code","target","dispatchEvent","CustomEvent","detail","registerAttributes","list","registerAttribute","Object","defineProperty","set","newValue","enumerable","configurable","toString","constructor","followURLonClick","element","url","window","getSelection","length","openBrowser","livelyUpdateStrategy"],"mappings":"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","file":"lively-morph.js","sourcesContent":["/*\n * Morph is a HtmlElement replacement with some API enhanncements\n */\n \n\n// #TODO all custom elements have to inherit from HTMLElement\nexport default class Morph extends HTMLElement {\n  /* \n   * Access subelments by name\n   * shortcut for querySelector and shadowRoot.querySelector t\n   * #FeatureIdea -- In Livel3, it could it also be used to look for owners and siblings  \n   */ \n  connectedCallback() {\n    // console.log('connected');\n  }\n  \n  get(selector) {\n    return this.getSubmorph(selector);\n  }\n\n  \n  // #Depricated, please use either \"get\" or \"querySelector\" directly\n  getSubmorph(selector) {\n    var morph = this.querySelector(selector);\n    if (!morph && this.shadowRoot) {\n      morph = this.shadowRoot.querySelector(selector);\n    }\n    return morph;\n  }\n  \n  setWindowSize(width, height) {\n    this.parentElement.style[\"width\"] = width + \"px\";\n    this.parentElement.style[\"height\"] = height + \"px\";\n  }\n\n  set windowTitle(string){\n    this._windowTitle = string;\n    // #TODO replace with connections\n    if (this.parentElement && this.parentElement.titleSpan) { // check for window?\n      this.parentElement.setAttribute(\"title\", string);\n    }\n  }\n  \n  get windowTitle(){\n    return this._windowTitle;\n  }\n\n  set windowIcon(string){\n    this._windowIcon = string;\n    // #TODO replace with connections\n    if (this.parentElement && this.parentElement.titleSpan) { // check for window?\n      this.parentElement.setAttribute(\"icon\", string);\n    }\n  }\n  \n  get windowIcon(){\n    return this._windowIcon;\n  }\n\n  getAllSubmorphs(selector) {\n    var morphs = Array.from(this.querySelectorAll(selector));\n    if (this.shadowRoot) {\n      morphs = morphs.concat(Array.from(this.shadowRoot.querySelectorAll(selector)));\n    }\n    \n    // morphs can contain null, if either none was found in this or this.shadowRoot\n    return morphs.filter(m => m);\n  }\n  \n  withAttributeDo(name, func) {\n    var value = this.getAttribute(name) \n    if (value !== undefined && value !== null) {\n      func(value)\n    }\n  }\n\n  registerButtons() {\n    // Just an experiment for having to write less code.... which ended up in having more code here ;-) #Jens\n    Array.from(this.shadowRoot.querySelectorAll('button')).forEach(node => {\n      var name = node.id;\n      var funcName = name.camelCase().replace(/^./, c => 'on'+ c.toUpperCase());\n      // console.log('register button ' + name)\n      node.addEventListener(\"click\", evt => {\n        if (this[funcName] instanceof Function) {\n          this[funcName](evt);\n        } else {\n          alert('No callback: ' +  funcName);\n        }\n      });\n    });\n  }\n  \n  /* \n    catches all enter keyup events and syntesizes a new enter event! \n  */\n  registerSignalEnter(rootElement = this) {\n    var domain = \"singnal-enter\"\n    lively.removeEventListener(domain, rootElement) // just in case...\n    lively.addEventListener(domain, rootElement, \"keyup\", evt => {\n      if(evt.code == \"Enter\") { \n        evt.target.dispatchEvent(new CustomEvent(\"enter-pressed\", { detail: evt })) \n      }  \n    })\n  }\n  \n  registerAttributes(list) {\n    for(let name of list) {\n      this.registerAttribute(name)\n    }\n  }\n  \n  registerAttribute(name) {\n    Object.defineProperty(this, name, {\n      get() { \n        return this.getAttribute(name); \n      },\n      set(newValue) { \n        this.setAttribute(name, newValue)\n      },\n      enumerable: true,\n      configurable: true\n    });\n  }\n\n  \n  \n  toString() {\n    return \"[\" + this.constructor.name + \"]\"\n  }\n  \n  followURLonClick(element, url) {\n    lively.removeEventListener(\"followurl\", element, \"click\")\n    lively.addEventListener(\"followurl\", element, \"click\", (evt) => {\n      // distinguish between clicking and selecting text\n      if(window.getSelection().toString().length == 0) {\n        lively.openBrowser(url)\n       }\n    })\n  }\n  \n  \n  // another option is 'inplace'\n  get livelyUpdateStrategy() { return 'migrate'; }\n}\n"]}