Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / docs / source / Provider2.html
1 <!DOCTYPE html><html><head><title>Sencha Documentation Project</title><link rel="stylesheet" href="../reset.css" type="text/css"><link rel="stylesheet" href="../prettify.css" type="text/css"><link rel="stylesheet" href="../prettify_sa.css" type="text/css"><script type="text/javascript" src="../prettify.js"></script></head><body onload="prettyPrint()"><pre class="prettyprint"><pre><span id='Ext-state.Provider'>/**
2 </span> * @class Ext.state.Provider
3  * &lt;p&gt;Abstract base class for state provider implementations. The provider is responsible
4  * for setting values  and extracting values to/from the underlying storage source. The 
5  * storage source can vary and the details should be implemented in a subclass. For example
6  * a provider could use a server side database or the browser localstorage where supported.&lt;/p&gt;
7  *
8  * &lt;p&gt;This class provides methods for encoding and decoding &lt;b&gt;typed&lt;/b&gt; variables including 
9  * dates and defines the Provider interface. By default these methods put the value and the
10  * type information into a delimited string that can be stored. These should be overridden in 
11  * a subclass if you want to change the format of the encoded value and subsequent decoding.&lt;/p&gt;
12  */
13 Ext.define('Ext.state.Provider', {
14     mixins: {
15         observable: 'Ext.util.Observable'
16     },
17     
18 <span id='Ext-state.Provider-cfg-prefix'>    /**
19 </span>     * @cfg {String} prefix A string to prefix to items stored in the underlying state store. 
20      * Defaults to &lt;tt&gt;'ext-'&lt;/tt&gt;
21      */
22     prefix: 'ext-',
23     
24     constructor : function(config){
25         config = config || {};
26         var me = this;
27         Ext.apply(me, config);
28 <span id='Ext-state.Provider-event-statechange'>        /**
29 </span>         * @event statechange
30          * Fires when a state change occurs.
31          * @param {Provider} this This state provider
32          * @param {String} key The state key which was changed
33          * @param {String} value The encoded value for the state
34          */
35         me.addEvents(&quot;statechange&quot;);
36         me.state = {};
37         me.mixins.observable.constructor.call(me);
38     },
39     
40 <span id='Ext-state.Provider-method-get'>    /**
41 </span>     * Returns the current value for a key
42      * @param {String} name The key name
43      * @param {Mixed} defaultValue A default value to return if the key's value is not found
44      * @return {Mixed} The state data
45      */
46     get : function(name, defaultValue){
47         return typeof this.state[name] == &quot;undefined&quot; ?
48             defaultValue : this.state[name];
49     },
50
51 <span id='Ext-state.Provider-method-clear'>    /**
52 </span>     * Clears a value from the state
53      * @param {String} name The key name
54      */
55     clear : function(name){
56         var me = this;
57         delete me.state[name];
58         me.fireEvent(&quot;statechange&quot;, me, name, null);
59     },
60
61 <span id='Ext-state.Provider-method-set'>    /**
62 </span>     * Sets the value for a key
63      * @param {String} name The key name
64      * @param {Mixed} value The value to set
65      */
66     set : function(name, value){
67         var me = this;
68         me.state[name] = value;
69         me.fireEvent(&quot;statechange&quot;, me, name, value);
70     },
71
72 <span id='Ext-state.Provider-method-decodeValue'>    /**
73 </span>     * Decodes a string previously encoded with {@link #encodeValue}.
74      * @param {String} value The value to decode
75      * @return {Mixed} The decoded value
76      */
77     decodeValue : function(value){
78
79         // a -&gt; Array
80         // n -&gt; Number
81         // d -&gt; Date
82         // b -&gt; Boolean
83         // s -&gt; String
84         // o -&gt; Object
85         // -&gt; Empty (null)
86
87         var me = this,
88             re = /^(a|n|d|b|s|o|e)\:(.*)$/,
89             matches = re.exec(unescape(value)),
90             all,
91             type,
92             value,
93             keyValue;
94             
95         if(!matches || !matches[1]){
96             return; // non state
97         }
98         
99         type = matches[1];
100         value = matches[2];
101         switch (type) {
102             case 'e':
103                 return null;
104             case 'n':
105                 return parseFloat(value);
106             case 'd':
107                 return new Date(Date.parse(value));
108             case 'b':
109                 return (value == '1');
110             case 'a':
111                 all = [];
112                 if(value != ''){
113                     Ext.each(value.split('^'), function(val){
114                         all.push(me.decodeValue(val));
115                     }, me);
116                 }
117                 return all;
118            case 'o':
119                 all = {};
120                 if(value != ''){
121                     Ext.each(value.split('^'), function(val){
122                         keyValue = val.split('=');
123                         all[keyValue[0]] = me.decodeValue(keyValue[1]);
124                     }, me);
125                 }
126                 return all;
127            default:
128                 return value;
129         }
130     },
131
132 <span id='Ext-state.Provider-method-encodeValue'>    /**
133 </span>     * Encodes a value including type information.  Decode with {@link #decodeValue}.
134      * @param {Mixed} value The value to encode
135      * @return {String} The encoded value
136      */
137     encodeValue : function(value){
138         var flat = '',
139             i = 0,
140             enc,
141             len,
142             key;
143             
144         if (value == null) {
145             return 'e:1';    
146         } else if(typeof value == 'number') {
147             enc = 'n:' + value;
148         } else if(typeof value == 'boolean') {
149             enc = 'b:' + (value ? '1' : '0');
150         } else if(Ext.isDate(value)) {
151             enc = 'd:' + value.toGMTString();
152         } else if(Ext.isArray(value)) {
153             for (len = value.length; i &lt; len; i++) {
154                 flat += this.encodeValue(value[i]);
155                 if (i != len - 1) {
156                     flat += '^';
157                 }
158             }
159             enc = 'a:' + flat;
160         } else if (typeof value == 'object') {
161             for (key in value) {
162                 if (typeof value[key] != 'function' &amp;&amp; value[key] !== undefined) {
163                     flat += key + '=' + this.encodeValue(value[key]) + '^';
164                 }
165             }
166             enc = 'o:' + flat.substring(0, flat.length-1);
167         } else {
168             enc = 's:' + value;
169         }
170         return escape(enc);
171     }
172 });</pre></pre></body></html>