X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/0494b8d9b9bb03ab6c22b34dae81261e3cd7e3e6..7a654f8d43fdb43d78b63d90528bed6e86b608cc:/src/state/Provider.js diff --git a/src/state/Provider.js b/src/state/Provider.js index fab85baf..f7bccde7 100644 --- a/src/state/Provider.js +++ b/src/state/Provider.js @@ -1,18 +1,30 @@ -/*! - * Ext JS Library 3.3.1 - * Copyright(c) 2006-2010 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ /** * @class Ext.state.Provider - * Abstract base class for state provider implementations. This class provides methods - * for encoding and decoding typed variables including dates and defines the - * Provider interface. + *

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.

+ * + *

This class provides methods for encoding and decoding typed 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.

*/ -Ext.state.Provider = Ext.extend(Ext.util.Observable, { +Ext.define('Ext.state.Provider', { + mixins: { + observable: 'Ext.util.Observable' + }, + + /** + * @cfg {String} prefix A string to prefix to items stored in the underlying state store. + * Defaults to 'ext-' + */ + prefix: 'ext-', - constructor : function(){ + constructor : function(config){ + config = config || {}; + var me = this; + Ext.apply(me, config); /** * @event statechange * Fires when a state change occurs. @@ -20,9 +32,9 @@ Ext.state.Provider = Ext.extend(Ext.util.Observable, { * @param {String} key The state key which was changed * @param {String} value The encoded value for the state */ - this.addEvents("statechange"); - this.state = {}; - Ext.state.Provider.superclass.constructor.call(this); + me.addEvents("statechange"); + me.state = {}; + me.mixins.observable.constructor.call(me); }, /** @@ -41,8 +53,9 @@ Ext.state.Provider = Ext.extend(Ext.util.Observable, { * @param {String} name The key name */ clear : function(name){ - delete this.state[name]; - this.fireEvent("statechange", this, name, null); + var me = this; + delete me.state[name]; + me.fireEvent("statechange", me, name, null); }, /** @@ -51,8 +64,9 @@ Ext.state.Provider = Ext.extend(Ext.util.Observable, { * @param {Mixed} value The value to set */ set : function(name, value){ - this.state[name] = value; - this.fireEvent("statechange", this, name, value); + var me = this; + me.state[name] = value; + me.fireEvent("statechange", me, name, value); }, /** @@ -60,55 +74,58 @@ Ext.state.Provider = Ext.extend(Ext.util.Observable, { * @param {String} value The value to decode * @return {Mixed} The decoded value */ - decodeValue : function(cookie){ - /** - * a -> Array - * n -> Number - * d -> Date - * b -> Boolean - * s -> String - * o -> Object - * -> Empty (null) - */ - var re = /^(a|n|d|b|s|o|e)\:(.*)$/, - matches = re.exec(unescape(cookie)), + 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, - v, - kv; + value, + keyValue; + if(!matches || !matches[1]){ - return; // non state cookie + return; // non state } + type = matches[1]; - v = matches[2]; - switch(type){ + value = matches[2]; + switch (type) { case 'e': return null; case 'n': - return parseFloat(v); + return parseFloat(value); case 'd': - return new Date(Date.parse(v)); + return new Date(Date.parse(value)); case 'b': - return (v == '1'); + return (value == '1'); case 'a': all = []; - if(v != ''){ - Ext.each(v.split('^'), function(val){ - all.push(this.decodeValue(val)); - }, this); + if(value != ''){ + Ext.each(value.split('^'), function(val){ + all.push(me.decodeValue(val)); + }, me); } return all; case 'o': all = {}; - if(v != ''){ - Ext.each(v.split('^'), function(val){ - kv = val.split('='); - all[kv[0]] = this.decodeValue(kv[1]); - }, this); + if(value != ''){ + Ext.each(value.split('^'), function(val){ + keyValue = val.split('='); + all[keyValue[0]] = me.decodeValue(keyValue[1]); + }, me); } return all; default: - return v; + return value; } }, @@ -117,38 +134,39 @@ Ext.state.Provider = Ext.extend(Ext.util.Observable, { * @param {Mixed} value The value to encode * @return {String} The encoded value */ - encodeValue : function(v){ - var enc, - flat = '', + encodeValue : function(value){ + var flat = '', i = 0, + enc, len, key; - if(v == null){ + + if (value == null) { return 'e:1'; - }else if(typeof v == 'number'){ - enc = 'n:' + v; - }else if(typeof v == 'boolean'){ - enc = 'b:' + (v ? '1' : '0'); - }else if(Ext.isDate(v)){ - enc = 'd:' + v.toGMTString(); - }else if(Ext.isArray(v)){ - for(len = v.length; i < len; i++){ - flat += this.encodeValue(v[i]); - if(i != len - 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 v == 'object'){ - for(key in v){ - if(typeof v[key] != 'function' && v[key] !== undefined){ - flat += key + '=' + this.encodeValue(v[key]) + '^'; + } 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:' + v; + } else { + enc = 's:' + value; } return escape(enc); } -}); +}); \ No newline at end of file