From a3eaffa666f6cefa1449ba73b7c089384e9588dd Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Wed, 16 Oct 2013 16:30:06 +0100 Subject: [PATCH] Add a linkcatcher widget --- core/modules/new_widgets/linkcatcher.js | 87 +++++++++++++++++++++++++ core/modules/new_widgets/tempwidgets.js | 1 - 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 core/modules/new_widgets/linkcatcher.js diff --git a/core/modules/new_widgets/linkcatcher.js b/core/modules/new_widgets/linkcatcher.js new file mode 100644 index 000000000..f5afb1767 --- /dev/null +++ b/core/modules/new_widgets/linkcatcher.js @@ -0,0 +1,87 @@ +/*\ +title: $:/core/modules/new_widgets/linkcatcher.js +type: application/javascript +module-type: new_widget + +Linkcatcher widget + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var Widget = require("$:/core/modules/new_widgets/widget.js").widget; + +var LinkCatcherWidget = function(parseTreeNode,options) { + this.initialise(parseTreeNode,options); + this.addEventListeners([ + {type: "tw-navigate", handler: "handleNavigateEvent"} + ]); +}; + +/* +Inherit from the base widget class +*/ +LinkCatcherWidget.prototype = new Widget(); + +/* +Render this widget into the DOM +*/ +LinkCatcherWidget.prototype.render = function(parent,nextSibling) { + this.parentDomNode = parent; + this.computeAttributes(); + this.execute(); + this.renderChildren(parent,nextSibling); +}; + +/* +Compute the internal state of the widget +*/ +LinkCatcherWidget.prototype.execute = function() { + // Get our parameters + this.catchTo = this.getAttribute("to"); + this.catchMessage = this.getAttribute("message"); + this.catchSet = this.getAttribute("set"); + this.catchSetTo = this.getAttribute("setTo"); + // Construct the child widgets + this.makeChildWidgets(); +}; + +/* +Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering +*/ +LinkCatcherWidget.prototype.refresh = function(changedTiddlers) { + var changedAttributes = this.computeAttributes(); + if(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) { + this.refreshSelf(); + return true; + } else { + return this.refreshChildren(changedTiddlers); + } +}; + +/* +Handle a tw-navigate event +*/ +LinkCatcherWidget.prototype.handleNavigateEvent = function(event) { + if(this.catchTo) { + this.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable("tiddlerTitle")); + } + if(this.catchMessage) { + this.dispatchEvent({ + type: this.catchMessage, + param: event.navigateTo + }); + } + if(this.catchSet) { + var tiddler = this.wiki.getTiddler(this.catchSet); + this.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo})); + } + return false; +}; + +exports.linkcatcher = LinkCatcherWidget; + +})(); diff --git a/core/modules/new_widgets/tempwidgets.js b/core/modules/new_widgets/tempwidgets.js index bdae08a62..34c5c77d9 100755 --- a/core/modules/new_widgets/tempwidgets.js +++ b/core/modules/new_widgets/tempwidgets.js @@ -14,7 +14,6 @@ Temporary shim widgets var Widget = require("$:/core/modules/new_widgets/widget.js").widget; -exports.linkcatcher = Widget; exports["import"] = Widget; })();