from comtypes import COMError, IServiceProvider, GUID\r
import ctypes\r
import os\r
+import re\r
from comInterfaces.tom import ITextDocument\r
import tones\r
import textInfos.offsets\r
states.discard(controlTypes.STATE_CHECKED)\r
return states\r
\r
+ re_positionInfoEncodedAccDescription=re.compile(r"L(?P<level>\d+), (?P<indexInGroup>\d+) of (?P<similarItemsInGroup>\d+)")\r
+\r
+ def _get_decodedAccDescription(self):\r
+ try:\r
+ description=self.IAccessibleObject.accDescription(self.IAccessibleChildID)\r
+ except COMError:\r
+ return None\r
+ if description.startswith('description:'):\r
+ return description[12:].strip()\r
+ m=self.re_positionInfoEncodedAccDescription.match(description)\r
+ if m:\r
+ return m\r
+ return description\r
+\r
+ hasEncodedAccDescription=False #:If true, accDescription contains info such as level, and number of items etc.\r
+\r
def _get_description(self):\r
+ if self.hasEncodedAccDescription:\r
+ d=self.decodedAccDescription\r
+ if isinstance(d,basestring):\r
+ return d\r
+ else:\r
+ return ""\r
try:\r
res=self.IAccessibleObject.accDescription(self.IAccessibleChildID)\r
except:\r
allowIAccessibleChildIDAndChildCountForPositionInfo=False #: if true position info should fall back to using the childID and the parent's accChildCount for position information if there is nothing better available.\r
\r
def _get_positionInfo(self):\r
- info={}\r
- level=similarItemsInGroup=indexInGroup=0\r
if isinstance(self.IAccessibleObject,IAccessibleHandler.IAccessible2):\r
try:\r
level,similarItemsInGroup,indexInGroup=self.IAccessibleObject.groupPosition\r
- gotVars=True\r
+ return dict(level=level,indexInGroup=indexInGroup,similarItemsInGroup=similarItemsInGroup)\r
except COMError:\r
pass\r
- if self.allowIAccessibleChildIDAndChildCountForPositionInfo and indexInGroup==0:\r
+ if self.hasEncodedAccDescription:\r
+ d=self.decodedAccDescription\r
+ if d and not isinstance(d,basestring):\r
+ groupdict=d.groupdict()\r
+ return dict(level=int(groupdict.get('level','0')),indexInGroup=int(groupdict.get('indexInGroup','0')),similarItemsInGroup=int(groupdict.get('similarItemsInGroup','0')))\r
+ if self.allowIAccessibleChildIDAndChildCountForPositionInfo and self.IAccessibleChildID>0:\r
indexInGroup=self.IAccessibleChildID\r
- if self.allowIAccessibleChildIDAndChildCountForPositionInfo and indexInGroup>0 and similarItemsInGroup<indexInGroup:\r
parent=self.parent\r
if parent:\r
similarItemsInGroup=parent.childCount\r
- if level>0:\r
- info['level']=level\r
- if indexInGroup<=similarItemsInGroup and indexInGroup>0:\r
- info['similarItemsInGroup']=similarItemsInGroup\r
- info['indexInGroup']=indexInGroup\r
- return info\r
+ return dict(indexInGroup=indexInGroup,similarItemsInGroup=similarItemsInGroup)\r
+ return {}\r
\r
def _get_indexInParent(self):\r
if isinstance(self.IAccessibleObject, IAccessibleHandler.IAccessible2):\r
#This file is covered by the GNU General Public License.\r
#See the file COPYING for more details.\r
\r
-import re\r
from comtypes import COMError\r
import controlTypes\r
from NVDAObjects.IAccessible import IAccessible\r
return super(Container, self).event_gainFocus()\r
\r
class TreeViewItem(IAccessible):\r
- RE_POSITION_INFO = re.compile(r"L(?P<level>\d+), (?P<indexInGroup>\d+) of (?P<similarItemsInGroup>\d+) with \d+")\r
\r
- # The description and value should not be user visible.\r
- description = None\r
value = None\r
\r
- def _get_positionInfo(self):\r
- # QT encodes the position info in the accDescription.\r
- try:\r
- desc = self.IAccessibleObject.accDescription(self.IAccessibleChildID)\r
- except COMError:\r
- return super(TreeViewItem, self).positionInfo\r
-\r
- m = self.RE_POSITION_INFO.match(desc)\r
- if m:\r
- return m.groupdict()\r
-\r
- return super(TreeViewItem, self).positionInfo\r
+ hasEncodedAccDescription=True\r
\r
class Menu(IAccessible):\r
# QT incorrectly fires a focus event on the parent menu immediately after (correctly) firing focus on the menu item.\r
import _default\r
-import re\r
from comtypes import COMError\r
import controlTypes\r
import oleacc\r
class ITunesItem(NVDAObjects.IAccessible.IAccessible):\r
"""Retreaves position information encoded in the accDescription"""\r
\r
- RE_POSITION_INFO = re.compile(r"L(?P<level>\d+), (?P<indexInGroup>\d+) of (?P<similarItemsInGroup>\d+)")\r
-\r
- # The description and value should not be user visible.\r
- description = None\r
+ hasEncodedAccDescription=True\r
value = None\r
\r
- def _get_positionInfo(self):\r
- # iTunes encodes the position info in the accDescription.\r
- try:\r
- desc = self.IAccessibleObject.accDescription(self.IAccessibleChildID)\r
- except COMError:\r
- return super(ITunesItem, self).positionInfo\r
-\r
- if desc:\r
- m = self.RE_POSITION_INFO.match(desc)\r
- if m:\r
- return m.groupdict()\r
-\r
def _get_next(self):\r
next=super(ITunesItem,self).next\r
try:\r
textList.append(propertyValues['description'])\r
if 'keyboardShortcut' in propertyValues:\r
textList.append(propertyValues['keyboardShortcut'])\r
- if 'positionInfo_indexInGroup' in propertyValues and 'positionInfo_similarItemsInGroup' in propertyValues:\r
- textList.append(_("%s of %s")%(propertyValues['positionInfo_indexInGroup'],propertyValues['positionInfo_similarItemsInGroup']))\r
+ indexInGroup=propertyValues.get('positionInfo_indexInGroup',0)\r
+ similarItemsInGroup=propertyValues.get('positionInfo_similarItemsInGroup',0)\r
+ if 0<indexInGroup<=similarItemsInGroup:\r
+ textList.append(_("%s of %s")%(indexInGroup,similarItemsInGroup))\r
if 'positionInfo_level' in propertyValues:\r
level=propertyValues.get('positionInfo_level',None)\r
role=propertyValues.get('role',None)\r