# MFC base classes. import sys import win32ui class Object: def __init__(self, initObj = None): self.__dict__['_obj_'] = initObj # self._obj_ = initObj if initObj is not None: initObj.AttachObject(self) def __del__(self): self.close() def __getattr__(self, attr): # Make this object look like the underlying win32ui one. # During cleanup __dict__ is not available, causing recursive death. if not attr.startswith('__'): try: o = self.__dict__['_obj_'] if o is not None: return getattr(o, attr) # Only raise this error for non "internal" names - # Python may be calling __len__, __nonzero__, etc, so # we dont want this exception if attr[0]!= '_' and attr[-1] != '_': raise win32ui.error("The MFC object has died.") except KeyError: # No _obj_ at all - dont report MFC object died when there isnt one! pass raise AttributeError(attr) def OnAttachedObjectDeath(self): # print "object", self.__class__.__name__, "dieing" self._obj_ = None def close(self): if '_obj_' in self.__dict__: if self._obj_ is not None: self._obj_.AttachObject(None) self._obj_ = None class CmdTarget(Object): def __init__(self, initObj): Object.__init__(self, initObj) def HookNotifyRange(self, handler, firstID, lastID): oldhandlers = [] for i in range(firstID, lastID + 1): oldhandlers.append(self.HookNotify(handler, i)) return oldhandlers def HookCommandRange(self, handler, firstID, lastID): oldhandlers = [] for i in range(firstID, lastID + 1): oldhandlers.append(self.HookCommand(handler, i)) return oldhandlers def HookCommandUpdateRange(self, handler, firstID, lastID): oldhandlers = [] for i in range(firstID, lastID + 1): oldhandlers.append(self.HookCommandUpdate(handler, i)) return oldhandlers