OSDN Git Service

Build in support for encoded accDescription (level, blah of blah etc) into IAccessibl...
authorMichael Curran <mick@kulgan.net>
Thu, 23 Sep 2010 00:11:07 +0000 (10:11 +1000)
committerMichael Curran <mick@kulgan.net>
Thu, 23 Sep 2010 00:11:07 +0000 (10:11 +1000)
source/NVDAObjects/IAccessible/__init__.py
source/NVDAObjects/IAccessible/qt.py
source/appModules/itunes.py
source/speech.py

index bda2521..bfe9faa 100644 (file)
@@ -7,6 +7,7 @@
 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
@@ -758,7 +759,29 @@ the NVDAObject for IAccessible
                        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
@@ -1038,26 +1061,24 @@ the NVDAObject for IAccessible
        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
index 81b0d03..f01889a 100644 (file)
@@ -4,7 +4,6 @@
 #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
@@ -72,24 +71,10 @@ class Container(IAccessible):
                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
index 6ec4855..efb5649 100644 (file)
@@ -1,5 +1,4 @@
 import _default\r
-import re\r
 from comtypes import COMError\r
 import controlTypes\r
 import oleacc\r
@@ -23,24 +22,9 @@ class AppModule(_default.AppModule):
 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
index e386145..2547f12 100755 (executable)
@@ -682,8 +682,10 @@ def getSpeechTextForProperties(reason=REASON_QUERY,**propertyValues):
                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