OSDN Git Service

Powerpoint appModule: fix bug that stopped NVDA from being able to provide access...
authorMichael Curran <mick@kulgan.net>
Tue, 25 Dec 2012 11:31:33 +0000 (21:31 +1000)
committerMichael Curran <mick@kulgan.net>
Tue, 25 Dec 2012 11:31:33 +0000 (21:31 +1000)
source/appModules/powerpnt.py

index 7632d05..3664612 100644 (file)
@@ -17,6 +17,7 @@ from NVDAObjects.window import Window
 from NVDAObjects.behaviors import EditableTextWithoutAutoSelectDetection\r
 from cursorManager import ReviewCursorManager\r
 import controlTypes\r
+from logHandler import log\r
 \r
 #Bullet types\r
 ppBulletNumbered=2\r
@@ -74,6 +75,26 @@ def getBulletText(ppBulletFormat):
        elif t:\r
                return unichr(ppBulletFormat.character)\r
 \r
+def getPpObjectModel(windowHandle,forceForeground=False):\r
+       """\r
+       Fetches the Powerpoint object model from a given PaneClassDC window.\r
+       If forceForeground is True, then NVDA will quickly grab foreground and give it back to Powerpoint, which forces Powerpoint to register its object model on start-up much quicker.\r
+       """\r
+       if forceForeground:\r
+               import wx\r
+               import gui\r
+               d=wx.Dialog(None,title=_("Waiting for Powerpoint..."))\r
+               gui.mainFrame.prePopup()\r
+               d.Show()\r
+               d.Destroy()\r
+               gui.mainFrame.postPopup()\r
+       try:\r
+               pDispatch=oleacc.AccessibleObjectFromWindow(windowHandle,winUser.OBJID_NATIVEOM,interface=comtypes.automation.IDispatch)\r
+       except (comtypes.COMError, WindowsError):\r
+               log.debugWarning("Could not get MS Powerpoint object model",exc_info=True)\r
+               return None\r
+       return comtypes.client.dynamic.Dispatch(pDispatch)\r
+\r
 class PaneClassDC(Window):\r
        """Handles fetching of the Powerpoint object model."""\r
 \r
@@ -91,13 +112,12 @@ class PaneClassDC(Window):
 \r
        def _get_ppObjectModel(self):\r
                """Fetches and caches the Powerpoint DocumentWindow object for the current presentation."""\r
-               try:\r
-                       pDispatch=oleacc.AccessibleObjectFromWindow(self.windowHandle,winUser.OBJID_NATIVEOM,interface=comtypes.automation.IDispatch)\r
-               except (comtypes.COMError, WindowsError):\r
-                       log.debugWarning("Could not get MS Word object model",exc_info=True)\r
-                       return None\r
-               self.ppObjectModel=comtypes.client.dynamic.Dispatch(pDispatch)\r
-               return self.ppObjectModel\r
+               m=getPpObjectModel(self.windowHandle)\r
+               if not m:\r
+                       m=getPpObjectModel(self.windowHandle,forceForeground=True)\r
+               if m:\r
+                       self.ppObjectModel=m\r
+                       return self.ppObjectModel\r
 \r
 class DocumentWindow(PaneClassDC):\r
        """Represents the document window for a presentation. Bounces focus to the currently selected slide, shape or text frame."""\r