Added 'description' class attribute to every command class (to help the
[python/dscho.git] / Mac / Tools / IDE / MacPrefs.py
blob8a442ea23e68a414a4f101e07367fed20abee19b
1 import macfs
2 import marshal
3 import types
5 kOnSystemDisk = 0x8000
8 class PrefObject:
10 def __init__(self, dict = None):
11 if dict == None:
12 self._prefsdict = {}
13 else:
14 self._prefsdict = dict
16 def __len__(self):
17 return len(self._prefsdict)
19 def __delattr__(self, attr):
20 if self._prefsdict.has_key(attr):
21 del self._prefsdict[attr]
22 else:
23 raise AttributeError, 'delete non-existing instance attribute'
25 def __getattr__(self, attr):
26 if attr == '__members__':
27 keys = self._prefsdict.keys()
28 keys.sort()
29 return keys
30 try:
31 return self._prefsdict[attr]
32 except KeyError:
33 raise AttributeError, attr
35 def __setattr__(self, attr, value):
36 if attr[0] <> '_':
37 self._prefsdict[attr] = value
38 else:
39 self.__dict__[attr] = value
41 def getprefsdict(self):
42 return self._prefsdict
45 class PrefFile(PrefObject):
47 def __init__(self, path, creator = 'Pyth'):
48 # Find the preferences folder and our prefs file, create if needed.
49 self.__path = path
50 self.__creator = creator
51 self._prefsdict = {}
52 try:
53 prefdict = marshal.load(open(self.__path, 'rb'))
54 except IOError:
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 fss = macfs.FSSpec(self.__path)
74 fss.SetCreatorType(self.__creator, 'pref')
76 def __getattr__(self, attr):
77 if attr == '__members__':
78 keys = self._prefsdict.keys()
79 keys.sort()
80 return keys
81 try:
82 return self._prefsdict[attr]
83 except KeyError:
84 if attr[0] <> '_':
85 self._prefsdict[attr] = PrefObject()
86 return self._prefsdict[attr]
87 else:
88 raise AttributeError, attr
91 _prefscache = {}
93 def GetPrefs(prefname, creator = 'Pyth'):
94 import macostools, os
95 if _prefscache.has_key(prefname):
96 return _prefscache[prefname]
97 # Find the preferences folder and our prefs file, create if needed.
98 vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
99 prefsfolder_fss = macfs.FSSpec((vrefnum, dirid, ''))
100 prefsfolder = prefsfolder_fss.as_pathname()
101 path = os.path.join(prefsfolder, prefname)
102 head, tail = os.path.split(path)
103 # make sure the folder(s) exist
104 macostools.mkdirs(head)
106 preffile = PrefFile(path, creator)
107 _prefscache[prefname] = preffile
108 return preffile