orca r4041 - in trunk: . src/orca src/orca/scripts/toolkits/Gecko



Author: joanied
Date: Thu Jul 17 21:29:53 2008
New Revision: 4041
URL: http://svn.gnome.org/viewvc/orca?rev=4041&view=rev

Log:
* src/orca/scripts/toolkits/Gecko/script.py:
  src/orca/scripts/toolkits/Gecko/speech_generator.py:
  src/orca/speechgenerator.py:
  src/orca/where_am_I.py:
  src/orca/braillegenerator.py:
  src/orca/settings.py:
  Fix for bug #519515 - Support ARIA "required" state.  


Modified:
   trunk/ChangeLog
   trunk/src/orca/braillegenerator.py
   trunk/src/orca/scripts/toolkits/Gecko/script.py
   trunk/src/orca/scripts/toolkits/Gecko/speech_generator.py
   trunk/src/orca/settings.py
   trunk/src/orca/speechgenerator.py
   trunk/src/orca/where_am_I.py

Modified: trunk/src/orca/braillegenerator.py
==============================================================================
--- trunk/src/orca/braillegenerator.py	(original)
+++ trunk/src/orca/braillegenerator.py	Thu Jul 17 21:29:53 2008
@@ -194,6 +194,25 @@
         else:
             return None
 
+    def _getTextForRequiredObject(self, obj):
+        """Returns a string to be displayed that describes the required
+        state of the given object.
+
+        Arguments:
+        - obj: the Accessible object
+
+        Returns a string to be displayed.
+        """
+
+        if not settings.presentRequiredState:
+            return None
+
+        state = obj.getState()
+        if state.contains(pyatspi.STATE_REQUIRED):
+            return settings.brailleRequiredStateString
+        else:
+            return None
+
     def _getTextForRole(self, obj, role=None):
         if (settings.brailleVerbosityLevel \
             == settings.VERBOSITY_LEVEL_VERBOSE)\
@@ -245,6 +264,8 @@
         text = self._script.appendString(text, 
                                          self._script.getTextForValue(obj))
         text = self._script.appendString(text, self._getTextForRole(obj, role))
+        text = self._script.appendString(text,
+                                         self._getTextForRequiredObject(obj))
 
         regions = []
         componentRegion = braille.Component(obj, text)
@@ -342,6 +363,8 @@
 
         text = self._script.appendString(
             text, self._getTextForRole(obj, pyatspi.ROLE_CHECK_BOX))
+        text = self._script.appendString(text,
+                                         self._getTextForRequiredObject(obj))
 
         regions = []
         componentRegion = braille.Component(
@@ -836,6 +859,9 @@
                                   self._script.getDisplayedLabel(obj),
                                   settings.brailleEOLIndicator)
         regions.append(textRegion)
+        text = self._getTextForRequiredObject(obj)
+        if text:
+            regions.append(braille.Region(" " + text))
 
         # We do not want the role at the end of text areas.
 
@@ -1142,6 +1168,8 @@
         text = self._script.appendString(text,
                                          self._script.getTextForValue(obj))
         text = self._script.appendString(text, self._getTextForRole(obj))
+        text = self._script.appendString(text,
+                                         self._getTextForRequiredObject(obj))
 
         regions = []
         componentRegion = braille.Component(obj, text)

Modified: trunk/src/orca/scripts/toolkits/Gecko/script.py
==============================================================================
--- trunk/src/orca/scripts/toolkits/Gecko/script.py	(original)
+++ trunk/src/orca/scripts/toolkits/Gecko/script.py	Thu Jul 17 21:29:53 2008
@@ -1222,7 +1222,9 @@
                 # See bug #441610 and
                 # https://bugzilla.mozilla.org/show_bug.cgi?id=348901
                 #
-                string = self.appendString(string, self.expandEOCs(label))
+                expandedLabel = self.expandEOCs(label)
+                if expandedLabel:
+                    string = self.appendString(string, expandedLabel.strip())
 
         return string
 

