1 #Copyright (C) 2008 Codethink Ltd
2 #copyright: Copyright (c) 2005, 2007 IBM Corporation
4 #This library is free software; you can redistribute it and/or
5 #modify it under the terms of the GNU Lesser General Public
6 #License version 2 as published by the Free Software Foundation.
8 #This program is distributed in the hope that it will be useful,
9 #but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 #GNU General Public License for more details.
12 #You should have received a copy of the GNU Lesser General Public License
13 #along with this program; if not, write to the Free Software
14 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 #Portions of this code originally licensed and copyright (c) 2005, 2007
17 #IBM Corporation under the BSD license, available at
18 #U{http://www.opensource.org/licenses/bsd-license.php}
20 #authors: Peter Parente, Mark Doffman
23 from base import Enum as _Enum
24 from factory import create_accessible
26 #------------------------------------------------------------------------------
28 class RelationType(_Enum):
31 1:'RELATION_LABEL_FOR',
32 2:'RELATION_LABELLED_BY',
33 3:'RELATION_CONTROLLER_FOR',
34 4:'RELATION_CONTROLLED_BY',
35 5:'RELATION_MEMBER_OF',
36 6:'RELATION_TOOLTIP_FOR',
37 7:'RELATION_NODE_CHILD_OF',
38 8:'RELATION_EXTENDED',
39 9:'RELATION_FLOWS_TO',
40 10:'RELATION_FLOWS_FROM',
41 11:'RELATION_SUBWINDOW_OF',
43 13:'RELATION_EMBEDDED_BY',
44 14:'RELATION_POPUP_FOR',
45 15:'RELATION_PARENT_WINDOW_OF',
46 16:'RELATION_DESCRIPTION_FOR',
47 17:'RELATION_DESCRIBED_BY',
48 18:'RELATION_LAST_DEFINED',
51 #------------------------------------------------------------------------------
53 RELATION_CONTROLLED_BY = RelationType(4)
55 RELATION_CONTROLLER_FOR = RelationType(3)
57 RELATION_DESCRIBED_BY = RelationType(17)
59 RELATION_DESCRIPTION_FOR = RelationType(16)
61 RELATION_EMBEDDED_BY = RelationType(13)
63 RELATION_EMBEDS = RelationType(12)
65 RELATION_EXTENDED = RelationType(8)
67 RELATION_FLOWS_FROM = RelationType(10)
69 RELATION_FLOWS_TO = RelationType(9)
71 RELATION_LABELLED_BY = RelationType(2)
73 RELATION_LABEL_FOR = RelationType(1)
75 RELATION_LAST_DEFINED = RelationType(18)
77 RELATION_MEMBER_OF = RelationType(5)
79 RELATION_NODE_CHILD_OF = RelationType(7)
81 RELATION_NULL = RelationType(0)
83 RELATION_PARENT_WINDOW_OF = RelationType(15)
85 RELATION_POPUP_FOR = RelationType(14)
87 RELATION_SUBWINDOW_OF = RelationType(11)
89 RELATION_TOOLTIP_FOR = RelationType(6)
91 #------------------------------------------------------------------------------
93 # Build a dictionary mapping relation values to names based on the prefix of the enum constants.
95 RELATION_VALUE_TO_NAME = dict(((value, name[9:].lower().replace('_', ' '))
98 if name.startswith('RELATION_')))
100 #------------------------------------------------------------------------------
102 def _marshal_relation_set(cache, app_name, relation_set):
104 The D-Bus protocol has a relation set passed as an array of
105 relation types and object arrays.
107 This function marshals the D-Bus message into a list of relation
110 return [Relation(cache, app_name, *relation) for relation in relation_set]
112 #------------------------------------------------------------------------------
114 class Relation(object):
116 An interface via which objects' non-hierarchical relationships
117 to one another are indicated. An instance of Relations represents
118 a "one-to-many" correspondance.
121 def __init__(self, cache, app_name, type, objects):
123 self._objects = objects
126 self._app_name = app_name
128 def getNTargets(self):
130 @return the number of objects to which this relationship applies.
132 return len(self._objects)
134 def getRelationType(self):
136 @return the RelationType of this Relation.
140 def getRelationTypeName(self):
142 @return an unlocalized string representing the relation type.
144 return RELATION_VALUE_TO_NAME[self._type]
146 def getTarget(self, index):
148 @return an Object which is the 'nth'target of this Relation,
149 e.g. the Object at index i in the list of Objects having the
150 specified relationship to this Accessible.
152 return create_accessible(self._cache,
154 self._objects[index],
155 interfaces.ATSPI_ACCESSIBLE,
156 connection=self._cache._connection)
158 #END----------------------------------------------------------------------------