123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- define(["./GridFromHtml", "./ColumnSet", "dojo/_base/declare"],
- function(GridFromHtml, ColumnSet, declare){
- // summary:
- // This module augments GridFromHtml with additional support for interpreting
- // ColumnSets from colgroups in table markup.
-
- function getColumnSetsFromDom(domNode){
- // summary:
- // Generates ColumnSets from DOM.
-
- var
- columnsets = [], // to be pushed upon / returned
- cgspans = [], // stores info on columnset sizes (colgroup span)
- rowspans = [], // will store info on any "unexhausted" rowspans
- colgroups = domNode.getElementsByTagName("colgroup"),
- cglen = colgroups.length,
- trs = domNode.getElementsByTagName("tr"),
- trslen = trs.length,
- getNum = GridFromHtml.utils.getNumFromAttr,
- getCol = GridFromHtml.utils.getColumnFromCell,
- // used in loops:
- currcol, // keeps track of what column we're at
- currcg, // and which colgroup
- groupColumns, tr, ths, i, j, tmp;
-
- function incCurrcol(amount){
- // Check whether we've passed into the next colgroup within current row.
- // (Used within th loop)
- currcol += amount;
- tmp = cgspans[currcg];
- if(currcol >= tmp){
- // First, push info for the set we just finished:
- // (i is still the active row index from the for loop)
- columnsets[currcg][i] = groupColumns;
-
- // Now, time to move on to the next columnset for this row.
- currcol -= tmp;
- currcg++;
- groupColumns = [];
- }
- }
-
- // no need for ColumnSet unless there's >1 colgroup
- if(cglen < 2){ return false; }
-
- // read span from each colgroup (defaults to 1)
- for(i = 0; i < cglen; i++){
- // store number of cells this column spans
- tmp = getNum(colgroups[i], "span") || 1;
- cgspans[i] = tmp;
- // add nested array to return value to be populated for this set
- columnsets[i] = [];
- // initialize inner rowspan-tracking array for each
- rowspans[i] = [];
- for(j = 0; j < tmp; j++){
- rowspans[i][j] = 0;
- }
- }
-
- for(i = 0; i < trslen; i++){
- currcol = currcg = 0;
- groupColumns = [];
- tr = trs[i];
- ths = tr.getElementsByTagName("th"), thslen = ths.length;
- for(j = 0; j < thslen; j++){
- // account for space occupied by previous rowSpans
- while(rowspans[currcg][currcol]){
- // decrement rowspan "leftover" for next iteration
- rowspans[currcg][currcol]--;
- // skip past this cell for now, and try again w/ updated currcg/col
- incCurrcol(1);
- }
-
- // store cell info
- tmp = getCol(ths[j]);
- groupColumns.push(tmp);
-
- // if this cell has rowspan, keep that in mind for future iterations
- rowspans[currcg][currcol] = tmp.rowSpan ? tmp.rowSpan - 1 : 0;
-
- // increment currcol/currcg appropriately, accounting for cell colSpan
- incCurrcol(tmp.colSpan || 1);
- }
- // At the end of processing each row, there is a chance that the last
- // column set didn't get pushed yet (specifically if there are trailing
- // rowspans - since rowspan "debt" gets iterated at the beginning of each
- // iteration, not the end). In that case, push the last one now.
- if(groupColumns.length){
- columnsets[currcg][i] = groupColumns;
- }
- }
- if(tr){
- domNode.removeChild(tr.parentNode);
- }
- return columnsets;
- }
- return declare([GridFromHtml, ColumnSet], {
- configStructure: function(){
- // summary:
- // Configure subRows based on HTML originally in srcNodeRef
-
- var tmp;
- if(!this._checkedTrs){
- tmp = getColumnSetsFromDom(this.srcNodeRef);
- if(tmp){
- this.columnSets = tmp;
- this._checkedTrs = true;
- }else{
- // no reason to worry about ColumnSets, let GridFromHtml do the job
- return this.inherited(arguments);
- }
- }
- return this.inherited(arguments);
- }
- });
- });
|