Upgrade to ExtJS 4.0.2 - Released 06/09/2011
[extjs.git] / docs / source / Provider.html
index d420c80..9309db5 100644 (file)
-<html>\r
-<head>\r
-  <title>The source code</title>\r
-    <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
-    <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
-</head>\r
-<body  onload="prettyPrint();">\r
-    <pre class="prettyprint lang-js"><div id="cls-Ext.state.Provider"></div>/**
- * @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.
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>The source code</title>
+  <link href="../prettify/prettify.css" type="text/css" rel="stylesheet" />
+  <script type="text/javascript" src="../prettify/prettify.js"></script>
+  <style type="text/css">
+    .highlight { display: block; background-color: #ddd; }
+  </style>
+  <script type="text/javascript">
+    function highlight() {
+      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
+    }
+  </script>
+</head>
+<body onload="prettyPrint(); highlight();">
+  <pre class="prettyprint lang-js"><span id='Ext-state-Provider'>/**
+</span> * @class Ext.state.Provider
+ * &lt;p&gt;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.&lt;/p&gt;
+ *
+ * &lt;p&gt;This class provides methods for encoding and decoding &lt;b&gt;typed&lt;/b&gt; 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.&lt;/p&gt;
  */
-Ext.state.Provider = function(){
-    <div id="event-Ext.state.Provider-statechange"></div>/**
-     * @event statechange
-     * Fires when a state change occurs.
-     * @param {Provider} this This state provider
-     * @param {String} key The state key which was changed
-     * @param {String} value The encoded value for the state
+Ext.define('Ext.state.Provider', {
+    mixins: {
+        observable: 'Ext.util.Observable'
+    },
+    
+<span id='Ext-state-Provider-cfg-prefix'>    /**
+</span>     * @cfg {String} prefix A string to prefix to items stored in the underlying state store. 
+     * Defaults to &lt;tt&gt;'ext-'&lt;/tt&gt;
      */
-    this.addEvents("statechange");
-    this.state = {};
-    Ext.state.Provider.superclass.constructor.call(this);
-};
-Ext.extend(Ext.state.Provider, Ext.util.Observable, {
-    <div id="method-Ext.state.Provider-get"></div>/**
-     * Returns the current value for a key
+    prefix: 'ext-',
+    
+    constructor : function(config){
+        config = config || {};
+        var me = this;
+        Ext.apply(me, config);
+<span id='Ext-state-Provider-event-statechange'>        /**
+</span>         * @event statechange
+         * Fires when a state change occurs.
+         * @param {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(&quot;statechange&quot;);
+        me.state = {};
+        me.mixins.observable.constructor.call(me);
+    },
+    
+<span id='Ext-state-Provider-method-get'>    /**
+</span>     * Returns the current value for a key
      * @param {String} name The key name
      * @param {Mixed} defaultValue A default value to return if the key's value is not found
      * @return {Mixed} The state data
      */
     get : function(name, defaultValue){
-        return typeof this.state[name] == "undefined" ?
+        return typeof this.state[name] == &quot;undefined&quot; ?
             defaultValue : this.state[name];
     },
 
-    <div id="method-Ext.state.Provider-clear"></div>/**
-     * Clears a value from the state
+<span id='Ext-state-Provider-method-clear'>    /**
+</span>     * Clears a value from the state
      * @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(&quot;statechange&quot;, me, name, null);
     },
 
-    <div id="method-Ext.state.Provider-set"></div>/**
-     * Sets the value for a key
+<span id='Ext-state-Provider-method-set'>    /**
+</span>     * Sets the value for a key
      * @param {String} name The key name
      * @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(&quot;statechange&quot;, me, name, value);
     },
 
-    <div id="method-Ext.state.Provider-decodeValue"></div>/**
-     * Decodes a string previously encoded with {@link #encodeValue}.
+<span id='Ext-state-Provider-method-decodeValue'>    /**
+</span>     * Decodes a string previously encoded with {@link #encodeValue}.
      * @param {String} value The value to decode
      * @return {Mixed} The decoded value
      */
-    decodeValue : function(cookie){
-        var re = /^(a|n|d|b|s|o)\:(.*)$/;
-        var matches = re.exec(unescape(cookie));
-        if(!matches || !matches[1]) return; // non state cookie
-        var type = matches[1];
-        var v = matches[2];
-        switch(type){
-            case "n":
-                return parseFloat(v);
-            case "d":
-                return new Date(Date.parse(v));
-            case "b":
-                return (v == "1");
-            case "a":
-                var all = [];
-                var values = v.split("^");
-                for(var i = 0, len = values.length; i < len; i++){
-                    all.push(this.decodeValue(values[i]));
+    decodeValue : function(value){
+
+        // a -&gt; Array
+        // n -&gt; Number
+        // d -&gt; Date
+        // b -&gt; Boolean
+        // s -&gt; String
+        // o -&gt; Object
+        // -&gt; 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":
-                var all = {};
-                var values = v.split("^");
-                for(var i = 0, len = values.length; i < len; i++){
-                    var kv = values[i].split("=");
-                    all[kv[0]] = this.decodeValue(kv[1]);
+           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 v;
+                return value;
         }
     },
 
-    <div id="method-Ext.state.Provider-encodeValue"></div>/**
-     * Encodes a value including type information.  Decode with {@link #decodeValue}.
+<span id='Ext-state-Provider-method-encodeValue'>    /**
+</span>     * Encodes a value including type information.  Decode with {@link #decodeValue}.
      * @param {Mixed} value The value to encode
      * @return {String} The encoded value
      */
-    encodeValue : function(v){
-        var enc;
-        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)){
-            var flat = "";
-            for(var i = 0, len = v.length; i < len; i++){
-                flat += this.encodeValue(v[i]);
-                if(i != len-1) flat += "^";
+    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 &lt; len; i++) {
+                flat += this.encodeValue(value[i]);
+                if (i != len - 1) {
+                    flat += '^';
+                }
             }
-            enc = "a:" + flat;
-        }else if(typeof v == "object"){
-            var flat = "";
-            for(var key in v){
-                if(typeof v[key] != "function" && v[key] !== undefined){
-                    flat += key + "=" + this.encodeValue(v[key]) + "^";
+            enc = 'a:' + flat;
+        } else if (typeof value == 'object') {
+            for (key in value) {
+                if (typeof value[key] != 'function' &amp;&amp; value[key] !== undefined) {
+                    flat += key + '=' + this.encodeValue(value[key]) + '^';
                 }
             }
-            enc = "o:" + flat.substring(0, flat.length-1);
-        }else{
-            enc = "s:" + v;
+            enc = 'o:' + flat.substring(0, flat.length-1);
+        } else {
+            enc = 's:' + value;
         }
         return escape(enc);
     }
-});
-</pre>    \r
-</body>\r
-</html>
\ No newline at end of file
+});</pre>
+</body>
+</html>