X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/0494b8d9b9bb03ab6c22b34dae81261e3cd7e3e6..7a654f8d43fdb43d78b63d90528bed6e86b608cc:/src/AbstractManager.js diff --git a/src/AbstractManager.js b/src/AbstractManager.js new file mode 100644 index 00000000..acb45311 --- /dev/null +++ b/src/AbstractManager.js @@ -0,0 +1,142 @@ +/** + * @class Ext.AbstractManager + * @extends Object + * @ignore + * Base Manager class + */ + +Ext.define('Ext.AbstractManager', { + + /* Begin Definitions */ + + requires: ['Ext.util.HashMap'], + + /* End Definitions */ + + typeName: 'type', + + constructor: function(config) { + Ext.apply(this, config || {}); + + /** + * Contains all of the items currently managed + * @property all + * @type Ext.util.MixedCollection + */ + this.all = Ext.create('Ext.util.HashMap'); + + this.types = {}; + }, + + /** + * Returns an item by id. + * For additional details see {@link Ext.util.HashMap#get}. + * @param {String} id The id of the item + * @return {Mixed} The item, undefined if not found. + */ + get : function(id) { + return this.all.get(id); + }, + + /** + * Registers an item to be managed + * @param {Mixed} item The item to register + */ + register: function(item) { + this.all.add(item); + }, + + /** + * Unregisters an item by removing it from this manager + * @param {Mixed} item The item to unregister + */ + unregister: function(item) { + this.all.remove(item); + }, + + /** + *

Registers a new item constructor, keyed by a type key. + * @param {String} type The mnemonic string by which the class may be looked up. + * @param {Constructor} cls The new instance class. + */ + registerType : function(type, cls) { + this.types[type] = cls; + cls[this.typeName] = type; + }, + + /** + * Checks if an item type is registered. + * @param {String} type The mnemonic string by which the class may be looked up + * @return {Boolean} Whether the type is registered. + */ + isRegistered : function(type){ + return this.types[type] !== undefined; + }, + + /** + * Creates and returns an instance of whatever this manager manages, based on the supplied type and config object + * @param {Object} config The config object + * @param {String} defaultType If no type is discovered in the config object, we fall back to this type + * @return {Mixed} The instance of whatever this manager is managing + */ + create: function(config, defaultType) { + var type = config[this.typeName] || config.type || defaultType, + Constructor = this.types[type]; + + // + if (Constructor == undefined) { + Ext.Error.raise("The '" + type + "' type has not been registered with this manager"); + } + // + + return new Constructor(config); + }, + + /** + * Registers a function that will be called when an item with the specified id is added to the manager. This will happen on instantiation. + * @param {String} id The item id + * @param {Function} fn The callback function. Called with a single parameter, the item. + * @param {Object} scope The scope (this reference) in which the callback is executed. Defaults to the item. + */ + onAvailable : function(id, fn, scope){ + var all = this.all, + item; + + if (all.containsKey(id)) { + item = all.get(id); + fn.call(scope || item, item); + } else { + all.on('add', function(map, key, item){ + if (key == id) { + fn.call(scope || item, item); + all.un('add', fn, scope); + } + }); + } + }, + + /** + * Executes the specified function once for each item in the collection. + * Returning false from the function will cease iteration. + * + * The paramaters passed to the function are: + *

+ * @param {Object} fn The function to execute. + * @param {Object} scope The scope to execute in. Defaults to this. + */ + each: function(fn, scope){ + this.all.each(fn, scope || this); + }, + + /** + * Gets the number of items in the collection. + * @return {Number} The number of items in the collection. + */ + getCount: function(){ + return this.all.getCount(); + } +});