//>>built define("dojox/grid/enhanced/_Plugin", [ "dojo/_base/kernel", "dojo/_base/lang", "dojo/_base/declare", "dojo/_base/array", "dojo/_base/connect", "../EnhancedGrid" ], function(dojo, lang, declare, array, connect){ return declare("dojox.grid.enhanced._Plugin", null, { // summary: // Base class for all plugins. // // description: // Provides common plugin functionality and basic life cycle management. // // Each concrete plugin must have a name field and is responsible for registering itself to the global plugin registry // e.g. for dnd plugin: // | dojox.grid.EnhancedGrid.registerPlugin("dnd" /*plugin name*/, // | dojox.grid.enhanced.plugins.DnD /*full class name of a plugin*/ // | {"preInit": false, "dependency": ["nestedSorting"]} /*properties*/); // // [Keywords] of plugin properties(case sensitive) // - "preInit": boolean, whether a plugin should be created before EnhancedGrid.postCreate(), // false by default(plugins are created after EnhancedGrid.postCreate()). // - "dependency": array or string, plugin(s) indicated by "dependency" will be created before the current one. // Note: recursive cycle dependencies are not supported e.g. following dependency is invalid: // pluginA -> pluginB -> pluginA // // example: // 1. Customize default DnD plugin // | dojo.declare("mygrid.MyDnD", dojox.grid.enhanced.plugins.DnD, { // | name:"dnd" //still reuse the plugin name // | constructor: function(inGrid, option){ ... } // | }); // | dojox.grid.EnhancedGrid.registerPlugin("dnd", mygrid.MyDnD); // // 2. Add new plugin - PluginA // | dojo.declare("mygrid.PluginA", dojox.grid.enhanced._Plugin, { // | name: "pA", // | constructor: function(inGrid, option){ ... } // | }); // | dojox.grid.EnhancedGrid.registerPlugin("pA",mygrid.PluginA); // // 3. Use plugins // | dojo.require("mygrid.MyDnD"); // | dojo.require("mygrid.PluginA"); // | //name: String // Plugin name, e.g. 'nestedSorting', 'dnd'... name: 'plugin', //grid: Object // Grid that the plugin belongs to grid: null, //option: Object // Plugin properties - leveraged with default and user specified properties. // e.g. for dnd plugin, it may look like {"class": dojox.grid.enhanced.plugins.DnD, "dependency": ["nestedSorting"], ...} option: {}, //_connects: Array // List of all connections. _connects: [], //_subscribes: Array // List of all subscribes. _subscribes: [], //privates: Object // Private properties/methods shouldn't be mixin-ed anytime. privates: {}, constructor: function(inGrid, option){ this.grid = inGrid; this.option = option; this._connects = []; this._subscribes = []; this.privates = lang.mixin({},dojox.grid.enhanced._Plugin.prototype); this.init(); }, init: function(){}, onPreInit: function(){}, onPostInit: function(){}, onStartUp: function(){}, connect: function(obj, event, method){ // summary: // Connects specified obj/event to specified method of this object. // example: // | var plugin = new dojox.grid.enhanced._Plugin(grid,"myPlugin",{...}); // | // when foo.bar() is called, call the listener in the scope of plugin // | plugin.connect(foo, "bar", function(){ // | console.debug(this.xxx());//"this" - plugin scope // | }); var conn = connect.connect(obj, event, this, method); this._connects.push(conn); return conn; }, disconnect: function(handle){ // summary: // Disconnects handle and removes it from connection list. array.some(this._connects, function(conn, i, conns){ if(conn == handle){ connect.disconnect(handle); conns.splice(i, 1); return true; } return false; }); }, subscribe: function(topic, method){ // summary: // Subscribes to the specified topic and calls the specified method // of this object. // example: // | var plugin = new dojox.grid.enhanced._Plugin(grid,"myPlugin",{...}); // | // when /my/topic is published, call the subscriber in the scope of plugin // | // with passed parameter - "v" // | plugin.subscribe("/my/topic", function(v){ // | console.debug(this.xxx(v));//"this" - plugin scope // | }); var subscribe = connect.subscribe(topic, this, method); this._subscribes.push(subscribe); return subscribe; }, unsubscribe: function(handle){ // summary: // Un-subscribes handle and removes it from subscriptions list. array.some(this._subscribes, function(subscribe, i, subscribes){ if(subscribe == handle){ connect.unsubscribe(handle); subscribes.splice(i, 1); return true; } return false; }); }, onSetStore: function(store){ // summary: // Called when store is changed. }, destroy: function(){ // summary: // Destroy all resources. array.forEach(this._connects, connect.disconnect); array.forEach(this._subscribes, connect.unsubscribe); delete this._connects; delete this._subscribes; delete this.option; delete this.privates; //console.log('Plugin [', this.name, '].destroy() executed!'); } }); //Each plugin is responsible for registering itself // e.g. for DnD plugin(name:'dnd'): // | dojox.grid.EnhancedGrid.registerPlugin(dojox.grid.enhanced.plugins.DnD/*class*/, // | {"dependency": ["nestedSorting"]}/*Optional - properties*/); });