diff --git a/js/App.js b/js/App.js index b6e76ec9d..4ffac0442 100644 --- a/js/App.js +++ b/js/App.js @@ -109,6 +109,16 @@ var App = function() { var div = document.createElement("div"); div.innerHTML = this.store.renderTiddler("text/html","PageTemplate"); document.body.appendChild(div); + var me = this; + window.setInterval(function() { + me.store.addTiddler(new Tiddler({ + title: "TiddlyWiki5", + text: "This is a newly created tiddler!" + })); + },3000); + this.store.addEventListener("",function() { + me.store.refreshDomNode(div,me.store.getTiddler("PageTemplate")); + }); } }; diff --git a/js/WikiStore.js b/js/WikiStore.js index 6552c697c..8000d84c8 100755 --- a/js/WikiStore.js +++ b/js/WikiStore.js @@ -22,6 +22,9 @@ var WikiStore = function WikiStore(options) { this.macros = {}; this.tiddlerSerializers = {}; this.tiddlerDeserializers = {}; + this.eventListeners = []; // Array of {filter:,listener:} + this.eventsTriggered = false; + this.changedTiddlers = {}; // Hashmap of {title: "created|modified|deleted"} this.sandbox = options.sandbox; this.shadows = options.shadowStore !== undefined ? options.shadowStore : new WikiStore({ shadowStore: null @@ -42,6 +45,73 @@ WikiStore.prototype.registerTiddlerDeserializer = function(extension,mimeType,de this.tiddlerDeserializers[mimeType] = deserializer; }; +WikiStore.prototype.addEventListener = function(filter,listener) { + this.eventListeners.push({ + filter: filter, + listener: listener + }); +}; + +WikiStore.prototype.removeEventListener = function(listener) { + for(var c=this.eventListeners.length-1; c>=0; c--) { + var l = this.eventListeners[c]; + if(l.listener === listener) { + this.eventListeners.splice(c,1); + } + } +}; + +/* +Causes a tiddler to be marked as changed, so that event listeners are triggered for it + type: Type of change to be registered for the tiddler "created", "modified" or "deleted" +If the tiddler is already touched, the resultant touch type is as follows: + +If the tiddler is already marked "created", +... attempts to mark it "modified" leave it "created" +... attempts to mark it "deleted" succeed + +If the tiddler is already marked "modified", +... attempts to mark it "deleted" succeed + +If the tiddler is already marked "deleted", +... attempts to mark it "created" succeed +... attempts to mark it "modified" fail + +*/ +WikiStore.prototype.touchTiddler = function(type,title) { + var existingType = this.changedTiddlers[title]; + if(existingType === undefined && type === "modified") { + type = "created"; + } + if(existingType === "modified" && type === "created") { + type = "modified"; + } + if(existingType === "deleted" && type === "created") { + type = "modified"; + } + this.changedTiddlers[title] = type; + this.triggerEvents(); +}; + +/* +Trigger the execution of the event dispatcher at the next tick, if it is not already triggered +*/ +WikiStore.prototype.triggerEvents = function() { + if(!this.eventsTriggered) { + var me = this; + utils.nextTick(function() { + var changes = me.changedTiddlers; + me.changedTiddlers = {}; + me.eventsTriggered = false; + for(var e=0; e