diff options
Diffstat (limited to 'js/dojo/dojox/grid/EnhancedGrid.js')
| -rw-r--r-- | js/dojo/dojox/grid/EnhancedGrid.js | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/js/dojo/dojox/grid/EnhancedGrid.js b/js/dojo/dojox/grid/EnhancedGrid.js new file mode 100644 index 0000000..9852dba --- /dev/null +++ b/js/dojo/dojox/grid/EnhancedGrid.js @@ -0,0 +1,263 @@ +//>>built +define("dojox/grid/EnhancedGrid", [ + "dojo/_base/kernel", + "../main", + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/array", + "dojo/_base/sniff", + "dojo/dom", + "dojo/dom-geometry", + "dojo/i18n", + "./DataGrid", + "./DataSelection", + "./enhanced/_PluginManager", + "./enhanced/plugins/_SelectionPreserver",//default loaded plugin + "dojo/i18n!./enhanced/nls/EnhancedGrid" +], function(dojo, dojox, declare, lang, array, has, dom, domGeometry, i18n, + DataGrid, DataSelection, _PluginManager, _SelectionPreserver){ + +dojo.experimental("dojox.grid.EnhancedGrid"); + +var EnhancedGrid = declare("dojox.grid.EnhancedGrid", DataGrid, { + // summary: + // Provides enhanced features based on DataGrid + // + // description: + // EnhancedGrid features are implemented as plugins that could be loaded on demand. + // Explicit dojo.require() is needed to use these feature plugins. + // + // example: + // A quick sample to use EnhancedGrid features: + // + // Step 1. Load EnhancedGrid and required features + // | <script type="text/javascript"> + // | dojo.require("dojox.grid.EnhancedGrid"); + // | dojo.require("dojox.grid.enhanced.plugins.DnD"); + // | dojo.require("dojox.grid.enhanced.plugins.Menu"); + // | dojo.require("dojox.grid.enhanced.plugins.NestedSorting"); + // | dojo.require("dojox.grid.enhanced.plugins.IndirectSelection"); + // | </script> + // + // Step 2. Use EnhancedGrid + // - Via HTML markup + // | <div dojoType="dojox.grid.EnhancedGrid" ... + // | plugins="{nestedSorting: true, dnd: true, indirectSelection: true, + // | menus:{headerMenu:"headerMenuId", rowMenu:"rowMenuId", cellMenu:"cellMenuId", + // | selectedRegionMenu:"selectedRegionMenuId"}}"> + // | ... + // | </div> + // + // - Or via JavaScript + // | <script type="text/javascript"> + // | var grid = new dojox.grid.EnhancedGrid({plugins : {nestedSorting: true, dnd: true, indirectSelection: true, + // | menus:{headerMenu:"headerMenuId", rowMenu:"rowMenuId", cellMenu:"cellMenuId",selectedRegionMenu:"selectedRegionMenuId"}}, + // | ... }, dojo.byId('gridDiv')); + // | grid.startup(); + // | </script> + // + // + // Plugin Support + // [Note: Plugin support is still experimental] + // + // You can either customize the default plugins or add new ones, more details please see + // - dojox.grid.enhanced._PluginManager + // - dojox.grid.enhanced._Plugin + // - dojox.grid.enhanced.plugins.* + + //plugins: Object + // Plugin properties, e.g. {nestedSorting: true, dnd: true, ...} + plugins: null, + + //pluginMgr: Object + // Singleton plugin manager + pluginMgr: null, + + //_pluginMgrClass: Object + // Default plugin manager class + _pluginMgrClass: _PluginManager, + + postMixInProperties: function(){ + //load nls bundle + this._nls = i18n.getLocalization("dojox.grid.enhanced", "EnhancedGrid", this.lang); + this.inherited(arguments); + }, + postCreate: function(){ + //create plugin manager + this.pluginMgr = new this._pluginMgrClass(this); + this.pluginMgr.preInit(); + this.inherited(arguments); + this.pluginMgr.postInit(); + }, + plugin: function(/*String*/name){ + // summary: + // An easier way for getting a plugin, e.g. grid.plugin('dnd') + return this.pluginMgr.getPlugin(name); + }, + startup: function(){ + this.inherited(arguments); + this.pluginMgr.startup(); + }, + createSelection: function(){ + this.selection = new dojox.grid.enhanced.DataSelection(this); + }, + canSort: function(colIndex, field){ + // summary: + // Overwritten + return true; + }, + doKeyEvent: function(e){ + // summary: + // Overwritten, see _Grid.doKeyEvent() + try{ + var view = this.focus.focusView; + view.content.decorateEvent(e); + if(!e.cell){ view.header.decorateEvent(e); } + }catch(e){} + this.inherited(arguments); + }, + doApplyCellEdit: function(inValue, inRowIndex, inAttrName){ + // summary: + // Overwritten, see DataGrid.doApplyCellEdit() + if(!inAttrName){ + this.invalidated[inRowIndex] = true; + return; + } + this.inherited(arguments); + }, + mixin: function(target, source){ + var props = {}; + for(var p in source){ + if(p == '_inherited' || p == 'declaredClass' || p == 'constructor' || + source['privates'] && source['privates'][p]){ + continue; + } + props[p] = source[p]; + } + lang.mixin(target, props); + }, + _copyAttr: function(idx, attr){ + // summary: + // Overwritten, see DataGrid._copyAttr() + // Fix cell TAB navigation for single click editing + if(!attr){ return; } + return this.inherited(arguments); + }, + _getHeaderHeight: function(){ + // summary: + // Overwritten, see _Grid._getHeaderHeight() + // Should include borders/margins of this.viewsHeaderNode + this.inherited(arguments); + return domGeometry.getMarginBox(this.viewsHeaderNode).h; + }, + _fetch: function(start, isRender){ + // summary: + // Overwritten, see DataGrid._fetch() + if(this.items){ + return this.inherited(arguments); + } + start = start || 0; + if(this.store && !this._pending_requests[start]){ + if(!this._isLoaded && !this._isLoading){ + this._isLoading = true; + this.showMessage(this.loadingMessage); + } + this._pending_requests[start] = true; + try{ + var req = { + start: start, + count: this.rowsPerPage, + query: this.query, + sort: this.getSortProps(), + queryOptions: this.queryOptions, + isRender: isRender, + onBegin: lang.hitch(this, "_onFetchBegin"), + onComplete: lang.hitch(this, "_onFetchComplete"), + onError: lang.hitch(this, "_onFetchError") + }; + this._storeLayerFetch(req); + }catch(e){ + this._onFetchError(e, {start: start, count: this.rowsPerPage}); + } + } + return 0; + }, + _storeLayerFetch: function(req){ + // summary: + // Extracted fetch specifically for store layer use + this.store.fetch(req); + }, + getCellByField: function(field){ + return array.filter(this.layout.cells, function(cell){ + return cell.field == field; + })[0]; + }, + onMouseUp: function(e){ }, + createView: function(){ + // summary + // Overwrite: rewrite getCellX of view.header + var view = this.inherited(arguments); + if(has("mozilla")){ + var ascendDom = function(inNode, inWhile){ + for(var n = inNode; n && inWhile(n); n = n.parentNode){} + return n; + };//copied from dojox.grid._Builder + var makeNotTagName = function(inTagName){ + var name = inTagName.toUpperCase(); + return function(node){ return node.tagName != name; }; + };//copied from dojox.grid._Builder + + var func = view.header.getCellX; + view.header.getCellX = function(e){ + var x = func.call(view.header, e); + var n = ascendDom(e.target, makeNotTagName("th")); + if(n && n !== e.target && dom.isDescendant(e.target, n)){ x += n.firstChild.offsetLeft; } + return x; + }; + } + return view; + }, + destroy: function(){ + // summary: + // Destroy all resources + delete this._nls; + this.pluginMgr.destroy(); + this.inherited(arguments); + } +}); + +declare("dojox.grid.enhanced.DataSelection", DataSelection, { + constructor: function(grid){ + if(grid.keepSelection){ + if(this.preserver){ + this.preserver.destroy(); + } + this.preserver = new _SelectionPreserver(this); + } + }, + _range: function(inFrom, inTo){ + this.grid._selectingRange = true; + this.inherited(arguments); + this.grid._selectingRange = false; + this.onChanged(); + }, + deselectAll: function(inItemOrIndex){ + this.grid._selectingRange = true; + this.inherited(arguments); + this.grid._selectingRange = false; + this.onChanged(); + } +}); + +EnhancedGrid.markupFactory = function(props, node, ctor, cellFunc){ + return dojox.grid._Grid.markupFactory(props, node, ctor, + lang.partial(DataGrid.cell_markupFactory, cellFunc)); +}; + +EnhancedGrid.registerPlugin = function(clazz, props){ + _PluginManager.registerPlugin(clazz, props); +}; + +return EnhancedGrid; + +});
\ No newline at end of file |
