home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / util / observe / observabledict.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  7.2 KB  |  240 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from observable import ObservableBase
  5. from weakref import WeakValueDictionary
  6. from collections import defaultdict
  7. from traceback import print_exc
  8. from util.primitives import better_ref
  9. from peak.util.imports import whenImported
  10. _usingWX = False
  11.  
  12. def _setup_usingWX(_mod):
  13.     
  14.     try:
  15.         import wx
  16.         globals()['wx'] = wx
  17.         EvtHandler = EvtHandler
  18.         import wx
  19.         globals()['EvtHandler'] = EvtHandler
  20.         PyDeadObjectError = PyDeadObjectError
  21.         import wx
  22.         globals()['PyDeadObjectError'] = PyDeadObjectError
  23.     except ImportError:
  24.         pass
  25.  
  26.     globals()['_usingWX'] = True
  27.  
  28.  
  29. class PyDeadObjectError(object):
  30.     pass
  31.  
  32. whenImported('wx', _setup_usingWX)
  33.  
  34. class Linked(object):
  35.     __slots__ = ('dict', 'thread', 'attr', 'ref')
  36.     
  37.     def __init__(self, dict, thread, attr, ref):
  38.         self.dict = dict
  39.         self.thread = thread
  40.         self.attr = attr
  41.         self.ref = ref
  42.  
  43.     
  44.     def unlink(self):
  45.         links = self.dict._links[self.thread]
  46.         if self.attr in links:
  47.             
  48.             try:
  49.                 links[self.attr].remove(self.ref)
  50.             except ValueError:
  51.                 pass
  52.             except:
  53.                 None<EXCEPTION MATCH>ValueError
  54.             
  55.  
  56.         None<EXCEPTION MATCH>ValueError
  57.  
  58.  
  59.  
  60. class DictWatcher(object):
  61.     
  62.     def __init__(self, srcdict, child_callback, *attrs):
  63.         srcdict.add_observer(self.on_dict_changed)
  64.         self.srcdict = srcdict
  65.         self.dictcopy = srcdict.copy()
  66.         self.child_args = [
  67.             child_callback] + list(attrs)
  68.         for key, child in srcdict.items():
  69.             child.add_observer(*self.child_args)
  70.         
  71.  
  72.     
  73.     def unbind_children(self):
  74.         for key, child in self.srcdict.items():
  75.             child.remove_observer(*self.child_args)
  76.         
  77.         self.srcdict.clear()
  78.         del self.srcdict
  79.  
  80.     
  81.     def on_dict_changed(self, src, attr, old, new):
  82.         if src != getattr(self, 'srcdict', None):
  83.             raise PyDeadObjectError
  84.         
  85.         new = set(src.keys())
  86.         old = set(self.dictcopy.keys())
  87.         for newkey in new - old:
  88.             src[newkey].add_observer(*self.child_args)
  89.         
  90.         for oldkey in old - new:
  91.             self.dictcopy[oldkey].remove_observer(*self.child_args)
  92.         
  93.         self.dictcopy = src.copy()
  94.  
  95.  
  96.  
  97. class ObservableDict(dict, ObservableBase):
  98.     _dict_observers = WeakValueDictionary()
  99.     
  100.     def __init__(self, *args):
  101.         ObservableBase.__init__(self)
  102.         dict.__init__(self, *args)
  103.  
  104.     
  105.     def __setitem__(self, key, val):
  106.         old = self.get(key, None)
  107.         retval = dict.__setitem__(self, key, val)
  108.         self.notify(key, old, val)
  109.         return retval
  110.  
  111.     
  112.     def secret_set(self, key, val):
  113.         return dict.__setitem__(self, key, val)
  114.  
  115.     
  116.     def remove_dict_observer(self, dict_changed, child_changed):
  117.         watcher = self._dict_observers.pop((dict_changed, child_changed), None)
  118.         if watcher:
  119.             watcher.unbind_children()
  120.             del watcher
  121.         
  122.  
  123.     
  124.     def link(self, key, callback, callnow = True, obj = None, thread = 'gui'):
  125.         
  126.         try:
  127.             links = self._links
  128.         except AttributeError:
  129.             links = self._setup_links()
  130.  
  131.         
  132.         try:
  133.             thread_links = links[thread]
  134.         except KeyError:
  135.             thread_links = links[thread] = defaultdict(list)
  136.  
  137.         if obj is None:
  138.             obj = callback.im_self
  139.         
  140.         ref = better_ref(callback, obj = obj)
  141.         thread_links[key].append(ref)
  142.         if callnow:
  143.             callback(self[key])
  144.         
  145.         return Linked(self, thread, key, ref)
  146.  
  147.     
  148.     def _setup_links(self):
  149.         print 'in _setup_links for object at %s' % id(self)
  150.         links = { }
  151.         object.__setattr__(self, '_links', links)
  152.         self.add_observer(self._link_watcher)
  153.         return links
  154.  
  155.     
  156.     def _link_watcher(self, src, attr, old, new):
  157.         for thread_name, callbacks in self._links.items():
  158.             if attr in callbacks:
  159.                 
  160.                 def later(cbs = (callbacks[attr],)):
  161.                     for cb_ref in list(cbs):
  162.                         cb = cb_ref()
  163.                         if cb is None:
  164.                             
  165.                             try:
  166.                                 cbs.remove(cb)
  167.                             except ValueError:
  168.                                 pass
  169.                             except:
  170.                                 None<EXCEPTION MATCH>ValueError
  171.                             
  172.  
  173.                         None<EXCEPTION MATCH>ValueError
  174.                         
  175.                         try:
  176.                             cb(new)
  177.                         continue
  178.                         except Exception:
  179.                             print_exc()
  180.                             continue
  181.                         
  182.  
  183.                     
  184.  
  185.                 if thread_name == 'gui':
  186.                     wx.CallAfter(later)
  187.                 
  188.             thread_name == 'gui'
  189.         
  190.  
  191.     
  192.     def clear(self):
  193.         keys = self.keys()
  194.         old_vals = [ self[k] for k in keys ]
  195.         dict.clear(self)
  196.         self.notify()
  197.  
  198.     
  199.     def update(self, mapping):
  200.         keys = mapping.keys()
  201.         old_vals = [ self.get(k, None) for k in keys ]
  202.         new_vals = [ mapping.get(k) for k in keys ]
  203.         dict.update(self, mapping)
  204.         self.notifyall(keys, old_vals, new_vals)
  205.  
  206.     
  207.     def __delitem__(self, key):
  208.         old_val = self[key]
  209.         retval = dict.__delitem__(self, key)
  210.         self.notify(key, old_val, None)
  211.         return retval
  212.  
  213.     
  214.     def setdefault(self, k, x = None):
  215.         if k not in self:
  216.             retval = dict.setdefault(self, k, x)
  217.             self.notify(k, None, x)
  218.             return retval
  219.         else:
  220.             return self[k]
  221.  
  222.     
  223.     def pop(self, k, x = None):
  224.         if k in self:
  225.             val = self[k]
  226.             dict.pop(self, k, x)
  227.             self.notify(k, val, None)
  228.             return val
  229.         else:
  230.             return x
  231.  
  232.     
  233.     def popitem(self):
  234.         (k, v) = dict.popitem(self)
  235.         self.notify(k, v, None)
  236.         return (k, v)
  237.  
  238.  
  239. observable_dict = ObservableDict
  240.