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
[email protected]
https://lists.sourceforge.net/lists/listinfo/vexi-svn