Modified: trunk/src/orca/scripts/toolkits/Gecko/speech_generator.py
==============================================================================
--- trunk/src/orca/scripts/toolkits/Gecko/speech_generator.py	(original)
+++ trunk/src/orca/scripts/toolkits/Gecko/speech_generator.py	Thu Jul 17 21:29:53 2008
@@ -701,6 +701,13 @@
             if not role in dontSpeakRoles and len(newUtterances):
                 utterances.append(rolenames.getSpeechForRoleName(parent))
 
+            # If this object is an ARIA widget with STATE_REQUIRED, add
+            # that. (Note that for the most part, the ARIA widget itself
+            # has this state, but in the case of a group of radio buttons,
+            # it is the group which has the state).
+            #
+            utterances.extend(self._getSpeechForRequiredObject(parent))
+
             utterances.extend(newUtterances)
 
             parent = parent.parent
@@ -721,7 +728,7 @@
         """
         
         # Let default handle non-ARIA widgets (XUL?)
-        if not self._script.isAriaWidget(obj):
+        if self._script.isAriaWidget(obj):
             return speechgenerator.SpeechGenerator.\
                        _getSpeechForSlider(self, obj, already_focused)
 
@@ -769,7 +776,7 @@
             utterances.append(valueString)
             utterances.extend(self._getSpeechForObjectAvailability(obj))
 
-        self._debugGenerator("_getSpeechForSlider",
+        self._debugGenerator("Gecko._getSpeechForSlider",
                              obj,
                              already_focused,
                              utterances)

Modified: trunk/src/orca/settings.py
==============================================================================
--- trunk/src/orca/settings.py	(original)
+++ trunk/src/orca/settings.py	Thu Jul 17 21:29:53 2008
@@ -175,7 +175,10 @@
     "speakCellHeaders",
     "skipBlankCells",
     "largeObjectTextLength",
-    "wrappedStructuralNavigation"
+    "wrappedStructuralNavigation",
+    "presentRequiredState",
+    "brailleRequiredStateString",
+    "speechRequiredStateString"
 ]
 
 # The name of the module that hold the user interface for the main window
@@ -1110,3 +1113,24 @@
 # among headings (H) and the Help menu (Alt+H).
 #
 defaultModifierMask = NON_LOCKING_MODIFIER_MASK
+
+# Whether or not we should present objects with STATE_REQUIRED to
+# the user. Currently, this is only seen with ARIA widgets.
+#
+presentRequiredState = False
+
+# Translators: Certain objects (such as form controls on web pages)
+# can have STATE_REQUIRED set on them to inform the user that this
+# field must be filled out. This string is the default string which
+# will be spoken and displayed in braille to indicate this state is
+# present.
+#
+brailleRequiredStateString = _("required")
+
+# Translators: Certain objects (such as form controls on web pages)
+# can have STATE_REQUIRED set on them to inform the user that this
+# field must be filled out. This string is the default string which
+# will be spoken and displayed in braille to indicate this state is
+# present.
+#
+speechRequiredStateString = _("required")

Modified: trunk/src/orca/speechgenerator.py
==============================================================================
--- trunk/src/orca/speechgenerator.py	(original)
+++ trunk/src/orca/speechgenerator.py	Thu Jul 17 21:29:53 2008
@@ -241,6 +241,25 @@
 
         return utterance
 
+    def _getSpeechForRequiredObject(self, obj):
+        """Returns the list of utterances that describe the required state
+        of the given object.
+
+        Arguments:
+        - obj: the Accessible object
+
+        Returns a list of utterances to be spoken.
+        """
+
+        if not settings.presentRequiredState:
+            return []
+
+        state = obj.getState()
+        if state.contains(pyatspi.STATE_REQUIRED):
+            return [settings.speechRequiredStateString]
+        else:
+            return []
+
     def _debugGenerator(self, generatorName, obj, already_focused, utterances):
         """Prints debug.LEVEL_FINER information regarding the speech generator.
 
@@ -425,6 +444,7 @@
                 utterances.extend(self._getSpeechForObjectRole(obj))
             utterances.append(checkedState)
             utterances.extend(self._getSpeechForObjectAvailability(obj))
+            utterances.extend(self._getSpeechForRequiredObject(obj))
         else:
             utterances.append(checkedState)
 
