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