/*\ title: $:/core/modules/widgets/messagecatcher.js type: application/javascript module-type: widget Message catcher widget \*/ (function(){ /*jslint node: true, browser: true */ /*global $tw: false */ "use strict"; var Widget = require("$:/core/modules/widgets/widget.js").widget; var MessageCatcherWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); }; /* Inherit from the base widget class */ MessageCatcherWidget.prototype = new Widget(); /* Render this widget into the DOM */ MessageCatcherWidget.prototype.render = function(parent,nextSibling) { var self = this; // Remember parent this.parentDomNode = parent; // Compute attributes and execute state this.computeAttributes(); this.execute(); // Helper to add an event handler var addEventHandler = function(type,actions) { if(type && actions) { var isActionStringExecuting = false; self.addEventListener( type, function(event) { // Don't trap the event if it came from one of our action handlers if(isActionStringExecuting) { return true; } // Collect all the event properties into variables var collectProps = function(obj,prefix) { prefix = prefix || ""; var props = {}, names = []; $tw.utils.each(obj,function(value,name) { if(["string","boolean","number"].indexOf(typeof value) !== -1) { names.push(name); props[prefix + "-" + name] = value.toString(); } }); props["list-" + prefix] = $tw.utils.stringifyList(names); return props; }; var variables = $tw.utils.extend( {}, collectProps(event.paramObject,"event-paramObject"), collectProps(event,"event"), { modifier: $tw.keyboardManager.getEventModifierKeyDescriptor(event) }); isActionStringExecuting = true; self.invokeActionString(actions,self,event,variables); isActionStringExecuting = false; return false; } ); } } // Add the main event handler addEventHandler(this.getAttribute("type"),this.getAttribute("actions")); // Add any other event handlers $tw.utils.each(this.attributes,function(value,key) { if(key.charAt(0) === "$") { addEventHandler(key.slice(1),value); } }); // Render children this.renderChildren(parent,null); }; /* Compute the internal state of the widget */ MessageCatcherWidget.prototype.execute = function() { // Make child widgets this.makeChildWidgets(); }; /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ MessageCatcherWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); if($tw.utils.count(changedAttributes) > 0) { this.refreshSelf(); return true; } return this.refreshChildren(changedTiddlers); }; exports.messagecatcher = MessageCatcherWidget; })();