[KSS-checkins] r44818 - kukit/kukit.js/branch/ree-binding-improvements/kukit

reebalazs at codespeak.net reebalazs at codespeak.net
Sat Jul 7 03:23:36 CEST 2007


Author: reebalazs
Date: Sat Jul  7 03:23:34 2007
New Revision: 44818

Modified:
   kukit/kukit.js/branch/ree-binding-improvements/kukit/kssparser.js
   kukit/kukit.js/branch/ree-binding-improvements/kukit/resourcedata.js
Log:
Implement event binding based on the ids fetched dynamically from the dom

Modified: kukit/kukit.js/branch/ree-binding-improvements/kukit/kssparser.js
==============================================================================
--- kukit/kukit.js/branch/ree-binding-improvements/kukit/kssparser.js	(original)
+++ kukit/kukit.js/branch/ree-binding-improvements/kukit/kssparser.js	Sat Jul  7 03:23:34 2007
@@ -624,6 +624,8 @@
     if (pseudotoken.value.arg.isMethod) {
         // we have a param provider here. Just store.
         ppid = pseudotoken.value.arg;
+        // Check its syntax too.
+        ppid.check(kukit.pprovidersGlobalRegistry);
     } else {
         // just an id. Express in txt.
         id = pseudotoken.value.arg.txt;

Modified: kukit/kukit.js/branch/ree-binding-improvements/kukit/resourcedata.js
==============================================================================
--- kukit/kukit.js/branch/ree-binding-improvements/kukit/resourcedata.js	(original)
+++ kukit/kukit.js/branch/ree-binding-improvements/kukit/resourcedata.js	Sat Jul  7 03:23:34 2007
@@ -61,6 +61,9 @@
     ;;;     if (css != 'document' && css != 'behaviour') {
     ;;;         throw new kukit.err.rd.KssSelectorError('KssSpecialSelector "' + name + '" must have one of the allowed names');
     ;;;    }
+    ;;;     if (ppid) {
+    ;;;         throw new kukit.err.rd.KssSelectorError('KssSpecialSelector "' + name + '" must not stand with an event id acquired by parameter provider (' + ppid.methodname +  ')');
+    ;;;     }
     ;;; }
     this.css = css;
     this.name = name;
@@ -87,6 +90,42 @@
     }
 };
 
+kukit.rd.KssSelector.prototype.getId = function(node) {
+    // Gives the id depending on a node.
+     if (this.id) {
+        // Statically set.
+        return this.id;
+    } else {
+        // Evaluate it.
+        var id = this.ppid.pprovider.eval(this.ppid.args, node, {});
+        // check that the id is not empty or null!
+        if (! id) {
+            ;;; var namestr;
+            ;;; if (this.namespace) {
+            ;;;     namestr = this.namespace + '-' + this.name;
+            ;;; } else {
+            ;;;     namestr = this.name;
+            ;;; }
+            ;;; kukit.E = 'Did not get a valid state id, when evaluated the pprovider "' + this.ppid.methodname + '"';
+            ;;; kukit.E += ' in kss selector "' + namestr + '" css="' + this.css + '"';
+            throw kukit.E;
+        }
+        return id;
+    }
+};
+
+kukit.rd.KssSelector.prototype.getMergeId = function(node) {
+    // Gives the merge id depending on a node.
+    if (this.mergeid) {
+        // Statically set.
+        return this.mergeid;
+    } else {
+        // Evaluate it.
+        var id = this.getId(node);
+        this.mergeid = kukit.rd.makeMergeId(id, this.namespace, this.name);
+    }
+};
+
 /*
 * Kss parameter values. There are two kinds: text and method.
 *
@@ -214,9 +253,11 @@
     }
 };
 
-kukit.rd.EventRule.prototype.getBinderInfo = function() {
+kukit.rd.EventRule.prototype.getBinderInfo = function(node) {
+    // Figure out what will be the "state id" for the kss event rule.
+    var id = this.kss_selector.getId(node);
     // Gets the event instance for the rule.
-    return kukit.engine.binderInfoRegistry.getOrCreateBinderInfo(this.kss_selector.id, this.kss_selector.classname, 
+    return kukit.engine.binderInfoRegistry.getOrCreateBinderInfo(id, this.kss_selector.classname, 
         this.kss_selector.namespace);
 };
 
@@ -234,7 +275,7 @@
 kukit.rd.EventRule.prototype.bind = function(node) {
     // Creation of the binding oper
     var oper = new kukit.op.Oper();
-    var binderinfo = this.getBinderInfo();
+    var binderinfo = this.getBinderInfo(node);
     oper.node = node;
     oper.eventrule = this;
     oper.binderinstance = binderinfo.binderinstance;
@@ -271,9 +312,6 @@
     ;;;     if (this.kss_selector.id != other.kss_selector.id) {
     ;;;         throw "Differing kss selector ids in event rule merge";
     ;;;     }
-    ;;;     if (this.kss_selector.classname != other.kss_selector.classname) {
-    ;;;         throw "Differing kss selector classes in event rule merge";
-    ;;;     }
     ;;; }
     ;;; if (this.kss_selector.name != other.kss_selector.name) {
     ;;;     throw "Differing kss selector names in event rule merge";
@@ -288,7 +326,7 @@
     ;;;     kukit.logDebug('Merged rule ' + this.mergednr + ' mergeid ' + this.kss_selector.mergeid);
 };
 
-kukit.rd.EventRule.prototype.mergeIntoDict = function(dict, key, eventrule) {
+kukit.rd.EventRule.prototype.mergeIntoDict = function(dict, key) {
     // Merge into the given dictionary by given key.
     // If possible, store the genuine rule first - if not,
     // clone it and do a merge. Never destroy the genuine
@@ -296,7 +334,7 @@
     var mergedrule = dict[key];
     if (typeof(mergedrule) == 'undefined') {
         // there was no rule
-        dict[key] = eventrule;
+        dict[key] = this;
     } else {
         // we have to merge the rule
         if (! mergedrule.isMerged()) {
@@ -304,7 +342,7 @@
             mergedrule = mergedrule.cloneForMerge();
             dict[key] = mergedrule;
         }
-        mergedrule.merge(eventrule);
+        mergedrule.merge(this);
     }
 };
 
@@ -601,7 +639,7 @@
         this.nodes[nodehash] = nodeval;
     }
     // Merge into the dict
-    eventrule.mergeIntoDict(nodeval.val, eventrule.kss_selector.mergeid, eventrule);
+    eventrule.mergeIntoDict(nodeval.val, eventrule.kss_selector.getMergeId(node));
 };
 
 kukit.rd.RuleTable.prototype.bindall = function(phase) {
@@ -669,7 +707,8 @@
     ;;;     throw 'Unknown method rule category "' + category + '"';
     ;;; }
     // Merge into the corresponding category
-    eventrule.mergeIntoDict(dict, eventrule.kss_selector.mergeid, eventrule);
+    // mergeid must be set on kss selector already.
+    eventrule.mergeIntoDict(dict, eventrule.kss_selector.getMergeId());
 };
 
 kukit.rd.MethodTable.prototype.getMergedRule = function(category, name, binderinstance) {


More information about the Kukit-checkins mailing list