Update for release.
[python/dscho.git] / Mac / Tools / IDE / MacPrefs.py
blob6c7c553a830ee0b3477992307b8a2538fc75a544
1 import macfs
2 import marshal
3 import types
5 from MACFS import kOnSystemDisk
7 class PrefObject:
9 def __init__(self, dict = None):
10 if dict == None:
11 self._prefsdict = {}
12 else:
13 self._prefsdict = dict
15 def __len__(self):
16 return len(self._prefsdict)
18 def __delattr__(self, attr):
19 if self._prefsdict.has_key(attr):
20 del self._prefsdict[attr]
21 else:
22 raise AttributeError, 'delete non-existing instance attribute'
24 def __getattr__(self, attr):
25 if attr == '__members__':
26 keys = self._prefsdict.keys()
27 keys.sort()
28 return keys
29 try:
30 return self._prefsdict[attr]
31 except KeyError:
32 raise AttributeError, attr
34 def __setattr__(self, attr, value):
35 if attr[0] <> '_':
36 self._prefsdict[attr] = value
37 else:
38 self.__dict__[attr] = value
40 def getprefsdict(self):
41 return self._prefsdict
44 class PrefFile(PrefObject):
46 def __init__(self, path, creator = 'Pyth'):
47 # Find the preferences folder and our prefs file, create if needed.
48 self.__path = path
49 self.__creator = creator
50 self._prefsdict = {}
51 try:
52 prefdict = marshal.load(open(self.__path, 'rb'))
53 except (IOError, ValueError):
54 # file not found, or currupt marshal data
55 pass
56 else:
57 for key, value in prefdict.items():
58 if type(value) == types.DictType:
59 self._prefsdict[key] = PrefObject(value)
60 else:
61 self._prefsdict[key] = value
63 def save(self):
64 prefdict = {}
65 for key, value in self._prefsdict.items():
66 if type(value) == types.InstanceType:
67 prefdict[key] = value.getprefsdict()
68 if not prefdict[key]:
69 del prefdict[key]
70 else:
71 prefdict[key] = value
72 marshal.dump(prefdict, open(self.__path, 'wb'))
73 try:
74 fss = macfs.FSSpec(macfs.FSRef(self.__path))
75 fss.SetCreatorType(self.__creator, 'pref')
76 except:
77 pass
79 def __getattr__(self, attr):
80 if attr == '__members__':
81 keys = self._prefsdict.keys()
82 keys.sort()
83 return keys
84 try:
85 return self._prefsdict[attr]
86 except KeyError:
87 if attr[0] <> '_':
88 self._prefsdict[attr] = PrefObject()
89 return self._prefsdict[attr]
90 else:
91 raise AttributeError, attr
94 _prefscache = {}
96 def GetPrefs(prefname, creator = 'Pyth'):
97 import macostools, os
98 if _prefscache.has_key(prefname):
99 return _prefscache[prefname]
100 # Find the preferences folder and our prefs file, create if needed.
101 vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
102 prefsfolder_fss = macfs.FSSpec((vrefnum, dirid, ''))
103 prefsfolder = macfs.FSRef(prefsfolder_fss).as_fsspec().as_pathname()
104 path = os.path.join(prefsfolder, prefname)
105 head, tail = os.path.split(path)
106 # make sure the folder(s) exist
107 macostools.mkdirs(head)
109 preffile = PrefFile(path, creator)
110 _prefscache[prefname] = preffile
111 return preffile