Index: src/orca/scripts/apps/soffice/braille_generator.py
===================================================================
--- src/orca/scripts/apps/soffice/braille_generator.py	(revision 4282)
+++ src/orca/scripts/apps/soffice/braille_generator.py	(working copy)
@@ -51,6 +51,86 @@
         return braillegenerator.BrailleGenerator.\
             _getTextForRole(self, obj, role)
 
+    def _getBrailleRegionsForList(self, obj):
+        """Get the braille for a focused list.
+
+        Arguments:
+        - obj: the list
+
+        Returns a list where the first element is a list of Regions to display
+        and the second element is the Region which should get focus.
+        """
+
+        self._debugGenerator("soffice: _getBrailleRegionsForList", obj)
+
+        # On the off chance that we come across a list which isn't
+        # focusable, send it off to the parent class for handling.
+        #
+        if not obj.getState().contains(pyatspi.STATE_FOCUSABLE):
+            return braillegenerator.BrailleGenerator.\
+                       _getBrailleRegionsForList(self, obj)
+
+        text = ""
+        label = self._script.getDisplayedLabel(obj)
+        if not label:
+            label = obj.name
+        if label and len(label):
+            text = self._script.appendString(text, label)
+
+        # Now let's see if we can work out what the selected item
+        # is because that's really the item of interest.
+        #
+        try:
+            selection = obj.querySelection()
+        except NotImplementedError:
+            item = None
+        else:
+            item = selection.getSelectedChild(0)
+
+        # If we worked it out, we expect the list item's name to
+        # contain what we want to display. getDisplayedText() will
+        # fall back on the object's name if there is no text, so
+        # we might as well use it. If we haven't worked it out....
+        # Well, we should have. :-) Failing that we need to look at
+        # the specific case and deal with it. Worst case would be
+        # that we present the label/name and the role "list". In
+        # that case, we'd expect arrowing amongst the list items
+        # to cause new events for the item of interest to be emitted
+        # and we'd update braille with the selected item then.
+        #
+        if item:
+            text = self._script.appendString(\
+                text, self._script.getDisplayedText(item))
+
+        # What do we really care about in terms of the accessibles
+        # and their roles? I (JD) think we care about the label, and
+        # the selected/focused item, first and foremost. I also think
+        # we need a way to identify that this is a list. But I do not
+        # think that we want "label list selected_item". And if we go
+        # with "label selected_item list", are we suggesting that the
+        # selected item is not a list item but a list? That might be
+        # bad.... If we go with "label selected_item list item", we
+        # are telling the truth and the user will probably conclude
+        # that, if this is a list item, odds are fairly good that he/
+        # she happens to be in a list. ;-) So that's what I'm going
+        # to do for now. Of course, what if we couldn't figure out
+        # the selected item? In that case we should go with list as
+        # the role.
+        #
+        item = item or obj
+        text = self._script.appendString(text, self._getTextForRole(item))
+
+        # I don't believe that OOo has implemented STATE_REQUIRED, but
+        # if they have (or one day do), we'd be remiss not to check.
+        #
+        text = self._script.appendString(text,
+                                         self._getTextForRequiredObject(obj))
+        regions = []
+        componentRegion = braille.Component(obj, text)
+        regions.append(componentRegion)
+
+        return [regions, componentRegion]
+
     def _getBrailleRegionsForTableCellRow(self, obj):
         """Get the braille for a table cell row or a single table cell
         if settings.readTableCellRow is False.
