Revision: 4060
          http://vexi.svn.sourceforge.net/vexi/?rev=4060&view=rev
Author:   mkpg2
Date:     2011-03-21 02:02:47 +0000 (Mon, 21 Mar 2011)

Log Message:
-----------
Improve. Much cleaner to have cell dynamically update.

Modified Paths:
--------------
    trunk/org.vexi-vexi.demo/src_main/org/vexi/demo/feature/table_dynamic.t

Modified: 
trunk/org.vexi-vexi.demo/src_main/org/vexi/demo/feature/table_dynamic.t
===================================================================
--- trunk/org.vexi-vexi.demo/src_main/org/vexi/demo/feature/table_dynamic.t     
2011-03-21 01:55:25 UTC (rev 4059)
+++ trunk/org.vexi-vexi.demo/src_main/org/vexi/demo/feature/table_dynamic.t     
2011-03-21 02:02:47 UTC (rev 4060)
@@ -10,6 +10,54 @@
     static.name = "Table (Dynamic)";
     static.category = "Widgets";
 
+    // a yielding/thread safe prime calculator
+    static.newPrimeCalculator = function(){
+        var size = 1;
+        var array = [2];
+       var r = {};
+       
+       var isPrime = function(n) {
+            var rootn = vexi.math.floor(vexi.math.sqrt(n));
+            var isPrime=true;
+            for (var i=0;;i++){
+                var d = array[i];
+                if(d>rootn) break;
+                if ((n%d)==0) {
+                   return false;
+                }
+            }
+            return true;
+        };
+               
+               var fillNext = function(){
+                       for (var i=array[size-1]+1; true; i++) {
+                if (isPrime(i)) {
+//                     vexi.log.info("prime " + size + " = " + i);
+                    array[size++] = i;
+                    return;
+                }
+            }
+        };
+        
+        r.get = function(n){
+               while(true){
+                       if(n>=size){
+                               fillNext();
+                                       vexi.thread.yield();                    
+                       }else{
+                               return array[n];
+                       }
+               }
+        };
+        
+        r.has = function(n){ return array[n]!=null; }
+        
+        r.getImmediate = function(n){ return array[n]; };
+        
+        return r;
+    };
+
+
     <ui:box orient="vertical">
         <lay:pad padding="10" text="A table populated dynamically with data - 
p(i) is the 'i'th prime" vshrink="true" />
         <wi:bevel form="down">
@@ -18,7 +66,7 @@
                     <column text="Index" minwidth="75"/>
                     <column text="0 - i" minwidth="75"/>
                     <column text="i + 1" minwidth="75"/>
-                    <column text="p(i)"  minwidth="75"/>
+                    <column text="p(i)"  minwidth="75" primes="true"/>
                 </head>
                 <body id="body" />
             </table>
@@ -26,51 +74,60 @@
         
         var N_ROWS = 20000;
                
-        var primes = function(){
-               var size = 1;
-               var array = [2];
-               var r = {};
-               
-               var isPrime = function(n) {
-                   var rootn = vexi.math.floor(vexi.math.sqrt(n));
-                   var isPrime=true;
-                   for (var i=0;;i++){
-                       var d = array[i];
-                       if(d>rootn) break;
-                       if ((n%d)==0) {
-                          return false;
-                       }
-                   }
-                   return true;
-               };
-                       
-                       var fillNext = function(){
-                               for (var i=array[size-1]+1; true; i++) {
-                       if (isPrime(i)) {
-//                         vexi.log.info("prime " + size + " = " + i);
-                           array[size++] = i;
-                           return;
-                       }
-                   }
-               };
-               
-               r.get = function(n){
-                       while(true){
-                               if(n>=size){
-                                       fillNext();
-                                               vexi.thread.yield();            
        
-                               }else{
-                                       return array[n];
-                               }
-                       }
-               };
-               
-               r.has = function(n){ return array[n]!=null; }
-               
-               return r;
-        }();
+        var primes = static.newPrimeCalculator();      
+
+        var newPrimeCell = function(row){
+                       var r = new .cell();
+               r.value ++= function(v){
+                       var ind = row.value?[0];
+                       if(ind==null) return;
+                       
+                       v = primes.getImmediate(ind);
+                       if(v==null){
+                           //v = "calculating";
+                       vexi.thread = function() {
+                           r.value = primes.get(ind);
+                           };
+                       }
+                       cascade = v;
+                       if(v==null){
+                               r.text = "calculating";
+                       }
+               };
+                       return r;
+        };
         
-  
+               var newCellLabelFunc =  function(colhead){
+               if(colhead.primes ){
+                       return newPrimeCell(this);
+               }
+               return new .cell(colhead.datatype);
+           };
+        
+        var newCellEditorFunc = function(colhead){
+               if(colhead.editable){
+                       switch(colhead.datatype){
+                       case "bool": 
+                               var r = new wi.check();
+                               r.selected = false;
+                               return r;
+                       default:
+                    return new wi.textfield();
+                       }       
+               }
+               else if(colhead.primes){
+                       return newPrimeCell(this);
+               }
+               return null;
+       };
+        
+        
+        $table.createRow = function(){
+               var r = new .row();
+               r.newCellLabel = newCellLabelFunc;
+               return r;
+        };
+
         $table.fetchData = function(start, count, sortcol, sortasc) {
             var data = [count];
             var update = false;
@@ -82,30 +139,12 @@
             if (sortcol == null) sortasc = true;
             for (var i=0; count>i; i++) {
                 var ind = sortasc ? start + i : N_ROWS - (start + i);
+                var p = primes.getImmediate(ind);
                 data[i] = [5];
                 data[i][0] = ind;
                 data[i][1] = 0 - ind;
                 data[i][2] = ind + 1;
-                
-                if(primes.has(ind)){
-                       data[i][3] = primes.get(ind);
-                }else{
-                       data[i][3] = "calculating";
-                       update = true;
-                       
-                       // update display when value is available
-                       vexi.thread = function() {
-                           var p = primes.get(ind);
-                           
-                           var n = $body.numchildren;
-                           for (var j=0; n>j; j++) {
-                                   // only if request still corresponds to the 
display  
-                            if ($body[j].rowindex == ind) {
-                                   $body[j][3].value = p; 
-                               }
-                           }
-                       };
-                }
+                       data[i][3] = p;
             }
             return data;
         };


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Vexi-svn mailing list
Vexi-svn@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vexi-svn

Reply via email to