TiddlyWiki5/core/modules/new_widgets/button.js

148 lines
4.0 KiB
JavaScript
Raw Normal View History

2013-10-13 20:31:00 +00:00
/*\
title: $:/core/modules/new_widgets/button.js
type: application/javascript
module-type: new_widget
Button widget
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Widget = require("$:/core/modules/new_widgets/widget.js").widget;
var ButtonWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
};
/*
Inherit from the base widget class
*/
ButtonWidget.prototype = new Widget();
/*
Render this widget into the DOM
*/
ButtonWidget.prototype.render = function(parent,nextSibling) {
var self = this;
// Remember parent
this.parentDomNode = parent;
// Compute attributes and execute state
this.computeAttributes();
this.execute();
// Create element
var domNode = this.document.createElement("button");
// Assign classes
var classes = this["class"].split(" ") || [];
if(this.set && this.setTo && this.selectedClass) {
if(this.isSelected()) {
classes.push(this.selectedClass.split(" "));
}
}
domNode.className = classes.join(" ");
// Add a click event handler
domNode.addEventListener("click",function (event) {
var handled = false;
if(self.message) {
self.dispatchMessage(event);
handled = true;
}
if(self.popup) {
self.triggerPopup(event);
handled = true;
}
if(self.set) {
self.setTiddler();
handled = true;
}
if(handled) {
event.preventDefault();
event.stopPropagation();
}
return handled;
},false);
// Insert element
parent.insertBefore(domNode,nextSibling);
this.renderChildren(domNode,null);
this.domNodes.push(domNode);
};
ButtonWidget.prototype.isSelected = function() {
2013-10-14 12:52:03 +00:00
var tiddler = this.wiki.getTiddler(this.set);
2013-10-13 20:31:00 +00:00
return tiddler ? tiddler.fields.text === this.setTo : false;
};
ButtonWidget.prototype.dispatchMessage = function(event) {
this.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable("tiddlerTitle")});
};
ButtonWidget.prototype.triggerPopup = function(event) {
$tw.popup.triggerPopup({
domNode: this.domNodes[0],
2013-10-14 12:52:03 +00:00
title: this.popup,
2013-10-13 20:31:00 +00:00
wiki: this.wiki
});
};
ButtonWidget.prototype.setTiddler = function() {
2013-10-14 12:52:03 +00:00
var tiddler = this.wiki.getTiddler(this.set);
this.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.set, text: this.setTo}));
2013-10-13 20:31:00 +00:00
};
/*
Compute the internal state of the widget
*/
ButtonWidget.prototype.execute = function() {
// Get attributes
this.message = this.getAttribute("message");
this.param = this.getAttribute("param");
this.set = this.getAttribute("set");
this.setTo = this.getAttribute("setTo");
this.popup = this.getAttribute("popup");
this.hover = this.getAttribute("hover");
this.qualifyTiddlerTitles = this.getAttribute("qualifyTiddlerTitles");
this["class"] = this.getAttribute("class","");
this.selectedClass = this.getAttribute("selectedClass");
2013-10-14 12:52:03 +00:00
// Qualify tiddler titles if required
if(this.qualifyTiddlerTitles) {
var qualifier = this.getStateQualifier();
if(this.set) {
this.set = this.set + "-" + qualifier;
}
if(this.popup) {
this.popup = this.popup + "-" + qualifier;
}
}
2013-10-13 20:31:00 +00:00
// Make child widgets
this.makeChildWidgets();
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
ButtonWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
2013-10-14 12:52:03 +00:00
if(changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.qualifyTiddlerTitles || changedAttributes["class"] || changedAttributes.selectedClass || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup])) {
2013-10-13 20:31:00 +00:00
this.refreshSelf();
return true;
}
return this.refreshChildren(changedTiddlers);
};
/*
Remove any DOM nodes created by this widget or its children
*/
ButtonWidget.prototype.removeChildDomNodes = function() {
$tw.utils.each(this.domNodes,function(domNode) {
domNode.parentNode.removeChild(domNode);
});
this.domNodes = [];
};
exports.button = ButtonWidget;
})();