source: [view]
try{
if(rowIndex < 0){
return;
}
var result = [], i, j, len = this._records.length,
cells = this.grid.layout.cells;
//Apply merge-cell requests one by one.
for(i = 0; i < len; ++i){
var item = this._records[i];
var storeItem = this.grid._by_idx[rowIndex];
if(item.view == viewIdx && item.row(rowIndex, storeItem && storeItem.item, this.grid.store)){
var res = {
record: item,
hiddenCells: [],
totalWidth: 0,
majorNode: cells[item.major].getNode(rowIndex),
majorHeaderNode: cells[item.major].getHeaderNode()
};
//Calculated the width of merged cell.
for(j = item.start; j <= item.end; ++j){
var w = this._getWidth(j, rowIndex);
res.totalWidth += w;
if(j != item.major){
res.hiddenCells.push(cells[j].getNode(rowIndex));
}
}
//If width is valid, remember it. There may be multiple merges within one row.
if(subrows.length != 1 || res.totalWidth > 0){
//Remove conflicted merges.
for(j = result.length - 1; j >= 0; --j){
var r = result[j].record;
if((r.start >= item.start && r.start <= item.end) ||
(r.end >= item.start && r.end <= item.end)){
result.splice(j, 1);
}
}
result.push(res);
}
}
}
this._merged[rowIndex] = [];
dojo.forEach(result, function(res){
dojo.forEach(res.hiddenCells, function(node){
dojo.style(node, "display", "none");
});
var pbm = dojo.marginBox(res.majorHeaderNode).w - dojo.contentBox(res.majorHeaderNode).w;
var tw = res.totalWidth;
//Tricky for WebKit.
if(!dojo.isWebKit){
tw -= pbm;
}
dojo.style(res.majorNode, "width", tw + "px");
//In case we're dealing with multiple subrows.
dojo.attr(res.majorNode, "colspan", res.hiddenCells.length + 1);
this._merged[rowIndex].push({
"row": rowIndex,
"start": res.record.start,
"end": res.record.end,
"major": res.record.major,
"handle": res.record
});
}, this);
}catch(e){
console.warn("CellMerge._onAfterRow() error: ", rowIndex, e);
}