[orca/570658] Work on tables for OOo braille generator



commit 1c5844fa97fe6ac73af4d0c372e4efa3ebc1ca73
Author: Willie Walker <william walker sun com>
Date:   Tue Jul 7 11:41:21 2009 -0400

    Work on tables for OOo braille generator

 src/orca/scripts/apps/soffice/braille_generator.py |  178 ++++++++++++++++++++
 1 files changed, 178 insertions(+), 0 deletions(-)
---
diff --git a/src/orca/scripts/apps/soffice/braille_generator.py b/src/orca/scripts/apps/soffice/braille_generator.py
index 2da7e8b..ffbb5e5 100644
--- a/src/orca/scripts/apps/soffice/braille_generator.py
+++ b/src/orca/scripts/apps/soffice/braille_generator.py
@@ -53,6 +53,184 @@ class BrailleGenerator(braille_generator.BrailleGenerator):
                 self, obj, **args))
         return result
 
+    def _generateRowHeader(self, obj, **args):
+        """Returns an array of strings that represent the row header for an
+        object that is in a table, if it exists.  Otherwise, an empty
+        array is returned. Overridden here so that we can get the
+        dynamic row header(s).
+        """
+        result = []
+        try:
+            table = obj.parent.queryTable()
+        except:
+            pass
+        else:
+            index = self._script.getCellIndex(obj)
+            rowIndex = table.getRowAtIndex(index)
+            if rowIndex >= 0 \
+               and table in self._script.dynamicRowHeaders:
+                column = self._script.dynamicRowHeaders[table]
+                header = self._script.getDynamicColumnHeaderCell(obj, column)
+                try:
+                    headerText = header.queryText()
+                except:
+                    headerText = None
+                if header.childCount > 0:
+                    for child in header:
+                        text = self._script.getText(child, 0, -1)
+                        if text:
+                            result.append(text)
+                elif headerText:
+                    text = self._script.getText(header, 0, -1)
+                    if text:
+                        result.append(text)
+        return result
+
+    def _generateColumnHeader(self, obj, **args):
+        """Returns an array of strings that represent the column header for an
+        object that is in a table, if it exists.  Otherwise, an empty
+        array is returned. Overridden here so that we can get the
+        dynamic column header(s).
+        """
+        result = []
+        try:
+            table = obj.parent.queryTable()
+        except:
+            pass
+        else:
+            index = self._script.getCellIndex(obj)
+            columnIndex = table.getColumnAtIndex(index)
+            if columnIndex >= 0 \
+               and table in self._script.dynamicColumnHeaders:
+                row = self._script.dynamicColumnHeaders[table]
+                header = self._script.getDynamicRowHeaderCell(obj, row)
+                try:
+                    headerText = header.queryText()
+                except:
+                    headerText = None
+                if header.childCount > 0:
+                    for child in header:
+                        text = self._script.getText(child, 0, -1)
+                        if text:
+                            result.append(text)
+                elif headerText:
+                    text = self._script.getText(header, 0, -1)
+                    if text:
+                        result.append(text)
+        return result
+
+    def _generateSpreadSheetCell(self, obj, **args):
+        result = []
+        if self._script.inputLineForCell == None:
+            self._script.inputLineForCell = \
+                self._script.locateInputLine(obj)
+        # If the spread sheet table cell has something in it, then we
+        # want to append the name of the cell (which will be its
+        # location).  Note that if the cell was empty, then
+        # self._script.getDisplayedText will have already done this
+        # for us.
+        #
+        try:
+            if obj.queryText():
+                objectText = self._script.getText(obj, 0, -1)
+                if objectText and len(objectText) != 0:
+                    result.append(braille.Component(
+                        obj, objectText + " " + obj.name))
+                else:
+                    result.append(braille.Component(obj, obj.name))
+        except:
+            pass
+        return result
+
+    def _generateRealTableCell(self, obj, **args):
+        """Get the speech for a table cell. If this isn't inside a
+        spread sheet, just return the utterances returned by the default
+        table cell speech handler.
+
+        Arguments:
+        - obj: the table cell
+
+        Returns a list of utterances to be spoken for the object.
+        """
+        result = []
+        if self._script.isSpreadSheetCell(obj):
+            result.extend(self._generateSpreadSheetCell(obj, **args))
+        else:
+            # Check to see how many children this table cell has. If it's
+            # just one (or none), then pass it on to the superclass to be
+            # processed.
+            #
+            # If it's more than one, then get the speech for each child,
+            # and call this method again.
+            #
+            if obj.childCount <= 1:
+                result.extend(braille_generator.BrailleGenerator.\
+                              _generateRealTableCell(self, obj, **args))
+            else:
+                for child in obj:
+                    result.extend(self._generateRealTableCell(child, **args))
+        return result
+
+    def _generateTableCellRow(self, obj, **args):
+        """Get the speech for a table cell row or a single table cell
+        if settings.readTableCellRow is False. If this isn't inside a
+        spread sheet, just return the utterances returned by the default
+        table cell speech handler.
+
+        Arguments:
+        - obj: the table cell
+
+        Returns a list of utterances to be spoken for the object.
+        """
+        result = []
+        if self._script.isSpreadSheetCell(obj):
+            # Adding in a check here to make sure that the parent is a
+            # valid table. It's possible that the parent could be a
+            # table cell too (see bug #351501).
+            #
+            parent = obj.parent
+            parentTable = parent.queryTable()
+            if settings.readTableCellRow and parentTable:
+                index = self._script.getCellIndex(obj)
+                row = parentTable.getRowAtIndex(index)
+                column = parentTable.getColumnAtIndex(index)
+                # This is an indication of whether we should present all the
+                # table cells (the user has moved focus up or down a row),
+                # or just the current one (focus has moved left or right in
+                # the same row).
+                #
+                presentAll = True
+                if "lastRow" in self._script.pointOfReference and \
+                    "lastColumn" in self._script.pointOfReference:
+                    pointOfReference = self._script.pointOfReference
+                    presentAll = \
+                        (self._mode == 'braille') \
+                        or ((pointOfReference["lastRow"] != row) \
+                            or ((row == 0 or row == parentTable.nRows-1) \
+                                and pointOfReference["lastColumn"] == column))
+                if presentAll:
+                    [startIndex, endIndex] = \
+                        self._script.getSpreadSheetRowRange(obj)
+                    for i in range(startIndex, endIndex+1):
+                        cell = parentTable.getAccessibleAt(row, i)
+                        showing = cell.getState().contains( \
+                                      pyatspi.STATE_SHOWING)
+                        if showing:
+                            cellResult = self._generateRealTableCell(cell, **args)
+                            if cellResult and result and self._mode == 'braille':
+                                result.append(braille.Region(
+                                        settings.brailleTableCellDelimiter))
+                            result.extend(cellResult)
+                else:
+                    result.extend(self._generateRealTableCell(obj, **args))
+            else:
+                result.extend(self._generateRealTableCell(obj, **args))
+        else:
+            result.extend(
+                braille_generator.BrailleGenerator._generateTableCellRow(
+                    self, obj, **args))
+        return result
+
     def _getBrailleRegionsForTableCellRow(self, obj):
         """Get the braille for a table cell row or a single table cell
         if settings.readTableCellRow is False.



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