Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / src / state / Provider.js
index fab85ba..f7bccde 100644 (file)
@@ -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 <b>typed</b> variables including dates and defines the
- * Provider interface.
+ * <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.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 <tt>'ext-'</tt>
+     */
+    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