X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/6746dc89c47ed01b165cc1152533605f97eb8e8d..refs/heads/master:/docs/source/Provider2.html diff --git a/docs/source/Provider2.html b/docs/source/Provider2.html index 8c05b82b..48605b3d 100644 --- a/docs/source/Provider2.html +++ b/docs/source/Provider2.html @@ -3,8 +3,8 @@
/** - * @class Ext.direct.Provider - * <p>Ext.direct.Provider is an abstract class meant to be extended.</p> - * - * <p>For example ExtJs implements the following subclasses:</p> - * <pre><code> -Provider -| -+---{@link Ext.direct.JsonProvider JsonProvider} - | - +---{@link Ext.direct.PollingProvider PollingProvider} - | - +---{@link Ext.direct.RemotingProvider RemotingProvider} - * </code></pre> - * @abstract +/** + * @class Ext.state.Provider + * <p>Abstract base class for state provider implementations. The provider is responsible + * for setting values and extracting values to/from the underlying storage source. The + * storage source can vary and the details should be implemented in a subclass. For example + * a provider could use a server side database or the browser localstorage where supported.</p> + * + * <p>This class provides methods for encoding and decoding <b>typed</b> variables including + * dates and defines the Provider interface. By default these methods put the value and the + * type information into a delimited string that can be stored. These should be overridden in + * a subclass if you want to change the format of the encoded value and subsequent decoding.</p> */ -Ext.define('Ext.direct.Provider', { - - /* Begin Definitions */ - - alias: 'direct.provider', - +Ext.define('Ext.state.Provider', { mixins: { - observable: 'Ext.util.Observable' + observable: 'Ext.util.Observable' }, - - /* End Definitions */ - - /** - * @cfg {String} id - * The unique id of the provider (defaults to an {@link Ext#id auto-assigned id}). - * You should assign an id if you need to be able to access the provider later and you do - * not have an object reference available, for example: - * <pre><code> -Ext.direct.Manager.addProvider({ - type: 'polling', - url: 'php/poll.php', - id: 'poll-provider' -}); -var p = {@link Ext.direct.Manager}.{@link Ext.direct.Manager#getProvider getProvider}('poll-provider'); -p.disconnect(); - * </code></pre> + + /** + * @cfg {String} prefix A string to prefix to items stored in the underlying state store. + * Defaults to <tt>'ext-'</tt> */ + prefix: 'ext-', constructor : function(config){ + config = config || {}; var me = this; - Ext.apply(me, config); - me.addEvents( - /** - * @event connect - * Fires when the Provider connects to the server-side - * @param {Ext.direct.Provider} provider The {@link Ext.direct.Provider Provider}. - */ - 'connect', - /** - * @event disconnect - * Fires when the Provider disconnects from the server-side - * @param {Ext.direct.Provider} provider The {@link Ext.direct.Provider Provider}. - */ - 'disconnect', - /** - * @event data - * Fires when the Provider receives data from the server-side - * @param {Ext.direct.Provider} provider The {@link Ext.direct.Provider Provider}. - * @param {event} e The Ext.Direct.Event type that occurred. - */ - 'data', - /** - * @event exception - * Fires when the Provider receives an exception from the server-side - */ - 'exception' - ); - me.mixins.observable.constructor.call(me, config); + /** + * @event statechange + * Fires when a state change occurs. + * @param {Ext.state.Provider} this This state provider + * @param {String} key The state key which was changed + * @param {String} value The encoded value for the state + */ + me.addEvents("statechange"); + me.state = {}; + me.mixins.observable.constructor.call(me); }, - /** - * Returns whether or not the server-side is currently connected. - * Abstract method for subclasses to implement. + /** + * Returns the current value for a key + * @param {String} name The key name + * @param {Object} defaultValue A default value to return if the key's value is not found + * @return {Object} The state data */ - isConnected: function(){ - return false; + get : function(name, defaultValue){ + return typeof this.state[name] == "undefined" ? + defaultValue : this.state[name]; }, - /** - * Abstract methods for subclasses to implement. - * @method + /** + * Clears a value from the state + * @param {String} name The key name */ - connect: Ext.emptyFn, - - /** - * Abstract methods for subclasses to implement. - * @method + clear : function(name){ + var me = this; + delete me.state[name]; + me.fireEvent("statechange", me, name, null); + }, + + /** + * Sets the value for a key + * @param {String} name The key name + * @param {Object} value The value to set + */ + set : function(name, value){ + var me = this; + me.state[name] = value; + me.fireEvent("statechange", me, name, value); + }, + + /** + * Decodes a string previously encoded with {@link #encodeValue}. + * @param {String} value The value to decode + * @return {Object} The decoded value */ - disconnect: Ext.emptyFn -}); -+ decodeValue : function(value){ + + // a -> Array + // n -> Number + // d -> Date + // b -> Boolean + // s -> String + // o -> Object + // -> Empty (null) + + var me = this, + re = /^(a|n|d|b|s|o|e)\:(.*)$/, + matches = re.exec(unescape(value)), + all, + type, + value, + keyValue; + + if(!matches || !matches[1]){ + return; // non state + } + + type = matches[1]; + value = matches[2]; + switch (type) { + case 'e': + return null; + case 'n': + return parseFloat(value); + case 'd': + return new Date(Date.parse(value)); + case 'b': + return (value == '1'); + case 'a': + all = []; + if(value != ''){ + Ext.each(value.split('^'), function(val){ + all.push(me.decodeValue(val)); + }, me); + } + return all; + case 'o': + all = {}; + if(value != ''){ + Ext.each(value.split('^'), function(val){ + keyValue = val.split('='); + all[keyValue[0]] = me.decodeValue(keyValue[1]); + }, me); + } + return all; + default: + return value; + } + }, + + /** + * Encodes a value including type information. Decode with {@link #decodeValue}. + * @param {Object} value The value to encode + * @return {String} The encoded value + */ + encodeValue : function(value){ + var flat = '', + i = 0, + enc, + len, + key; + + if (value == null) { + return 'e:1'; + } else if(typeof value == 'number') { + enc = 'n:' + value; + } else if(typeof value == 'boolean') { + enc = 'b:' + (value ? '1' : '0'); + } else if(Ext.isDate(value)) { + enc = 'd:' + value.toGMTString(); + } else if(Ext.isArray(value)) { + for (len = value.length; i < len; i++) { + flat += this.encodeValue(value[i]); + if (i != len - 1) { + flat += '^'; + } + } + enc = 'a:' + flat; + } else if (typeof value == 'object') { + for (key in value) { + if (typeof value[key] != 'function' && value[key] !== undefined) { + flat += key + '=' + this.encodeValue(value[key]) + '^'; + } + } + enc = 'o:' + flat.substring(0, flat.length-1); + } else { + enc = 's:' + value; + } + return escape(enc); + } +});