diff options
Diffstat (limited to 'js/dojo/dojox/grid/enhanced/plugins/_RowMapLayer.js')
| -rw-r--r-- | js/dojo/dojox/grid/enhanced/plugins/_RowMapLayer.js | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/js/dojo/dojox/grid/enhanced/plugins/_RowMapLayer.js b/js/dojo/dojox/grid/enhanced/plugins/_RowMapLayer.js new file mode 100644 index 0000000..bf19ce3 --- /dev/null +++ b/js/dojo/dojox/grid/enhanced/plugins/_RowMapLayer.js @@ -0,0 +1,207 @@ +//>>built +define("dojox/grid/enhanced/plugins/_RowMapLayer", [ + "dojo/_base/declare", + "dojo/_base/array", + "dojo/_base/lang", + "./_StoreLayer" +], function(declare, array, lang, layers){ + +var _devideToArrays = function(a){ + a.sort(function(v1, v2){ + return v1 - v2; + }); + var arr = [[a[0]]]; + for(var i = 1, j = 0; i < a.length; ++i){ + if(a[i] == a[i-1] + 1){ + arr[j].push(a[i]); + }else{ + arr[++j] = [a[i]]; + } + } + return arr; +}, +hitchIfCan = function(scope, func){ + return func ? lang.hitch(scope || lang.global, func) : function(){}; +}; + +return declare("dojox.grid.enhanced.plugins._RowMapLayer", layers._StoreLayer, { + tags: ["reorder"], + constructor: function(grid){ + this._map = {}; + this._revMap = {}; + this.grid = grid; + this._oldOnDelete = grid._onDelete; + var _this = this; + grid._onDelete = function(item){ + _this._onDelete(item); + _this._oldOnDelete.call(grid, item); + }; + this._oldSort = grid.sort; + grid.sort = function(){ + _this.clearMapping(); + _this._oldSort.apply(grid, arguments); + }; + }, + uninitialize: function(){ + this.grid._onDelete = this._oldOnDelete; + this.grid.sort = this._oldSort; + }, + setMapping: function(mapping){ + // summary: + // Remember the row mapping. + // mapping: Object + // keys are original rowIndexes, values are new rowIndexes. + this._store.forEachLayer(function(layer){ + if(layer.name() === "rowmap"){ + return false; + }else if(layer.onRowMappingChange){ + layer.onRowMappingChange(mapping); + } + return true; + }, false); + var from, to, origin, revmap = {}; + for(from in mapping){ + from = parseInt(from, 10); + to = mapping[from]; + if(typeof to == "number"){ + if(from in this._revMap){ + origin = this._revMap[from]; + delete this._revMap[from]; + }else{ + origin = from; + } + if(origin == to){ + delete this._map[origin]; + revmap[to] = "eq"; + }else{ + this._map[origin] = to; + revmap[to] = origin; + } + } + } + for(to in revmap){ + if(revmap[to] === "eq"){ + delete this._revMap[parseInt(to, 10)]; + }else{ + this._revMap[parseInt(to, 10)] = revmap[to]; + } + } + }, + clearMapping: function(){ + this._map = {}; + this._revMap = {}; + }, + _onDelete: function(item){ + var idx = this.grid._getItemIndex(item, true); + if(idx in this._revMap){ + var rowIdxArr = [], r, i, origin = this._revMap[idx]; + delete this._map[origin]; + delete this._revMap[idx]; + for(r in this._revMap){ + r = parseInt(r, 10); + if(this._revMap[r] > origin){ + --this._revMap[r]; + } + } + for(r in this._revMap){ + r = parseInt(r, 10); + if(r > idx){ + rowIdxArr.push(r); + } + } + rowIdxArr.sort(function(a, b){ + return b - a; + }); + for(i = rowIdxArr.length - 1; i >= 0; --i){ + r = rowIdxArr[i]; + this._revMap[r - 1] = this._revMap[r]; + delete this._revMap[r]; + } + this._map = {}; + for(r in this._revMap){ + this._map[this._revMap[r]] = r; + } + } + }, + _fetch: function(userRequest){ + var mapCount = 0, r; + var start = userRequest.start || 0; + for(r in this._revMap){ + r = parseInt(r, 10); + if(r >= start){ + ++mapCount; + } + } + if(mapCount > 0){ + //Row mapping is in use. + var rows = [], i, map = {}, + count = userRequest.count > 0 ? userRequest.count : -1; + if(count > 0){ + for(i = 0; i < count; ++i){ + r = start + i; + r = r in this._revMap ? this._revMap[r] : r; + map[r] = i; + rows.push(r); + } + }else{ + //We don't have a count, must create our own. + for(i = 0;; ++i){ + r = start + i; + if(r in this._revMap){ + --mapCount; + r = this._revMap[r]; + } + map[r] = i; + rows.push(r); + if(mapCount <= 0){ + break; + } + } + } + this._subFetch(userRequest, this._getRowArrays(rows), 0, [], map, userRequest.onComplete, start, count); + return userRequest; + }else{ + //No row mapping at all. + return lang.hitch(this._store, this._originFetch)(userRequest); + } + }, + _getRowArrays: function(rows){ + return _devideToArrays(rows); + }, + _subFetch: function(userRequest, rowArrays, index, result, map, oldOnComplete, start, count){ + var arr = rowArrays[index], _this = this; + var urstart = userRequest.start = arr[0]; + userRequest.count = arr[arr.length - 1] - arr[0] + 1; + userRequest.onComplete = function(items){ + array.forEach(items, function(item, i){ + var r = urstart + i; + if(r in map){ + result[map[r]] = item; + } + }); + if(++index == rowArrays.length){ + //mapped rows are all fetched. + if(count > 0){ + userRequest.start = start; + userRequest.count = count; + userRequest.onComplete = oldOnComplete; + hitchIfCan(userRequest.scope, oldOnComplete)(result, userRequest); + }else{ + userRequest.start = userRequest.start + items.length; + delete userRequest.count; + userRequest.onComplete = function(items){ + result = result.concat(items); + userRequest.start = start; + userRequest.onComplete = oldOnComplete; + hitchIfCan(userRequest.scope, oldOnComplete)(result, userRequest); + }; + _this.originFetch(userRequest); + } + }else{ + _this._subFetch(userRequest, rowArrays, index, result, map, oldOnComplete, start, count); + } + }; + _this.originFetch(userRequest); + } +}); +}); |
