home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Mac / Tools / IDE / MacPrefs.py < prev    next >
Encoding:
Python Source  |  2000-06-23  |  2.5 KB  |  109 lines

  1. import macfs
  2. import marshal
  3. import types
  4.  
  5. kOnSystemDisk = 0x8000
  6.  
  7.  
  8. class PrefObject:
  9.     
  10.     def __init__(self, dict = None):
  11.         if dict == None:
  12.             self._prefsdict = {}
  13.         else:
  14.             self._prefsdict = dict
  15.     
  16.     def __len__(self):
  17.         return len(self._prefsdict)
  18.     
  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'
  24.     
  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
  34.     
  35.     def __setattr__(self, attr, value):
  36.         if attr[0] <> '_':
  37.             self._prefsdict[attr] = value
  38.         else:
  39.             self.__dict__[attr] = value
  40.     
  41.     def getprefsdict(self):
  42.         return self._prefsdict
  43.  
  44.  
  45. class PrefFile(PrefObject):
  46.     
  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
  62.     
  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')
  75.     
  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
  89.  
  90.  
  91. _prefscache = {}
  92.  
  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)
  105.     
  106.     preffile = PrefFile(path, creator)
  107.     _prefscache[prefname] = preffile
  108.     return preffile
  109.