1 #Copyright (C) 2008 Codethink Ltd
3 #This library is free software; you can redistribute it and/or
4 #modify it under the terms of the GNU Lesser General Public
5 #License version 2 as published by the Free Software Foundation.
7 #This program is distributed in the hope that it will be useful,
8 #but WITHOUT ANY WARRANTY; without even the implied warranty of
9 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 #GNU General Public License for more details.
11 #You should have received a copy of the GNU Lesser General Public License
12 #along with this program; if not, write to the Free Software
13 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 from base import BaseProxyMeta
17 from accessible import BoundingBox
18 from cache import AccessibleCache
19 from state import StateSet
20 from role import ROLE_UNKNOWN
21 from component import LAYER_WIDGET
27 #------------------------------------------------------------------------------
29 class ApplicationCache(object):
31 def __init__(self, connection, bus_name):
32 self._connection = connection
33 self._bus_name = bus_name
34 self._accessible_cache = AccessibleCache(connection, bus_name)
36 def __getitem__(self, key):
37 return self._accessible_cache
39 def __contains__(self, key):
40 if key == self._bus_name:
45 def get_application_at_index(self, index):
48 def get_application_count(self):
51 #------------------------------------------------------------------------------
53 class DesktopComponent(object):
55 The Component interface is implemented by objects which occupy
56 on-screen space, e.g. objects which have onscreen visual representations.
57 The methods in Component allow clients to identify where the
58 objects lie in the onscreen coordinate system, their relative
59 size, stacking order, and position. It also provides a mechanism
60 whereby keyboard focus may be transferred to specific user interface
61 elements programmatically. This is a 2D API, coordinates of 3D
62 objects are projected into the 2-dimensional screen view for
63 purposes of this interface.
66 def contains(self, *args, **kwargs):
68 @return True if the specified point lies within the Component's
69 bounding box, False otherwise.
73 def deregisterFocusHandler(self, *args, **kwargs):
75 Request that an EventListener registered via registerFocusHandler
76 no longer be notified when this object receives keyboard focus.
80 def getAccessibleAtPoint(self, *args, **kwargs):
82 @return the Accessible child whose bounding box contains the
87 def getAlpha(self, *args, **kwargs):
89 Obtain the alpha value of the component. An alpha value of 1.0
90 or greater indicates that the object is fully opaque, and an
91 alpha value of 0.0 indicates that the object is fully transparent.
92 Negative alpha values have no defined meaning at this time.
96 def getExtents(self, coord_type):
98 Obtain the Component's bounding box, in pixels, relative to the
99 specified coordinate system.
101 @return a BoundingBox which entirely contains the object's onscreen
102 visual representation.
104 #TODO This needs to return the window size
105 return BoundingBox(*(0,0,1024,768))
107 def getLayer(self, *args, **kwargs):
109 @return the ComponentLayer in which this object resides.
113 def getMDIZOrder(self):
115 Obtain the relative stacking order (i.e. 'Z' order) of an object.
116 Larger values indicate that an object is on "top" of the stack,
117 therefore objects with smaller MDIZOrder may be obscured by objects
118 with a larger MDIZOrder, but not vice-versa.
119 @return an integer indicating the object's place in the stacking
124 def getPosition(self, coord_type):
126 Obtain the position of the current component in the coordinate
127 system specified by coord_type.
130 an out parameter which will be back-filled with the returned
133 an out parameter which will be back-filled with the returned
138 def getSize(self, *args, **kwargs):
140 Obtain the size, in the coordinate system specified by coord_type,
141 of the rectangular area which fully contains the object's visual
142 representation, without accounting for viewport clipping.
144 the object's horizontal extents in the specified coordinate system.
146 the object's vertical extents in the specified coordinate system.
148 #TODO Need to return window size
151 def grabFocus(self, *args, **kwargs):
153 Request that the object obtain keyboard focus.
154 @return True if keyboard focus was successfully transferred to
159 def registerFocusHandler(self, *args, **kwargs):
161 Register an EventListener for notification when this object receives
166 #------------------------------------------------------------------------------
168 class Desktop(object):
170 The base interface which is implemented by all accessible objects.
171 All objects support interfaces for querying their contained
172 'children' and position in the accessible-object hierarchy,
173 whether or not they actually have children.
176 __metaclass__ = BaseProxyMeta
178 def __init__(self, cache):
180 Creates a desktop object. There should be one single desktop
181 object for the Registry object.
183 @param cache - The application cache.
184 @kwarf application - The application D-Bus name
186 If the application name is provided the Desktop is being used for
187 test and will only report the application provided as its single child.
192 def __nonzero__(self):
196 return self.getChildCount()
198 def __getitem__(self, index):
199 return self.getChildAtIndex(index)
201 def getApplication(self):
203 Get the containing Application for this object.
204 @return the Application instance to which this object belongs.
208 def getAttributes(self):
210 Get a list of properties applied to this object as a whole, as
211 an AttributeSet consisting of name-value pairs. As such these
212 attributes may be considered weakly-typed properties or annotations,
213 as distinct from the strongly-typed interface instance data declared
214 using the IDL "attribute" keyword.
215 Not all objects have explicit "name-value pair" AttributeSet
217 Attribute names and values may have any UTF-8 string value, however
218 where possible, in order to facilitate consistent use and exposure
219 of "attribute" properties by applications and AT clients, attribute
220 names and values should chosen from a publicly-specified namespace
222 Where possible, the names and values in the name-value pairs
223 should be chosen from well-established attribute namespaces using
224 standard semantics. For example, attributes of Accessible objects
225 corresponding to XHTML content elements should correspond to
226 attribute names and values specified in the w3c XHTML specification,
227 at http://www.w3.org/TR/xhtml2, where such values are not already
228 exposed via a more strongly-typed aspect of the AT-SPI API. Metadata
229 names and values should be chosen from the 'Dublin Core' Metadata
230 namespace using Dublin Core semantics: http://dublincore.org/dcregistry/
231 Similarly, relevant structural metadata should be exposed using
232 attribute names and values chosen from the CSS2 and WICD specification:
233 http://www.w3.org/TR/1998/REC-CSS2-19980512 WICD (http://www.w3.org/TR/2005/WD-WICD-20051121/).
235 @return : An AttributeSet encapsulating any "attribute values"
236 currently defined for the object. An attribute set is a list of strings
237 with each string comprising an name-value pair format 'name:value'.
241 def getChildAtIndex(self, index):
243 Get the accessible child of this object at index.
245 an in parameter indicating which child is requested (zero-indexed).
246 @return : the 'nth' Accessible child of this object.
248 return self._cache.get_application_at_index(index, self)
250 def getIndexInParent(self):
252 Get the index of this object in its parent's child list.
253 @return : a long integer indicating this object's index in the
258 def getLocalizedRoleName(self):
260 Get a string indicating the type of UI role played by this object,
261 translated to the current locale.
262 @return : a UTF-8 string indicating the type of UI role played
265 #TODO Need to localize this somehow. Hmmmmm
268 def getRelationSet(self):
270 Get a set defining this object's relationship to other accessible
272 @return : a RelationSet defining this object's relationships.
278 Get the Role indicating the type of UI role played by this object.
279 @return : a Role indicating the type of UI role played by this
284 def getRoleName(self):
286 Get a string indicating the type of UI role played by this object.
287 @return : a UTF-8 string indicating the type of UI role played
294 Get the current state of the object as a StateSet.
295 @return : a StateSet encapsulating the currently true states
300 def isEqual(self, accessible):
302 Determine whether an Accessible refers to the same object as
303 another. This method should be used rather than brute-force comparison
304 of object references (i.e. "by-value" comparison), as two object
305 references may have different apparent values yet refer to the
308 an Accessible object reference to compare to
309 @return : a boolean indicating whether the two object references
310 point to the same object.
312 return self == accessible
314 def get_childCount(self):
315 return self._cache.get_application_count()
318 childCount: the number of children contained by this object.
320 childCount = property(fget=get_childCount, doc=_childCountDoc)
322 getChildCount = get_childCount
324 def get_description(self):
328 a string describing the object in more detail than name.
330 description = property(fget=get_description, doc=_descriptionDoc)
336 a (short) string representing the object's name.
338 name = property(fget=get_name, doc=_nameDoc)
340 def get_parent(self):
344 An Accessible object which is this object's containing object.
346 parent = property(fget=get_parent, doc=_parentDoc)
349 def interfaces(self):
350 return [interfaces.ATSPI_ACCESSIBLE, interfaces.ATSPI_COMPONENT]
352 def queryInterface(self, interface):
354 Gets a different accessible interface for this object
355 or raises a NotImplemented error if the given interface
358 if interface == interfaces.ATSPI_ACCESSIBLE:
360 elif interface == interfaces.ATSPI_COMPONENT:
361 return DesktopComponent()
363 raise NotImplementedError(
364 "%s not supported by accessible object at path %s"
365 % (interface, self.path))
367 #END----------------------------------------------------------------------------