def _promote(self, accessible): ''' Promote a pyatspi.Accessibility.Accessible to a specific strongwind class if possible (e.g., a strongwind.accessibles.Dialog), or to a generic strongwind.accessibles.Accessible otherwise. ''' # look in the application/widget cache first if accessible.getRole() == pyatspi.ROLE_APPLICATION: try: return cache.getApplicationById(accessible.queryApplication().id) except KeyError: pass # not in cache else: try: return cache.getWidget(accessible) except KeyError: pass # not in cache # try looking for a specific strongwind class, e.g. strongwind.accessibles.MenuBar try: className = utils.toClassName(accessible.getRoleName()) # convert the accessible's role name to a class name, e.g. "menu bar" => "MenuBar" module = __import__(__name__) # import the current module (strongwind.accessibles) so we can inspect its vars klass = vars(module)[className] # turn the className (a string) into the class of that name (e.g., a MenuBar class) return klass(accessible) # return an instance of the class (e.g., a MenuBar object) except KeyError: return Accessible(accessible)
def _promote(self, accessible): ''' Promote a pyatspi.Accessibility.Accessible to a specific strongwind class if possible (e.g., a strongwind.accessibles.Dialog), or to a generic strongwind.accessibles.Accessible otherwise. ''' # look in the application/widget cache first if accessible.getRole() == pyatspi.ROLE_APPLICATION: try: return cache.getApplicationById( accessible.queryApplication().id) except KeyError: pass # not in cache else: try: return cache.getWidget(accessible) except KeyError: pass # not in cache # try looking for a specific strongwind class, e.g. strongwind.accessibles.MenuBar try: className = utils.toClassName( accessible.getRoleName() ) # convert the accessible's role name to a class name, e.g. "menu bar" => "MenuBar" module = __import__( __name__ ) # import the current module (strongwind.accessibles) so we can inspect its vars klass = vars( module )[className] # turn the className (a string) into the class of that name (e.g., a MenuBar class) return klass( accessible ) # return an instance of the class (e.g., a MenuBar object) except KeyError: return Accessible(accessible)
def findMethod(name, logName=None, checkShowing=True, retry=True, recursive=True, breadthFirst=True, raiseException=True, setReference=False): dontCheckShowing = not checkShowing y = utils.findDescendant(self, lambda x: x.role == v[a] and utils.equalsOrMatches(x.name, name) and (dontCheckShowing or x.showing), \ retry=retry, recursive=recursive, breadthFirst=breadthFirst, raiseException=raiseException) # don't try promoting y if it's None if not raiseException and y is None: return y # look in the widget cache first try: return cache.getWidget(y) except KeyError: pass # not in cache # if the logName isn't given, set it to the name (unless the name is a regex) if logName is None and type(name) is not type( re.compile('r')): logName = name # if we still don't have a logname, just grab the name of the accessible if logName is None: logName = y.name # at this point, we have a logName. next, we look for a class named # logName + roleName in moduleName. if such a class can be found, we promote # the widget to that class, cache the instance, and return it. # # if no such class can be found, and the logName is different than the name # of the widget, set the widget's log name and cache the widget. if the logName # is the same as the widget's logName, there's no need to cache the widget. # if the logName is 'Preferences' and roleName of the widget is 'Dialog', # the name of the class to look for is 'PreferencesDialog' className = utils.toClassName( logName) + utils.toClassName(y.roleName) # the module prefix is the module of this class. so if we had a widget that had # a class medsphere.openvistacis.OpenVistaCIS, and we call findDialog('Preferences') # on it, the module prefix would be medsphere.openvistacis. we append the name of # the class we're looking for to the module prefix to get the name of the module. # so continuing with the example, the full module name would be # medsphere.openvistacis.preferencesdialog. (In the medsphere.openvistacis.preferencesdialog # module, we would look for 'PreferencesDialog' - that code is a few lines down) moduleName = self.__class__.__module__ + '.' + className.lower( ) try: # import the module, grab the class, and make an instance of it, then cache the instance module = __import__(moduleName, globals(), None, [className]) klass = vars(module)[className] z = klass(y) cache.addWidget(z) except (ImportError, KeyError): # if the found widget's logName isn't the same as the logName # we were given, set the widget's logName and cache the widget if y.name != logName: y.logName = logName cache.addWidget( y ) # make the log name stick by caching the object with the logName property set on it z = y # set self.preferencesDialog = the widget we just found/promoted/cached if setReference: self.__setattr__( utils.toVarName(logName) + utils.toClassName(z.roleName), z) return z
def findMethod(name, logName=None, checkShowing=True, retry=True, recursive=True, breadthFirst=True, raiseException=True, setReference=False): dontCheckShowing = not checkShowing y = utils.findDescendant(self, lambda x: x.role == v[a] and utils.equalsOrMatches(x.name, name) and (dontCheckShowing or x.showing), \ retry=retry, recursive=recursive, breadthFirst=breadthFirst, raiseException=raiseException) # don't try promoting y if it's None if not raiseException and y is None: return y # look in the widget cache first try: return cache.getWidget(y) except KeyError: pass # not in cache # if the logName isn't given, set it to the name (unless the name is a regex) if logName is None and type(name) is not type(re.compile('r')): logName = name # if we still don't have a logname, just grab the name of the accessible if logName is None: logName = y.name # at this point, we have a logName. next, we look for a class named # logName + roleName in moduleName. if such a class can be found, we promote # the widget to that class, cache the instance, and return it. # # if no such class can be found, and the logName is different than the name # of the widget, set the widget's log name and cache the widget. if the logName # is the same as the widget's logName, there's no need to cache the widget. # if the logName is 'Preferences' and roleName of the widget is 'Dialog', # the name of the class to look for is 'PreferencesDialog' className = utils.toClassName(logName) + utils.toClassName(y.roleName) # the module prefix is the module of this class. so if we had a widget that had # a class medsphere.openvistacis.OpenVistaCIS, and we call findDialog('Preferences') # on it, the module prefix would be medsphere.openvistacis. we append the name of # the class we're looking for to the module prefix to get the name of the module. # so continuing with the example, the full module name would be # medsphere.openvistacis.preferencesdialog. (In the medsphere.openvistacis.preferencesdialog # module, we would look for 'PreferencesDialog' - that code is a few lines down) moduleName = self.__class__.__module__ + '.' + className.lower() try: # import the module, grab the class, and make an instance of it, then cache the instance module = __import__(moduleName, globals(), None, [className]) klass = vars(module)[className] z = klass(y) cache.addWidget(z) except (ImportError, KeyError): # if the found widget's logName isn't the same as the logName # we were given, set the widget's logName and cache the widget if y.name != logName: y.logName = logName cache.addWidget(y) # make the log name stick by caching the object with the logName property set on it z = y # set self.preferencesDialog = the widget we just found/promoted/cached if setReference: self.__setattr__(utils.toVarName(logName) + utils.toClassName(z.roleName), z) return z