1
2
3
4
5
6
7 from ctypes import *
8 from ctypes.wintypes import *
9 import api
10 import winKernel
11 import controlTypes
12 import speech
13 import UIAHandler
14 from . import IAccessible
15 if UIAHandler.isUIAAvailable: from ..UIA import UIA
16 from .. import NVDAObject
17 from logHandler import log
18 import watchdog
19
20 TV_FIRST=0x1100
21 TVIS_STATEIMAGEMASK=0xf000
22
23
24 TVM_GETITEMSTATE=TV_FIRST+39
25 TVM_GETITEM=TV_FIRST+62
26 TVM_MAPACCIDTOHTREEITEM=TV_FIRST+42
27 TVM_MAPHTREEITEMTOACCID=TV_FIRST+43
28 TVM_GETNEXTITEM=TV_FIRST+10
29
30
31 TVIF_CHILDREN=0x40
32
33
34 TVGN_ROOT=0
35 TVGN_NEXT=1
36 TVGN_PREVIOUS=2
37 TVGN_PARENT=3
38 TVGN_CHILD=4
41 _fields_=[
42 ('mask',c_uint),
43 ('hItem',c_void_p),
44 ('state',c_uint),
45 ('stateMask',c_uint),
46 ('pszText',LPWSTR),
47 ('cchTextMax',c_int),
48 ('iImage',c_int),
49 ('iSelectedImage',c_int),
50 ('cChildren',c_int),
51 ('lParam',LPARAM),
52 ]
53
62
64
67
69 if not hasattr(self,'_treeview_hItem'):
70 self._treeview_hItem=watchdog.cancellableSendMessage(self.windowHandle,TVM_MAPACCIDTOHTREEITEM,self.IAccessibleChildID,0)
71 if not self._treeview_hItem:
72
73 self._treeview_hItem=self.IAccessibleChildID
74 return self._treeview_hItem
75
77 return int(self.IAccessibleObject.accValue(self.IAccessibleChildID))
78
91
94
96 if self.IAccessibleChildID==0:
97 return super(TreeViewItem,self)._get_parent()
98 hItem=self.treeview_hItem
99 if not hItem:
100 return super(TreeViewItem,self)._get_parent()
101 parentItem=watchdog.cancellableSendMessage(self.windowHandle,TVM_GETNEXTITEM,TVGN_PARENT,hItem)
102 if parentItem<=0:
103 return super(TreeViewItem,self)._get_parent()
104 newID=watchdog.cancellableSendMessage(self.windowHandle,TVM_MAPHTREEITEMTOACCID,parentItem,0)
105 if not newID:
106
107 newID=parentItem
108 return IAccessible(windowHandle=self.windowHandle,IAccessibleObject=self.IAccessibleObject,IAccessibleChildID=newID)
109
111 if self.IAccessibleChildID==0:
112 return super(TreeViewItem,self)._get_firstChild()
113 hItem=self.treeview_hItem
114 if not hItem:
115 return super(TreeViewItem,self)._get_firstChild()
116 childItem=watchdog.cancellableSendMessage(self.windowHandle,TVM_GETNEXTITEM,TVGN_CHILD,hItem)
117 if childItem<=0:
118 return super(TreeViewItem,self)._get_firstChild()
119 newID=watchdog.cancellableSendMessage(self.windowHandle,TVM_MAPHTREEITEMTOACCID,childItem,0)
120 if not newID:
121
122 newID=childItem
123 return IAccessible(windowHandle=self.windowHandle,IAccessibleObject=self.IAccessibleObject,IAccessibleChildID=newID)
124
139
154
156 children=[]
157 child=self.firstChild
158 while child:
159 children.append(child)
160 child=child.next
161 return children
162
175
197
203
205 """Handle broken CommCtrl v5 SysTreeView32 items in 64 bit applications.
206 In these controls, IAccessible fails to retrieve any info, so we must retrieve it using UIA.
207 We do this by obtaining a UIA NVDAObject and redirecting properties to it.
208 We can't simply use UIA objects alone for these controls because UIA events are also broken.
209 """
210
211 - def __init__(self, _uiaObj=None, **kwargs):
212
213 if not _uiaObj:
214 raise ValueError("Cannot instantiate directly without supplying _uiaObj")
215 self._uiaObj = _uiaObj
216 super(BrokenCommctrl5Item, self).__init__(**kwargs)
217
229
232
234 return self._uiaObj.name if self._uiaObj else None
235
237 return self._uiaObj.description if self._uiaObj else None
238
240 return self._uiaObj.value if self._uiaObj else None
241
243 return self._uiaObj.states if self._uiaObj else set()
244
246 return self._uiaObj.positionInfo if self._uiaObj else {}
247
249 return self._uiaObj.location if self._uiaObj else None
250
256
258 if self._uiaObj:
259 uiaParent = self._uiaObj.parent
260
261 if not uiaParent.UIAElement.cachedNativeWindowHandle:
262 return self._makeRelatedObj(uiaParent)
263 return super(BrokenCommctrl5Item, self).parent
264
267
270
272 return self._makeRelatedObj(self._uiaObj.firstChild) if self._uiaObj else None
273
275 return self._makeRelatedObj(self._uiaObj.lastChild) if self._uiaObj else None
276
280
281 @classmethod
283 """Get an instance for the first item in a given tree view.
284 """
285 if not UIAHandler.handler:
286 return None
287
288 try:
289 kwargs = {"windowHandle": treeObj.windowHandle}
290 UIA.kwargsFromSuper(kwargs)
291 uiaObj = UIA(**kwargs)
292 except:
293 log.debugWarning("Error retrieving UIA object for tree view", exc_info=True)
294 return None
295
296 uiaObj = uiaObj.firstChild
297 if not uiaObj:
298 return None
299
300
301 return cls(IAccessibleObject=treeObj.IAccessibleObject, IAccessibleChildID=1, windowHandle=treeObj.windowHandle, _uiaObj=uiaObj)
302