| Server IP : 182.53.201.61 / Your IP : 216.73.217.175 Web Server : Apache/2.2.15 (Fedora) System : Linux km10.dyndns.org 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 User : apache ( 48) PHP Version : 5.3.3 Disable Function : NONE MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/lib/python2.6/site-packages/orca/ |
Upload File : |
# Orca
#
# Copyright 2004-2009 Sun Microsystems Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
# Boston MA 02110-1301 USA.
"""Manages the formatting settings for Orca."""
__id__ = "$Id:$"
__version__ = "$Revision:$"
__date__ = "$Date:$"
__copyright__ = "Copyright (c) 2004-2009 Sun Microsystems Inc."
__license__ = "LGPL"
import copy
import pyatspi
import settings
# pylint: disable-msg=C0301
TUTORIAL = '(tutorial and (pause + tutorial) or [])'
MNEMONIC = '(mnemonic and (pause + mnemonic + lineBreak) or [])'
BRAILLE_TEXT = '[Text(obj, asString(label), asString(eol))]\
+ (required and [Region(" " + asString(required))])\
+ (readOnly and [Region(" " + asString(readOnly))])'
formatting = {
####################################################################
# #
# Strings Orca includes on its own (versus getting them from the #
# application. #
# #
####################################################################
'strings' : {
'speech' : {
'required' : settings.speechRequiredStateString,
'readonly' : settings.speechReadOnlyString,
'insensitive' : settings.speechInsensitiveString,
'checkbox' : settings.speechCheckboxIndicators,
'radiobutton' : settings.speechRadioButtonIndicators,
'togglebutton' : settings.speechToggleButtonIndicators,
'expansion' : settings.speechExpansionIndicators,
'nodelevel' : settings.speechNodeLevelString,
'nestinglevel' : settings.speechNestingLevelString,
'multiselect' : settings.speechMultiSelectString,
'iconindex' : settings.speechIconIndexString,
'groupindex' : settings.speechGroupIndexString,
},
'braille' : {
'eol' : settings.brailleEOLIndicator,
'required' : settings.brailleRequiredStateString,
'readonly' : settings.brailleReadOnlyString,
'insensitive' : settings.brailleInsensitiveString,
'checkbox' : settings.brailleCheckBoxIndicators,
'radiobutton' : settings.brailleRadioButtonIndicators,
'togglebutton' : settings.brailleToggleButtonIndicators,
'expansion' : settings.brailleExpansionIndicators,
'nodelevel' : settings.brailleNodeLevelString,
'nestinglevel' : settings.brailleNestingLevelString,
},
},
####################################################################
# #
# Formatting for speech. #
# #
####################################################################
'speech': {
'prefix': {
'focused': '[]',
'unfocused': 'newAncestors + newRowHeader + newColumnHeader + newRadioButtonGroup',
'basicWhereAmI': 'toolbar',
'detailedWhereAmI' : '[]'
},
'suffix': {
'focused': '[]',
'unfocused': 'newNodeLevel + unselectedCell + ' + TUTORIAL,
'basicWhereAmI': TUTORIAL + ' + description',
'detailedWhereAmI' : '[]'
},
'default': {
'focused': '[]',
'unfocused': 'labelAndName + allTextSelection + roleName + availability + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'labelAndName + roleName',
'detailedWhereAmI' : '[]'
},
pyatspi.ROLE_ALERT: {
'unfocused': 'labelAndName + unrelatedLabels'
},
pyatspi.ROLE_ANIMATION: {
'unfocused': 'labelAndName'
},
pyatspi.ROLE_CHECK_BOX: {
'focused': 'checkedState',
'unfocused': 'labelAndName + roleName + checkedState + required + availability + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'labelAndName + roleName + checkedState + ' + MNEMONIC + ' + accelerator + required'
},
pyatspi.ROLE_CHECK_MENU_ITEM: {
'focused': 'checkedState',
'unfocused': 'labelAndName + roleName + checkedState + required + availability + ' + MNEMONIC + ' + accelerator + positionInList',
'basicWhereAmI': 'ancestors + labelAndName + roleName + checkedState + accelerator + positionInList + ' + MNEMONIC
},
pyatspi.ROLE_COMBO_BOX: {
'focused': 'name + positionInList',
'unfocused': 'label + name + roleName + positionInList + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'label + roleName + name + positionInList + ' + MNEMONIC + ' + accelerator'
},
pyatspi.ROLE_DIALOG: {
'unfocused': 'labelAndName + unrelatedLabels'
},
pyatspi.ROLE_DOCUMENT_FRAME: {
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
},
pyatspi.ROLE_EMBEDDED: {
'focused': 'embedded',
'unfocused': 'embedded'
},
pyatspi.ROLE_ENTRY: {
'focused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection',
'unfocused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
},
pyatspi.ROLE_FRAME: {
'focused': '[]',
'unfocused': 'labelAndName + allTextSelection + roleName + unfocusedDialogCount + availability'
},
pyatspi.ROLE_HEADING: {
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
},
pyatspi.ROLE_ICON: {
'focused': 'labelAndName + imageDescription + roleName + positionInList',
'unfocused': 'labelAndName + imageDescription + roleName + positionInList',
'basicWhereAmI': 'parentRoleName + labelAndName + selectedItemCount',
'detailedWhereAmI': 'parentRoleName + labelAndName + selectedItemCount + selectedItems'
},
pyatspi.ROLE_LABEL: {
'basicWhereAmI': 'labelAndName + allTextSelection + roleName'
},
pyatspi.ROLE_LAYERED_PANE: {
'focused': 'labelAndName + allTextSelection + roleName + availability + noShowingChildren',
'unfocused': 'labelAndName + allTextSelection + roleName + availability + noShowingChildren',
'basicWhereAmI': 'labelAndName + roleName + selectedItemCount',
'detailedWhereAmI': 'labelAndName + roleName + selectedItemCount + selectedItems'
},
pyatspi.ROLE_LINK: {
'unfocused': 'labelAndName + roleName + availability',
'basicWhereAmI': 'linkInfo + siteDescription + fileSize'
},
pyatspi.ROLE_LIST_ITEM: {
'focused': 'expandableState + availability',
'unfocused': 'labelAndName + allTextSelection + expandableState + availability + positionInList',
'basicWhereAmI': 'label + roleName + name + positionInList + expandableState + (nodeLevel or nestingLevel)'
},
pyatspi.ROLE_MENU: {
'focused': '[]',
'unfocused': 'labelAndName + allTextSelection + roleName + availability + ' + MNEMONIC + ' + accelerator + positionInList',
'basicWhereAmI': '(ancestors or parentRoleName) + labelAndName + roleName + positionInList + ' + MNEMONIC
},
pyatspi.ROLE_MENU_ITEM: {
'focused': '[]',
'unfocused': 'labelAndName + menuItemCheckedState + availability + ' + MNEMONIC + ' + accelerator + positionInList',
'basicWhereAmI': 'ancestors + labelAndName + accelerator + positionInList + ' + MNEMONIC
},
pyatspi.ROLE_PAGE_TAB: {
'focused': 'labelAndName + roleName + positionInList + ' + MNEMONIC + ' + accelerator',
'unfocused': 'labelAndName + roleName + positionInList + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'parentRoleName + labelAndName + roleName + positionInList + ' + MNEMONIC + ' + accelerator'
},
pyatspi.ROLE_PARAGRAPH: {
'focused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection',
'unfocused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
},
pyatspi.ROLE_PASSWORD_TEXT: {
'focused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection',
'unfocused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
},
pyatspi.ROLE_PROGRESS_BAR: {
'focused': 'percentage',
'unfocused': 'labelAndName + percentage'
},
pyatspi.ROLE_PUSH_BUTTON: {
'unfocused': 'labelAndName + roleName + availability + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'labelAndName + roleName + ' + MNEMONIC + ' + accelerator'
},
pyatspi.ROLE_RADIO_BUTTON: {
'focused': 'radioState',
'unfocused': 'labelAndName + radioState + roleName + availability + ' + MNEMONIC + ' + accelerator + positionInList',
'basicWhereAmI': 'radioButtonGroup + labelAndName + roleName + radioState + positionInGroup + ' + MNEMONIC + ' + accelerator'
},
pyatspi.ROLE_RADIO_MENU_ITEM: {
# OpenOffice check menu items currently have a role of "menu item"
# rather then "check menu item", so we need to test if one of the
# states is CHECKED. If it is, then add that in to the list of
# speech utterances. Note that we can't tell if this is a "check
# menu item" that is currently unchecked and speak that state.
# See Orca bug #433398 for more details.
#
'focused': 'labelAndName + radioState + roleName + availability + positionInList',
'unfocused': 'labelAndName + radioState + roleName + availability + ' + MNEMONIC + ' + accelerator + positionInList',
'basicWhereAmI': 'ancestors + labelAndName + roleName + radioState + accelerator + positionInList + ' + MNEMONIC
},
pyatspi.ROLE_SECTION: {
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
},
pyatspi.ROLE_SLIDER: {
# Ignore the text on the slider. See bug 340559
# (http://bugzilla.gnome.org/show_bug.cgi?id=340559): the
# implementors of the slider support decided to put in a
# Unicode left-to-right character as part of the text,
# even though that is not painted on the screen.
#
# In Java, however, there are sliders without a label. In
# this case, we'll add to presentation the slider name if
# it exists and we haven't found anything yet.
#
'focused': 'value',
'unfocused': 'label + roleName + value + required + availability + ' + MNEMONIC,
'basicWhereAmI': 'label + roleName + value + percentage + ' + MNEMONIC + ' + accelerator + required'
},
pyatspi.ROLE_SPIN_BUTTON: {
'focused': 'name',
'unfocused': 'labelAndName + allTextSelection + roleName + availability + ' + MNEMONIC + ' + required',
'basicWhereAmI': 'label + roleName + name + allTextSelection + ' + MNEMONIC + ' + accelerator + required'
},
pyatspi.ROLE_SPLIT_PANE: {
'focused': 'value',
'unfocused': 'labelAndName + roleName + value + availability + ' + MNEMONIC,
'basicWhereAmI' : 'labelAndName + roleName + value'
},
pyatspi.ROLE_TABLE: {
'focused': 'labelAndName + allTextSelection + roleName + availability + noChildren',
'unfocused': 'labelAndName + allTextSelection + roleName + availability + noChildren',
'basicWhereAmI': 'labelAndName + allTextSelection + roleName + availability + noChildren'
},
pyatspi.ROLE_TABLE_CELL: {
'focused': '(tableCell2ChildLabel + tableCell2ChildToggle)\
or (cellCheckedState + (expandableState and (expandableState + numberOfChildren)))',
'unfocused': 'tableCellRow',
'basicWhereAmI': 'parentRoleName + columnHeader + rowHeader + roleName + cellCheckedState + (realActiveDescendantDisplayedText or imageDescription + image) + columnAndRow + expandableState + nodeLevel',
'detailedWhereAmI': 'parentRoleName + columnHeader + rowHeader + roleName + cellCheckedState + (realActiveDescendantDisplayedText or imageDescription + image) + columnAndRow + tableCellRow + expandableState + nodeLevel'
},
'REAL_ROLE_TABLE_CELL': {
# the real cell information
# note that pyatspi.ROLE_TABLE_CELL is used to work out if we need to
# read a whole row. It calls REAL_ROLE_TABLE_CELL internally.
# maybe it can be done in a cleaner way?
#
'focused': '(tableCell2ChildLabel + tableCell2ChildToggle)\
or (cellCheckedState + (expandableState and (expandableState + numberOfChildren)))',
'unfocused': '(tableCell2ChildLabel + tableCell2ChildToggle)\
or (columnHeaderIfToggleAndNoText\
+ cellCheckedState\
+ (realActiveDescendantDisplayedText or imageDescription + image)\
+ (expandableState and (expandableState + numberOfChildren))\
+ required)'
},
pyatspi.ROLE_TEAROFF_MENU_ITEM: {
'focused': '[]',
'unfocused': 'labelAndName + allTextSelection + roleName + availability '
},
pyatspi.ROLE_TERMINAL: {
'focused': 'terminal',
'unfocused': 'terminal',
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
},
pyatspi.ROLE_TEXT: {
'focused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection',
'unfocused': 'labelOrName + readOnly + textRole + currentLineText + allTextSelection + ' + MNEMONIC,
'basicWhereAmI': 'label + readOnly + textRole + textContent + anyTextSelection + ' + MNEMONIC,
'detailedWhereAmI': 'label + readOnly + textRole + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
},
pyatspi.ROLE_TOGGLE_BUTTON: {
'focused': 'toggleState',
'unfocused': 'labelAndName + roleName + toggleState + availability + ' + MNEMONIC + ' + accelerator',
'basicWhereAmI': 'labelAndName + roleName + toggleState'
},
pyatspi.ROLE_TOOL_TIP: {
'unfocused': 'labelAndName',
'basicWhereAmI': 'labelAndName'
},
},
####################################################################
# #
# Formatting for braille. #
# #
####################################################################
'braille': {
'prefix': {
# 'focused': 'ancestors\
# + (rowHeader and [Region(" " + asString(rowHeader))])\
# + (columnHeader and [Region(" " + asString(columnHeader))])\
# + (radioButtonGroup and [Region(" " + asString(radioButtonGroup))])\
# + [Region(" ")]',
# 'unfocused': 'ancestors\
# + (rowHeader and [Region(" " + asString(rowHeader))])\
# + (columnHeader and [Region(" " + asString(columnHeader))])\
# + (radioButtonGroup and [Region(" " + asString(radioButtonGroup))])\
# + [Region(" ")]',
'focused': '(includeContext\
and (ancestors\
+ (rowHeader and [Region(" " + asString(rowHeader))])\
+ (columnHeader and [Region(" " + asString(columnHeader))])\
+ (radioButtonGroup and [Region(" " + asString(radioButtonGroup))])\
+ [Region(" ")])\
or [])',
'unfocused': '(includeContext\
and (ancestors\
+ (rowHeader and [Region(" " + asString(rowHeader))])\
+ (columnHeader and [Region(" " + asString(columnHeader))])\
+ (radioButtonGroup and [Region(" " + asString(radioButtonGroup))])\
+ [Region(" ")])\
or [])',
},
'suffix': {
'focused': '(nodeLevel and [Region(" " + asString(nodeLevel))])',
'unfocused': '(nodeLevel and [Region(" " + asString(nodeLevel))])',
},
'default': {
'focused': '[Component(obj,\
asString(label + displayedText + value + roleName + required))]',
'unfocused': '[Component(obj,\
asString(label + displayedText + value + roleName + required))]',
},
#pyatspi.ROLE_ALERT: 'default'
pyatspi.ROLE_ANIMATION: {
'unfocused': '[Component(obj,\
asString(label + displayedText + roleName + (description and space(": ") + description)))]',
},
#pyatspi.ROLE_ARROW: 'default'
pyatspi.ROLE_CHECK_BOX: {
'unfocused': '[Component(obj,\
asString(label + displayedText + roleName),\
indicator=asString(checkedState))]'
},
pyatspi.ROLE_CHECK_MENU_ITEM: {
'unfocused': '[Component(obj,\
asString(label + displayedText + roleName + availability) + asString(accelerator),\
indicator=asString(checkedState))]'
},
#pyatspi.ROLE_COLUMN_HEADER: 'default'
pyatspi.ROLE_COMBO_BOX: {
# [[[TODO: WDW - maybe pass the label into the region constructor?
# We could then use the cursorOffset field to indicate where the
# combobox starts.]]]
#
'unfocused': '((comboBoxTextObj and [Text(comboBoxTextObj[0], asString(label), asString(eol))])\
or [Component(obj, asString(label + displayedText), label and (len(asString(label)) + 1) or 0)])\
+ [Region(" " + asString(roleName))]'
},
#pyatspi.ROLE_DESKTOP_ICON: 'default'
#pyatspi.ROLE_DIAL: 'default'
#pyatspi.ROLE_DIALOG: 'default'
#pyatspi.ROLE_DIRECTORY_PANE: 'default'
pyatspi.ROLE_EMBEDDED: {
'unfocused': '[Component(obj,\
asString(label + displayedText) or asString(applicationName))]'
},
pyatspi.ROLE_ENTRY: {
'unfocused': BRAILLE_TEXT
},
pyatspi.ROLE_FRAME: {
'unfocused': '[Component(obj,\
asString(((label + displayedText) or name) + value + roleName + alertAndDialogCount))]'
},
#pyatspi.ROLE_HTML_CONTAINER: 'default'
pyatspi.ROLE_ICON: {
'unfocused': '[Component(obj,\
asString(label + displayedText + imageDescription + roleName))]'
},
#pyatspi.ROLE_IMAGE: 'default'
pyatspi.ROLE_LABEL: {
'unfocused': '[Text(obj,\
asString(label),\
asString(eol))]'
},
#pyatspi.ROLE_LIST: 'default'
pyatspi.ROLE_LIST_ITEM: {
'focused': '[Component(obj,\
asString(label + displayedText + expandableState + roleName + availability) + asString(accelerator))]\
+ (nestingLevel and [Region(" " + asString(nestingLevel))])',
'unfocused': '[Component(obj,\
asString(label + displayedText + expandableState))]\
+ (nestingLevel and [Region(" " + asString(nestingLevel))])',
},
pyatspi.ROLE_MENU: {
'focused': '[Component(obj,\
asString(label + displayedText + roleName + availability) + asString(accelerator))]',
'unfocused': '[Component(obj,\
asString(label + displayedText + roleName))]',
},
#pyatspi.ROLE_MENU_BAR: 'default'
pyatspi.ROLE_MENU_ITEM: {
'unfocused': '[Component(obj,\
asString(label + displayedText + availability) + asString(accelerator),\
indicator=asString(menuItemCheckedState))]'
},
#pyatspi.ROLE_OPTION_PANE: 'default'
pyatspi.ROLE_PAGE_TAB: {
'focused': '[Component(obj,\
asString(label + displayedText + roleName + availability) + asString(accelerator))]',
'unfocused': '[Component(obj,\
asString(label + displayedText + roleName))]'
},
#pyatspi.ROLE_PAGE_TAB_LIST: 'default'
pyatspi.ROLE_PANEL: {
'unfocused': '[Component(obj,\
asString((label or displayedText) + roleName))]'
},
pyatspi.ROLE_PARAGRAPH: {
'unfocused': BRAILLE_TEXT
},
pyatspi.ROLE_PASSWORD_TEXT: {
'unfocused': BRAILLE_TEXT
},
#pyatspi.ROLE_PROGRESS_BAR: 'default'
pyatspi.ROLE_PUSH_BUTTON: {
'unfocused': '[Component(obj,\
asString(((label + displayedText) or description) + roleName))]'
},
pyatspi.ROLE_RADIO_BUTTON: {
'unfocused': '[Component(obj,\
asString(((label + displayedText) or description) + roleName),\
indicator=asString(radioState))]'
},
pyatspi.ROLE_RADIO_MENU_ITEM: {
'focused': '[Component(obj,\
asString(((label + displayedText) or description) + roleName + availability)\
+ asString(accelerator),\
indicator=asString(radioState))]',
'unfocused': '[Component(obj,\
asString((label + displayedText) or description)\
+ asString(accelerator),\
indicator=asString(radioState))]'
},
#pyatspi.ROLE_ROW_HEADER: 'default'
#pyatspi.ROLE_SCROLL_BAR: 'default'
pyatspi.ROLE_SCROLL_PANE: {
'unfocused': 'asPageTabOrScrollPane'
},
#'REAL_ROLE_SCROLL_PANE': 'default'
pyatspi.ROLE_SLIDER: {
'unfocused': '[Component(obj,\
asString(label + value + roleName + required))]'
},
pyatspi.ROLE_SPIN_BUTTON: {
'unfocused': '[Text(obj, asString(label), asString(eol))]\
+ (required and [Region(" " + asString(required))] or [])\
+ (readOnly and [Region(" " + asString(readOnly))] or [])'
},
#pyatspi.ROLE_SPLIT_PANE: 'default'
#pyatspi.ROLE_TABLE: 'default'
pyatspi.ROLE_TABLE_CELL: {
'unfocused': 'tableCellRow',
},
'REAL_ROLE_TABLE_CELL' : {
'unfocused': '(tableCell2ChildToggle + tableCell2ChildLabel)\
or (cellCheckedState\
+ (columnHeaderIfToggleAndNoText and [Region(" "), Component(obj, asString(columnHeaderIfToggleAndNoText))])\
+ ((realActiveDescendantDisplayedText and [Component(obj, asString(realActiveDescendantDisplayedText))])\
or (imageDescription and [Region(" "), Component(obj, asString(imageDescription))]))\
+ (realActiveDescendantRoleName and [Component(obj, (realActiveDescendantDisplayedText and " " or "") + asString(realActiveDescendantRoleName))])\
+ (expandableState and [Region(" " + asString(expandableState))])\
+ (required and [Region(" " + asString(required))]))\
or ([Component(obj,"")])'
},
#pyatspi.ROLE_TABLE_COLUMN_HEADER: 'default'
#pyatspi.ROLE_TABLE_ROW_HEADER: 'default'
pyatspi.ROLE_TEAROFF_MENU_ITEM: {
'unfocused': '[Component(obj,\
asString(roleName))]'
},
pyatspi.ROLE_TERMINAL: {
'unfocused': '[Text(obj)]'
},
pyatspi.ROLE_TEXT: {
'unfocused': BRAILLE_TEXT
},
pyatspi.ROLE_TOGGLE_BUTTON: {
'unfocused': '[Component(obj,\
asString(((label + displayedText) or description) + roleName),\
indicator=asString(toggleState))]'
},
#pyatspi.ROLE_TOOL_BAR: 'default'
#pyatspi.ROLE_TREE: 'default'
#pyatspi.ROLE_TREE_TABLE: 'default'
#pyatspi.ROLE_WINDOW: 'default'
}
}
if settings.useExperimentalSpeechProsody:
formatting['speech'][pyatspi.ROLE_CHECK_MENU_ITEM]['unfocused'] = \
'labelAndName + roleName + checkedState + required + availability + ' + MNEMONIC + ' + accelerator + pause + positionInList'
formatting['speech'][pyatspi.ROLE_CHECK_MENU_ITEM]['basicWhereAmI'] = \
'ancestors + pause + labelAndName + roleName + checkedState + pause + accelerator + pause + positionInList + ' + MNEMONIC
formatting['speech'][pyatspi.ROLE_COMBO_BOX]['focused'] = 'name + pause + positionInList + pause'
formatting['speech'][pyatspi.ROLE_COMBO_BOX]['unfocused'] = 'label + name + roleName + pause + positionInList + ' + MNEMONIC + ' + accelerator'
formatting['speech'][pyatspi.ROLE_COMBO_BOX]['basicWhereAmI'] = \
'label + roleName + pause + name + positionInList + ' + MNEMONIC + ' + accelerator'
formatting['speech'][pyatspi.ROLE_HEADING]['basicWhereAmI'] = \
'label + readOnly + textRole + pause + textContent + anyTextSelection + ' + MNEMONIC
formatting['speech'][pyatspi.ROLE_HEADING]['detailedWhereAmI'] = \
'label + readOnly + textRole + pause +textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
formatting['speech'][pyatspi.ROLE_ICON]['focused'] = 'labelAndName + imageDescription + roleName + pause + positionInList'
formatting['speech'][pyatspi.ROLE_ICON]['unfocused'] = 'labelAndName + imageDescription + roleName + pause + positionInList'
formatting['speech'][pyatspi.ROLE_ICON]['basicWhereAmI'] = \
'parentRoleName + pause + labelAndName + pause + selectedItemCount + pause'
formatting['speech'][pyatspi.ROLE_ICON]['detailedWhereAmI'] = \
'parentRoleName + pause + labelAndName + pause + selectedItemCount + pause + selectedItems + pause'
formatting['speech'][pyatspi.ROLE_LAYERED_PANE]['basicWhereAmI'] = \
'labelAndName + pause+ roleName + pause + selectedItemCount + pause'
formatting['speech'][pyatspi.ROLE_LAYERED_PANE]['detailedWhereAmI'] = \
'labelAndName + pause + roleName + pause + selectedItemCount + pause+ selectedItems + pause'
formatting['speech'][pyatspi.ROLE_LINK]['basicWhereAmI'] = \
'linkInfo + pause + siteDescription + pause + fileSize'
formatting['speech'][pyatspi.ROLE_LIST_ITEM]['unfocused'] = \
'labelAndName + allTextSelection + pause + expandableState + pause + availability + positionInList'
formatting['speech'][pyatspi.ROLE_LIST_ITEM]['basicWhereAmI'] = \
'label + roleName + pause + name + pause + positionInList + pause + expandableState + (nodeLevel or nestingLevel) + pause'
formatting['speech'][pyatspi.ROLE_MENU]['unfocused'] = 'labelAndName + allTextSelection + roleName + availability + ' + MNEMONIC + ' + accelerator + pause + positionInList'
formatting['speech'][pyatspi.ROLE_MENU]['basicWhereAmI'] = \
'(ancestors or parentRoleName) + pause + labelAndName + roleName + pause + positionInList + ' + MNEMONIC
formatting['speech'][pyatspi.ROLE_MENU_ITEM]['unfocused'] = 'labelAndName + menuItemCheckedState + availability + ' + MNEMONIC + ' + accelerator + pause + positionInList'
formatting['speech'][pyatspi.ROLE_MENU_ITEM]['basicWhereAmI'] = \
'ancestors + pause + labelAndName + pause + accelerator + pause + positionInList + ' + MNEMONIC
formatting['speech'][pyatspi.ROLE_PAGE_TAB]['focused'] = 'labelAndName + roleName + pause + positionInList + ' + MNEMONIC + ' + accelerator'
formatting['speech'][pyatspi.ROLE_PAGE_TAB]['unfocused'] = 'labelAndName + roleName + pause + positionInList + ' + MNEMONIC + ' + accelerator'
formatting['speech'][pyatspi.ROLE_PAGE_TAB]['basicWhereAmI'] = \
'parentRoleName + pause + labelAndName + roleName + pause + positionInList + ' + MNEMONIC + ' + accelerator'
formatting['speech'][pyatspi.ROLE_RADIO_BUTTON]['unfocused'] = \
'labelAndName + pause + radioState + roleName + availability + lineBreak + ' + MNEMONIC + ' + accelerator + pause + positionInList + pause'
formatting['speech'][pyatspi.ROLE_RADIO_BUTTON]['basicWhereAmI'] = \
'radioButtonGroup + pause + labelAndName + roleName + pause + radioState + pause + positionInGroup + ' + MNEMONIC + ' + accelerator'
formatting['speech'][pyatspi.ROLE_TABLE]['focused'] = \
'labelAndName + pause + allTextSelection + roleName + availability + noChildren'
formatting['speech'][pyatspi.ROLE_TABLE]['unfocused'] = \
'labelAndName + pause + allTextSelection + roleName + availability + noChildren'
formatting['speech'][pyatspi.ROLE_TABLE]['basicWhereAmI'] = \
'labelAndName + pause + allTextSelection + roleName + availability + noChildren'
formatting['speech'][pyatspi.ROLE_TABLE_CELL]['focused'] = \
'((tableCell2ChildLabel + tableCell2ChildToggle) or cellCheckedState) + pause + (expandableState and (expandableState + pause + numberOfChildren + pause))'
formatting['speech'][pyatspi.ROLE_TABLE_CELL]['unfocused'] = \
'tableCellRow + pause'
formatting['speech'][pyatspi.ROLE_TABLE_CELL]['basicWhereAmI'] = \
'parentRoleName + pause + columnHeader + pause + rowHeader + pause + roleName + pause + cellCheckedState + pause + (realActiveDescendantDisplayedText or imageDescription + image) + pause + columnAndRow + pause + expandableState + pause + nodeLevel + pause'
formatting['speech'][pyatspi.ROLE_TABLE_CELL]['detailedWhereAmI'] = \
'parentRoleName + pause + columnHeader + pause + rowHeader + pause + roleName + pause + cellCheckedState + pause + (realActiveDescendantDisplayedText or imageDescription + image) + pause + columnAndRow + pause + tableCellRow + pause + expandableState + pause + nodeLevel + pause'
formatting['speech'][pyatspi.ROLE_TERMINAL]['basicWhereAmI'] = \
'label + readOnly + pause + textRole + pause + textContent + anyTextSelection + ' + MNEMONIC
formatting['speech'][pyatspi.ROLE_TERMINAL]['detailedWhereAmI'] = \
'label + readOnly + pause + textRole + pause + textContentWithAttributes + anyTextSelection + ' + MNEMONIC + ' + ' + TUTORIAL
formatting['speech'][pyatspi.ROLE_TEXT]['focused'] = \
'labelOrName + readOnly + textRole + pause + currentLineText + allTextSelection'
formatting['speech'][pyatspi.ROLE_TEXT]['unfocused'] = \
'labelOrName + readOnly + textRole + pause + currentLineText + allTextSelection + ' + MNEMONIC
formatting['speech'][pyatspi.ROLE_TEXT]['basicWhereAmI'] = \
'label + readOnly + textRole + pause + textContent + anyTextSelection + pause + ' + MNEMONIC
formatting['speech'][pyatspi.ROLE_TEXT]['detailedWhereAmI'] = \
'label + readOnly + textRole + pause + textContentWithAttributes + anyTextSelection + pause + ' + MNEMONIC + ' + ' + TUTORIAL
class Formatting(dict):
def __init__(self, script):
dict.__init__(self)
self._script = script
self.update(copy.deepcopy(formatting))
def update(self, newDict):
for key, val in newDict.iteritems():
if self.has_key(key):
if isinstance(self[key], dict) and isinstance(val, dict):
self[key].update(val)
elif isinstance(self[key], basestring) \
and isinstance(val, basestring):
self[key] = val
else:
# exception or such like, we are trying to murge
# incompatible trees.
# throw an exception?
print("an error has occured, cant murge dicts.")
else:
self[key] = val
def getPrefix(self, **args):
"""Get a formatting string to add on to the end of
formatting strings obtained by getFormat.
Arguments expected in args:
- mode: output mode, such as 'speech', 'braille'.
- formatType: the type of formatting, such as
'focused', 'basicWhereAmI', etc.
"""
prefix = self[args['mode']]['prefix'][args['formatType']]
return prefix
def getSuffix(self, **args):
"""Get a formatting string to add on to the end of
formatting strings obtained by getFormat.
Arguments expected in args:
- mode: output mode, such as 'speech', 'braille'.
- role: the role, such as pyatspi.ROLE_TEXT
- formatType: the type of formatting, such as
'focused', 'basicWhereAmI', etc.
"""
suffix = self[args['mode']]['suffix'][args['formatType']]
return suffix
def getString(self, **args):
"""Gets a human consumable string for a specific value
(e.g., an indicator for a checkbox state).
Arguments expected in args:
- mode: output mode, such as 'speech', 'braille'.
- stringType: the type of the string to get (see the dictionary above).
"""
return self['strings'][args['mode']][args['stringType']]
def getFormat(self, **args):
"""Get a formatting string for the given mode and formatType for a
role (e.g., a where am I string for a text object).
Arguments expected in args:
- mode: output mode, such as 'speech', 'braille'.
- role: the role, such as pyatspi.ROLE_TEXT
- formatType: the type of formatting, such as
'focused', 'basicWhereAmI', etc.
"""
try:
# First try to find the exact match.
#
format = self[args['mode']][args['role']][args['formatType']]
except:
try:
# Failing that, fallback to the 'unfocused' formatType
# for the mode and role, if it exists.
#
format = self[args['mode']][args['role']]['unfocused']
except:
try:
# Failing that, fallback to the default for the
# formatType
#
format = self[args['mode']]['default'][args['formatType']]
except:
# Failing that, just used the default 'unfocused' format
#
format = self[args['mode']]['default']['unfocused']
return format