@@ -1221,6 +1241,7 @@
             utterances.extend(self._getSpeechForObjectRole(obj))
             utterances.append(valueString)
             utterances.extend(self._getSpeechForObjectAvailability(obj))
+            utterances.extend(self._getSpeechForRequiredObject(obj))
 
         self._debugGenerator("_getSpeechForSlider",
                              obj,
@@ -1244,6 +1265,7 @@
             utterances = [self._script.getDisplayedText(obj)]
         else:
             utterances = self._getDefaultSpeech(obj, already_focused)
+            utterances.extend(self._getSpeechForRequiredObject(obj))
 
         self._debugGenerator("_getSpeechForSpinButton",
                              obj,
@@ -1439,6 +1461,8 @@
                 #
                 utterances.append(_("collapsed"))
 
+        utterances.extend(self._getSpeechForRequiredObject(obj))
+
         self._debugGenerator("_getSpeechForTableCell",
                              obj,
                              already_focused,

Modified: trunk/src/orca/where_am_I.py
==============================================================================
--- trunk/src/orca/where_am_I.py	(original)
+++ trunk/src/orca/where_am_I.py	Thu Jul 17 21:29:53 2008
@@ -178,6 +178,10 @@
         accelerator = self._getObjAccelerator(obj)
         utterances.append(accelerator)
 
+        text = self._getRequiredState(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "check box utterances=%s" \
                       % utterances)
         speech.speakUtterances(utterances)
@@ -198,6 +202,10 @@
         text = self._getGroupLabel(obj)
         utterances.append(text)
 
+        text = self._getRequiredState(obj)
+        if text:
+            utterances.append(text)
+
         text = self.getObjLabelAndName(obj) + " " + \
                rolenames.getSpeechForRoleName(obj)
         utterances.append(text)
@@ -274,20 +282,25 @@
         """
 
         utterances = []
-        text = self._getObjLabel(obj)
-        utterances.append(text)
+        label = self._getObjLabel(obj)
+        utterances.append(label)
 
         text = rolenames.getSpeechForRoleName(obj)
         utterances.append(text)
 
         name = self._getObjName(obj)
-        utterances.append(name)
+        if name != label:
+            utterances.append(name)
         
         utterances.extend(self._getSpeechForAllTextSelection(obj))
 
         text = self._getObjAccelerator(obj)
         utterances.append(text)
 
+        text = self._getRequiredState(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "spin button utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -342,6 +355,10 @@
         text = self._getObjAccelerator(obj)
         utterances.append(text)
 
+        text = self._getRequiredState(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "slider utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -566,6 +583,10 @@
             text = self._getTableCell(obj)
             utterances.append(text)
 
+        text = self._getRequiredState(obj)
+        if text:
+            utterances.append(text)
+
         debug.println(self._debugLevel, "first table cell utterances=%s" % \
                       utterances)
         speech.speakUtterances(utterances)
@@ -982,7 +1003,7 @@
             name = obj.description
 
         if name and name != "None":
-            text = name
+            text = name.strip()
         debug.println(self._debugLevel, "%s name=<%s>" % (obj.getRole(), text))
 
         return text
@@ -995,7 +1016,7 @@
         label = self._script.getDisplayedLabel(obj)
 
         if label and label != "None":
-            text = label
+            text = label.strip()
 
         debug.println(self._debugLevel, "%s label=<%s>" % (obj.getRole(), text))
 
@@ -1818,3 +1839,23 @@
         debug.println(self._debugLevel, "toolbar utterances=%s" \
                       % utterances)
         speech.speakUtterances(utterances)
+
+    def _getRequiredState(self, obj):
+        """Returns a string describing the required state of the given
+        object.
+
+        Arguments:
+        - obj: the Accessible object
+        """
+
+        if not settings.presentRequiredState:
+            return ""
+
+        if obj.getRole() == pyatspi.ROLE_RADIO_BUTTON:
+            obj = obj.parent
+
+        state = obj.getState()
+        if state.contains(pyatspi.STATE_REQUIRED):
+            return settings.speechRequiredStateString
+        else:
+            return ""



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]