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", "./DataGrid", "./DataSelection", "./enhanced/_PluginManager", "./enhanced/plugins/_SelectionPreserver",//default loaded plugin "dojo/i18n!./enhanced/nls/EnhancedGrid" ], function(dojo, dojox, declare, lang, array, has, dom, domGeometry, DataGrid, DataSelection, _PluginManager, _SelectionPreserver, nls){ 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 // | // // Step 2. Use EnhancedGrid // // - Via HTML markup // // |
// | ... // |
// // - Or via JavaScript // // | // // // 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(){ this._nls = nls; 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; });