extra: import at 3.0.1 beta 1
[mozilla-extra.git] / extensions / venkman / resources / content / pref-manager.js
blob62506dfc21195e8851f9d1b25d2555890ffd3da1
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2  *
3  * ***** BEGIN LICENSE BLOCK *****
4  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5  *
6  * The contents of this file are subject to the Mozilla Public License Version
7  * 1.1 (the "License"); you may not use this file except in compliance with
8  * the License. You may obtain a copy of the License at
9  * http://www.mozilla.org/MPL/
10  *
11  * Software distributed under the License is distributed on an "AS IS" basis,
12  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13  * for the specific language governing rights and limitations under the
14  * License.
15  *
16  * The Original Code is The JavaScript Debugger.
17  *
18  * The Initial Developer of the Original Code is
19  * Netscape Communications Corporation.
20  * Portions created by the Initial Developer are Copyright (C) 1998
21  * the Initial Developer. All Rights Reserved.
22  *
23  * Contributor(s):
24  *   Robert Ginda, <rginda@netscape.com>, original author
25  *
26  * Alternatively, the contents of this file may be used under the terms of
27  * either the GNU General Public License Version 2 or later (the "GPL"), or
28  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29  * in which case the provisions of the GPL or the LGPL are applicable instead
30  * of those above. If you wish to allow use of your version of this file only
31  * under the terms of either the GPL or the LGPL, and not to allow others to
32  * use your version of this file under the terms of the MPL, indicate your
33  * decision by deleting the provisions above and replace them with the notice
34  * and other provisions required by the GPL or the LGPL. If you do not delete
35  * the provisions above, a recipient may use your version of this file under
36  * the terms of any one of the MPL, the GPL or the LGPL.
37  *
38  * ***** END LICENSE BLOCK ***** */
40 function PrefManager (branchName)
42     var prefManager = this;
43     
44     function pm_observe (prefService, topic, prefName)
45     {
46         prefManager.dirtyPrefs[prefName] = true;
47     };
49     const PREF_CTRID = "@mozilla.org/preferences-service;1";
50     const nsIPrefService = Components.interfaces.nsIPrefService;
51     const nsIPrefBranch = Components.interfaces.nsIPrefBranch;
52     const nsIPrefBranchInternal = Components.interfaces.nsIPrefBranchInternal;
54     this.prefService =
55         Components.classes[PREF_CTRID].getService(nsIPrefService);
56     this.prefBranch = this.prefService.getBranch(branchName);
57     this.prefNames = new Array();
58     this.dirtyPrefs = new Object();
59     this.prefs = new Object();
60     this.observer = { observe: pm_observe };
62     this.prefBranchInternal =
63         this.prefBranch.QueryInterface(nsIPrefBranchInternal);
64     this.prefBranchInternal.addObserver("", this.observer, false);
68 PrefManager.prototype.destroy =
69 function pm_destroy()
71     this.prefBranchInternal.removeObserver("", this.observer);
74 PrefManager.prototype.listPrefs =
75 function pm_listprefs (prefix)
77     var list = new Array();
78     var names = this.prefNames;
79     for (var i = 0; i < names.length; ++i)
80     {
81         if (!prefix || names[i].indexOf(prefix) == 0)
82             list.push (names[i]);
83     }
85     return list;
88 PrefManager.prototype.readPrefs =
89 function pm_readprefs ()
91     const nsIPrefBranch = Components.interfaces.nsIPrefBranch;
93     var list = this.prefBranch.getChildList("", {});
94     for (var i = 0; i < list.length; ++i)
95     {
96         if (!(list[i] in this))
97         {
98             var type = this.prefBranch.getPrefType (list[i]);
99             var defaultValue;
100             
101             switch (type)
102             {
103                 case nsIPrefBranch.PREF_INT:
104                     defaultValue = 0;
105                     break;
106                 
107                 case nsIPrefBranch.PREF_BOOL:
108                     defaultValue = false;
109                     break;
111                 default:
112                     defaultValue = "";
113             }
114             
115             this.addPref(list[i], defaultValue);
116         }
117     }
120 PrefManager.prototype.addPrefs =
121 function pm_addprefs (prefSpecs)
123     for (var i = 0; i < prefSpecs.length; ++i)
124         this.addPref(prefSpecs[i][0], prefSpecs[i][1]);
126         
127 PrefManager.prototype.addPref =
128 function pm_addpref (prefName, defaultValue)
130     var realValue;
131     
132     var prefManager = this;
133     
134     function prefGetter ()
135     {
136         //dd ("getter for ``" + prefName + "''");
137         //dd ("default: " + defaultValue);
138         //dd ("real: " + realValue);
140         if (typeof realValue == "undefined" ||
141             prefName in prefManager.dirtyPrefs)
142         {
143             try
144             {
145                 if (typeof defaultValue == "boolean")
146                 {
147                     realValue = prefManager.prefBranch.getBoolPref(prefName);
148                 }
149                 else if (typeof defaultValue == "number")
150                 {
151                     realValue = prefManager.prefBranch.getIntPref(prefName);
152                 }
153                 else if (defaultValue instanceof Array)
154                 {
155                     realValue = prefManager.prefBranch.getCharPref(prefName);
156                     realValue = realValue.split(/s*;\s*/);
157                     for (i = 0; i < realValue.length; ++i)
158                         realValue[i] = unencode(realValue[i]);
159                 }
160                 else if (typeof defaultValue == "string")
161                 {
162                     realValue = prefManager.prefBranch.getCharPref(prefName);
163                 }
164                 else
165                 {
166                     realValue = defaultValue;
167                 }
168             }
169             catch (ex)
170             {
171                 //dd ("caught exception reading pref ``" + prefName + "''\n" +
172                 //ex);
173                 realValue = defaultValue;
174             }
175         }
177         delete prefManager.dirtyPrefs[prefName];
178         return realValue;
179     }
180     
181     function prefSetter (value)
182     {
183         try
184         {
185             if (typeof defaultValue == "boolean")
186             {
187                 prefManager.prefBranch.setBoolPref(prefName, value);
188             }
189             else if (typeof defaultValue == "number")
190             {
191                 prefManager.prefBranch.setIntPref(prefName, value);
192             }
193             else if (defaultValue instanceof Array)
194             {
195                 var ary = new Array();
196                 for (i = 0; i < value.length; ++i)
197                     ary[i] = encode(value[i]);
198                 
199                 prefManager.prefBranch.setCharPref(prefName, ary.join("; "));
200             }
201             else
202             {
203                 prefManager.prefBranch.setCharPref(prefName, value);
204             }
206             prefManager.prefService.savePrefFile(null);
207         }
208         catch (ex)
209         {
210             dd ("caught exception writing pref ``" + prefName + "''\n" + ex);
211         }
213         return value;
214     };
215     
216     if (!arrayContains(prefManager.prefNames, prefName))
217         prefManager.prefNames.push(prefName);
219     prefManager.prefNames.sort();
220     prefManager.prefs.__defineGetter__(prefName, prefGetter);
221     prefManager.prefs.__defineSetter__(prefName, prefSetter);