Revision: 3832
http://vexi.svn.sourceforge.net/vexi/?rev=3832&view=rev
Author: clrg
Date: 2010-04-08 02:55:58 +0000 (Thu, 08 Apr 2010)
Log Message:
-----------
Smarten up grid code + fix broken grids caused by colspan/rowspan as strings
Modified Paths:
--------------
trunk/widgets/org.vexi.widgets/src/org/vexi/lib/layout/grid.t
Modified: trunk/widgets/org.vexi.widgets/src/org/vexi/lib/layout/grid.t
===================================================================
--- trunk/widgets/org.vexi.widgets/src/org/vexi/lib/layout/grid.t
2010-04-07 16:39:52 UTC (rev 3831)
+++ trunk/widgets/org.vexi.widgets/src/org/vexi/lib/layout/grid.t
2010-04-08 02:55:58 UTC (rev 3832)
@@ -60,7 +60,9 @@
}
var place = function(findwidths, findheights) {
- if (!activegrid or !numcols or !numrows) return;
+ if (!activegrid or !numcols or !numrows) {
+ return;
+ }
// honor min/max sizes for boxes in order of region
var n = $content.numchildren;
var c, c0;
@@ -90,8 +92,8 @@
c0 = c[0];
r1 = rindmap[c0.v_col];
r2 = rindmap[c0.v_col+c0.colspan];
- // first to affect this region
if (r2 == null) {
+ // first to affect this region
r2 = regmark;
regions[r2] = c0.v_col+c0.colspan;
rindmap[regions[r2]] = r2;
@@ -101,22 +103,28 @@
content += minsizes[regmark-1];
regmark++;
}
- // affect single region
if (r2-r1 == 1) {
+ // affect single region
minsizes[r2] = max(c0.contentwidth, minsizes[r2]);
maxsizes[r2] = max((c0.hshrink ? c0.contentwidth :
c0.maxwidth), maxsizes[r2]);
- // affect multiple regions
} else {
+ // affect multiple regions
mindim = c0.contentwidth;
maxdim = c0.hshrink ? c0.contentwidth : c0.maxwidth;
// work out the minimum size of this box's region
// the box affects c.v_col+1 -> c.v_col+c.colspan
- for (var r=r1+1; r2>r; r++) mindim -= minsizes[r];
+ for (var r=r1+1; r2>r; r++) {
+ mindim -= minsizes[r];
+ }
minsizes[r2] = max(mindim, minsizes[r2]);
// work out the maximum size of this box's region
for (var r=r1+1; r2>r; r++) {
- if (maxdim > maxsizes[r]) maxdim -= maxsizes[r];
- else { maxdim = 0; break; }
+ if (maxdim > maxsizes[r]) {
+ maxdim -= maxsizes[r];
+ } else {
+ maxdim = 0;
+ break;
+ }
}
maxsizes[r2] = max(maxdim, maxsizes[r2]);
}
@@ -140,7 +148,7 @@
// reset markers
r1 = 0; mincols=0; maxcols=0;
// calculate size for each region based on targetColumnSize
- for(var r=1; regmark>r; r++) {
+ for (var r=1; regmark>r; r++) {
r2 = regions[r];
// honor maxwidths then minwidths
diff = max(minsizes[r], min(maxsizes[r],
targetColumnSize * (r2-r1)));
@@ -152,21 +160,30 @@
}
// our current size
size = sizes[regmark-1];
- // break if we were close to the target
- if (0.5 > size-target and size-target >= -0.5) break;
- // not at the target size, adjust accordingly
+ if (0.5 > size-target and size-target >= -0.5) {
+ // break if we were close to the target
+ break;
+ }
if (size > target) {
- // no cols to be further decreased in size
- if (mincols == 0) break;
+ // not at the target size, adjust accordingly
+ if (mincols == 0) {
+ // no cols to be further decreased in size
+ break;
+ }
// else adjust targetColumnSize according to
target-total deficit
targetColumnSize += ((target-size) / mincols);
} else {
- // no cols to be further increased in size
- if (maxcols == 0) break;
+ if (maxcols == 0) {
+ // no cols to be further increased in size
+ break;
+ }
// adjust targetColumnSize according to target-total
deficit
targetColumnSize += ((target-size) / maxcols);
}
- if (i==99) vexi.log.warn("failed to solve grid");
+ if (i>=99) {
+ // infinite loop prevention
+ vexi.log.warn("failed to solve grid");
+ }
}
// place our boxes
@@ -180,7 +197,9 @@
c.width = c0.hshrink ? c0.contentwidth :
min(c0.maxwidth, r2-r1);
c.x = (c.width == r2-r1) ? r1 : fromHAlign(c0.align,
r1, r2-r1-c.width);
c = colregions.next();
- if (c) c0 = c[0];
+ if (c) {
+ c0 = c[0];
+ }
}
}
@@ -220,22 +239,28 @@
content += minsizes[regmark-1];
regmark++;
}
- // affect single region
if (r2-r1 == 1) {
+ // affect single region
minsizes[r2] = max(c0.contentheight, minsizes[r2]);
maxsizes[r2] = max((c0.vshrink ? c0.contentheight :
c0.maxheight), maxsizes[r2]);
- // affect multiple regions
} else {
+ // affect multiple regions
mindim = c0.contentheight;
maxdim = c0.vshrink ? c0.contentheight : c0.maxheight;
// work out the minimum size of this box's region
// the box affects c.v_col+1 -> c.v_col+c.colspan
- for (var r=r1+1; r2>r; r++) mindim -= minsizes[r];
+ for (var r=r1+1; r2>r; r++) {
+ mindim -= minsizes[r];
+ }
minsizes[r2] = max(mindim, minsizes[r2]);
// work out the maximum size of this box's region
for (var r=r1+1; r2>r; r++) {
- if (maxdim > maxsizes[r]) maxdim -= maxsizes[r];
- else { maxdim = 0; break; }
+ if (maxdim > maxsizes[r]) {
+ maxdim -= maxsizes[r];
+ } else {
+ maxdim = 0;
+ break;
+ }
}
maxsizes[r2] = max(maxdim, maxsizes[r2]);
}
@@ -259,7 +284,7 @@
// reset markers
r1 = 0; minrows=0; maxrows=0;
// calculate size for each region based on targetRowSize
- for(var r=1; regmark>r; r++) {
+ for (var r=1; regmark>r; r++) {
r2 = regions[r];
// honor maxwidths then minwidths
diff = max(minsizes[r], min(maxsizes[r], targetRowSize
* (r2-r1)));
@@ -271,21 +296,30 @@
}
// our current size
size = sizes[regmark-1];
- // break if we were close to the target
- if (0.5 > size-target and size-target >= -0.5) break;
- // not at the target size, adjust accordingly
+ if (0.5 > size-target and size-target >= -0.5) {
+ // break if we were close to the target
+ break;
+ }
if (size > target) {
- // no rows to be further decreased in size
- if (minrows == 0) break;
+ // not at the target size, adjust accordingly
+ if (minrows == 0) {
+ // no rows to be further decreased in size
+ break;
+ }
// else adjust targetRowSize according to target-total
deficit
targetRowSize += ((target-size) / minrows);
} else {
- // no rows to be further increased in size
- if (maxrows == 0) break;
+ if (maxrows == 0) {
+ // no rows to be further increased in size
+ break;
+ }
// adjust targetRowSize according to target-total
deficit
targetRowSize += ((target-size) / maxrows);
}
- if (i==99) vexi.log.warn("failed to solve grid");
+ if (i>=99) {
+ // infinite loop prevention
+ vexi.log.warn("failed to solve grid");
+ }
}
// place our boxes
@@ -299,7 +333,9 @@
c.height = c0.vshrink ? c0.contentheight :
min(c0.maxheight, r2-r1);
c.y = (c.height == r2-r1) ? r1 : fromVAlign(c0.align,
r1, r2-r1-c.height);
c = rowregions.next();
- if (c) c0 = c[0];
+ if (c) {
+ c0 = c[0];
+ }
}
}
@@ -330,21 +366,21 @@
/** assign child c to the pack slot specific by col,row */
var assignSlot = function(c, col, row) {
var c0 = c[0];
- // col-related assignments
if (!colregions.contains(c) or c0.v_col != col) {
- c0.v_col = col;
- colregions.insert(c, c0.v_col+c0.colspan);
+ // col-related assignments
+ c0.v_col = col;
+ colregions.insert(c, c0.v_col+c0.colspan);
}
- // row-related assignments
if (!rowregions.contains(c) or c0.v_row != row) {
- c0.v_row = row;
- rowregions.insert(c, c0.v_row+c0.rowspan);
+ // row-related assignments
+ c0.v_row = row;
+ rowregions.insert(c, c0.v_row+c0.rowspan);
}
}
/** pack by column first, expanding rows as required */
var packByCol = function() {
- var frontier = .vector(vexi.box);
+ var frontier = new .vector();
var fullpass = true;
var nextcol = 0; // the next available col
var nextrow = 0; // the next available row
@@ -355,11 +391,18 @@
for (var j=0; n>j; j++) {
c = $content[j];
c0 = c[0];
- // disregard hidden children
- if (!c0.display) { c.display = false; continue; }
- else c.display = true;
- // if we don't fit on the row, jump to the next
- if (nextcol!=0 and nextcol+c0.colspan > numcols) { nextcol=0;
nextrow++; }
+ if (!c0.display) {
+ // disregard hidden children
+ c.display = false;
+ continue;
+ } else {
+ c.display = true;
+ }
+ if (nextcol!=0 and nextcol+c0.colspan > numcols) {
+ // if we don't fit on the row, jump to the next
+ nextcol=0;
+ nextrow++;
+ }
// check to see if we are making a full pass at the row
fullpass = nextcol==0;
// work through frontier boxes until a suitable position is
found
@@ -367,43 +410,61 @@
f = frontier.first;
while (f != null) {
f0 = f[0];
- // reduce frontier by removing boxes not affecting the
frontier row
if (nextrow >= f0.v_row+f0.rowspan) {
+ // reduce frontier by removing boxes not affecting
the frontier row
f0 = frontier.after(f);
frontier.remove(f);
f = f0;
continue;
}
- // frontier not accomdating current child, look further
if (f0.v_col+f0.colspan > nextcol and
nextcol+c0.colspan > f0.v_col) {
+ // frontier not accomdating current child, look
further
+
// establish next available col
nextcol = f0.v_col+f0.colspan;
// establish next available row
minrows = (minrows == 0) ? f0.v_row+f0.rowspan :
min(minrows, f0.v_row+f0.rowspan);
- // c will not fit on nextrow
+
if (nextcol+c0.colspan > numcols) {
- // if not a full pass, try next immediate row
- if (!fullpass) { nextrow++; nextcol=0;
minrows=0; }
- // try c on next available row
- else { nextcol=0; nextrow=minrows; minrows=0; }
+ // c will not fit on nextrow
+ if (!fullpass) {
+ // if not a full pass, try next immediate
row
+ nextrow++;
+ nextcol=0;
+ minrows=0;
+ } else {
+ // try c on next available row
+ nextcol=0;
+ nextrow=minrows;
+ minrows=0;
+ }
// try frontier again
continue PACKME;
}
- // fit between previous frontier and this frontier
- } else if (f0.v_col >= nextcol+c0.colspan) break
PACKME;
+ } else if (f0.v_col >= nextcol+c0.colspan) {
+ // fit between previous frontier and this frontier
+ break PACKME;
+ }
// next frontier
f = frontier.after(f);
}
- // fits in the col after frontier
- if (numcols >= nextcol+c0.colspan) break;
+ if (numcols >= nextcol+c0.colspan) {
+ // fits in the col after frontier
+ break;
+ }
}
- // add to frontier if we affect the frontier
if (c0.rowspan>1) {
+ // add to frontier if we affect the frontier
if (f) {
f = frontier.before(f);
- if (f) frontier.insert(c, f);
- else frontier.unshift(c);
- } else frontier.push(c);
+ if (f) {
+ frontier.insert(c, f);
+ } else {
+ frontier.unshift(c);
+ }
+ } else {
+ frontier.push(c);
+ }
}
// place packed child
assignSlot(c, nextcol, nextrow);
@@ -419,7 +480,7 @@
/** pack by row first - for comments see packByCol **/
var packByRow = function() {
- var frontier = .vector(vexi.box);
+ var frontier = new .vector();
var fullpass = true;
var nextrow = 0; // the next available row
var nextcol = 0; // the next available col
@@ -431,10 +492,17 @@
c = $content[j];
c0 = c[0];
// disregard hidden children
- if (!c0.display) { c.display = false; continue; }
- else c.display = true;
- // if we don't fit on the col, jump to the next
- if (nextrow!=0 and nextrow+c0.rowspan > numrows) { nextrow=0;
nextcol++; }
+ if (!c0.display) {
+ c.display = false;
+ continue;
+ } else {
+ c.display = true;
+ }
+ if (nextrow!=0 and nextrow+c0.rowspan > numrows) {
+ // does not fit in the column, jump to next row
+ nextrow=0;
+ nextcol++;
+ }
// check to see if we are making a full pass at the col
fullpass = nextrow==0;
@@ -443,42 +511,54 @@
f = frontier.first;
while (f != null) {
f0 = f[0];
- // reduce frontier by removing boxes not affecting the
frontier col
if (nextcol >= f0.v_col+f0.colspan) {
+ // reduce frontier by removing boxes not affecting
the frontier col
f0 = frontier.after(f);
frontier.remove(f);
f = f0;
continue;
}
- // frontier not accomdating current child, look further
if (nextrow+c0.rowspan > f0.v_row and
f0.v_row+f0.rowspan > nextrow) {
+ // frontier not accomdating current child, look
further
+
// establish next available row
nextrow = f0.v_row+f0.rowspan;
// establish next available col
mincols = (mincols == 0) ? f0.v_col+f0.colspan :
min(mincols, f0.v_col+f0.colspan);
- // c will not fit on nextcol
+
if (nextrow+c0.rowspan > numrows) {
- // if not a full pass, try next immediate col
- if (!fullpass) { nextrow++; nextcol=0;
minrows=0; }
- // try c on next available col
- else { nextrow=0; nextcol=mincols; mincols=0; }
+ // c will not fit on nextcol
+ if (!fullpass) {
+ // if not a full pass, try next immediate
col
+ nextrow++; nextcol=0; minrows=0;
+ } else {
+ // try c on next available col
+ nextrow=0; nextcol=mincols; mincols=0;
+ }
// try frontier again
continue PACKME;
}
- // fit between previous frontier and this frontier
- } else if (f0.v_row >= nextrow+c0.rowspan) break
PACKME;
+ } else if (f0.v_row >= nextrow+c0.rowspan) {
+ // fit between previous frontier and this frontier
+ break PACKME;
+ }
// next frontier
f = frontier.after(f);
}
- // fits on this row after frontier
- if (numrows >= nextrow+c0.rowspan) break;
+ if (numrows >= nextrow+c0.rowspan) {
+ // fits on this row after frontier
+ break;
+ }
}
- // add to frontier if we affect the frontier
if (c0.colspan>1) {
+ // add to frontier if we affect the frontier
if (f) {
f = frontier.before(f);
- if (f) frontier.insert(c, f);
- else frontier.unshift(c);
+ if (f) {
+ frontier.insert(c, f);
+ } else {
+ frontier.unshift(c);
+ }
} else frontier.push(c);
}
// place packed child
@@ -499,7 +579,9 @@
/** ambiguous function to invoke specific packing function */
var pack = function() {
- if (!activegrid) return;
+ if (!activegrid) {
+ return;
+ }
userows ? packByRow() : packByCol();
pack_children = false;
}
@@ -510,13 +592,17 @@
* new children to or removing children from a grid
*/
var schedule = function() {
- if (scheduled) return;
+ if (scheduled) {
+ return;
+ }
scheduled = true;
vexi.thread = function() {
scheduled = false;
- if (pack_children) pack();
- else if (place_width or place_height)
+ if (pack_children) {
+ pack();
+ } else if (place_width or place_height) {
place(place_width, place_height);
+ }
}
}
@@ -525,6 +611,10 @@
schedule();
}
+ var checkInt = function(v) {
+ cascade = typeof(v)=="number" ? v : vexi.string.parseInt(v);
+ }
+
var invokePack = function(v) {
if (v == trapee[trapname]) return;
cascade = v;
@@ -555,7 +645,9 @@
cascade = v;
if (v == null) {
var i = $content.indexof(trapee);
- if (i==-1) return;
+ if (i==-1) {
+ return;
+ }
$content[i] = null;
colregions.remove(trapee);
rowregions.remove(trapee);
@@ -565,19 +657,18 @@
/** set up children so the grid can react to them */
thisbox.Children ++= function(v) {
- // adding a child
if (v) {
- // gridproxy - insert contents as children
if (v.v_gridproxy) {
+ // insert contents as children
var c = v.v_gridcontent;
var n = c.numchildren;
- for (var i=0; n>i; i++)
- thisbox[numchildren] = c[0];
+ for (var i=0; n>i; i++) {
+ thisbox.add(c[0]);
+ }
return;
}
- // initialize colspan/rowspan properties
- if (v.colspan == null) v.colspan = 1;
- if (v.rowspan == null) v.rowspan = 1;
+ // adding a child
+
// trap assignment
v.contentwidth ++= invokePlaceWidth;
v.contentheight ++= invokePlaceHeight;
@@ -586,6 +677,11 @@
v.display ++= invokePack;
v.colspan ++= invokePack;
v.rowspan ++= invokePack;
+ v.colspan ++= checkInt;
+ v.rowspan ++= checkInt;
+ // initialize span properties or check they are ints
+ v.colspan = v.colspan==null ? 1 : v.colspan;
+ v.rowspan = v.rowspan==null ? 1 : v.rowspan;
// we wrap them in an outer box which we can manipulate
var b = v.v_gridbox;
if (b == null) {
@@ -597,12 +693,14 @@
// can kick in - these properties will be set properly by
place()
b.height = 0;
b.width = 0;
- } else b[0] = v;
+ } else {
+ b[0] = v;
+ }
// insert gridbox which contains child
$content[trapname] = b;
- // removing a child
} else {
+ // removing a child
var c = null;
var b = $content[trapname];
if (b) {
@@ -610,7 +708,9 @@
colregions.remove(b);
rowregions.remove(b);
c = b[0];
- } else throw "attempt to get null child from a box";
+ } else {
+ throw "attempt to get null child from a box";
+ }
if (c) {
c.contentwidth --= invokePlaceWidth;
c.contentheight --= invokePlaceHeight;
@@ -618,8 +718,12 @@
c.maxheight --= invokePlaceHeight;
c.colspan --= invokePack;
c.rowspan --= invokePack;
+ v.colspan --= checkInt;
+ v.rowspan --= checkInt;
c.v_gridbox = null;
- } else throw "should not happen";
+ } else {
+ throw "should not happen";
+ }
// finish removal
$content[trapname] = null;
}
@@ -628,13 +732,19 @@
}
/** return the actual child instead of it's grid wrapper */
- thisbox.Children ++= function() { return $content[trapname] ?
$content[trapname][0] : null; }
+ thisbox.Children ++= function() {
+ var c = $content.trapname;
+ return c ? c[0] : null;
+ }
thisbox.numchildren ++= function() { return $content.numchildren; }
/** return the grid wrapper index as grid.indexof(child) == -1 */
var getindexof = function(v) {
- if (v==null) throw "Called indexof() with null child";
- return v.v_gridbox ? $content.indexof(v.v_gridbox) : -1;
+ if (v==null) {
+ throw "Called indexof() with null child";
+ }
+ var v0 = v.v_gridbox;
+ return v0 ? $content.indexof(v0) : -1;
}
thisbox.indexof ++= function() { return getindexof; }
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Vexi-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/vexi-svn