Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
michael@0 | 1 | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
michael@0 | 2 | /* vim: set ts=2 et sw=2 tw=80: */ |
michael@0 | 3 | /* This Source Code Form is subject to the terms of the Mozilla Public |
michael@0 | 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
michael@0 | 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
michael@0 | 6 | |
michael@0 | 7 | #include <atk/atk.h> |
michael@0 | 8 | #include "AccessibleWrap.h" |
michael@0 | 9 | |
michael@0 | 10 | /****************************************************************************** |
michael@0 | 11 | The following nsIAccessible states aren't translated, just ignored: |
michael@0 | 12 | STATE_READONLY: Supported indirectly via EXT_STATE_EDITABLE |
michael@0 | 13 | STATE_HOTTRACKED: No ATK equivalent. No known use case. |
michael@0 | 14 | The nsIAccessible state is not currently supported. |
michael@0 | 15 | STATE_FLOATING: No ATK equivalent. No known use case. |
michael@0 | 16 | The nsIAccessible state is not currently supported. |
michael@0 | 17 | STATE_MOVEABLE: No ATK equivalent. No known use case. |
michael@0 | 18 | The nsIAccessible state is not currently supported. |
michael@0 | 19 | STATE_SELFVOICING: No ATK equivalent -- the object has self-TTS. |
michael@0 | 20 | The nsIAccessible state is not currently supported. |
michael@0 | 21 | STATE_LINKED: The object is formatted as a hyperlink. Supported via ATK_ROLE_LINK. |
michael@0 | 22 | STATE_EXTSELECTABLE: Indicates that an object extends its selection. |
michael@0 | 23 | This is supported via STATE_MULTISELECTABLE. |
michael@0 | 24 | STATE_PROTECTED: The object is a password-protected edit control. |
michael@0 | 25 | Supported via ATK_ROLE_PASSWORD_TEXT |
michael@0 | 26 | STATE_HASPOPUP: Object displays a pop-up menu or window when invoked. |
michael@0 | 27 | No ATK equivalent. The nsIAccessible state is not currently supported. |
michael@0 | 28 | STATE_PINNED: The object is pinned, usually indicating it is fixed in place and has permanence. |
michael@0 | 29 | No ATK equivalent. The nsIAccessible state is not currently supported. |
michael@0 | 30 | |
michael@0 | 31 | The following ATK states are not supported: |
michael@0 | 32 | ATK_STATE_ARMED: No clear use case, used briefly when button is activated |
michael@0 | 33 | ATK_STATE_HAS_TOOLTIP: No clear use case, no IA2 equivalent |
michael@0 | 34 | ATK_STATE_ICONIFIED: Mozilla does not have elements which are collapsable into icons |
michael@0 | 35 | ATK_STATE_TRUNCATED: No clear use case. Indicates that an object's onscreen content is truncated, |
michael@0 | 36 | e.g. a text value in a spreadsheet cell. No IA2 state. |
michael@0 | 37 | ******************************************************************************/ |
michael@0 | 38 | |
michael@0 | 39 | enum EStateMapEntryType { |
michael@0 | 40 | kMapDirectly, |
michael@0 | 41 | kMapOpposite, // For example, UNAVAILABLE is the opposite of ENABLED |
michael@0 | 42 | kNoStateChange, // Don't fire state change event |
michael@0 | 43 | kNoSuchState |
michael@0 | 44 | }; |
michael@0 | 45 | |
michael@0 | 46 | const AtkStateType kNone = ATK_STATE_INVALID; |
michael@0 | 47 | |
michael@0 | 48 | struct AtkStateMap { |
michael@0 | 49 | AtkStateType atkState; |
michael@0 | 50 | EStateMapEntryType stateMapEntryType; |
michael@0 | 51 | |
michael@0 | 52 | static int32_t GetStateIndexFor(uint64_t aState) |
michael@0 | 53 | { |
michael@0 | 54 | int32_t stateIndex = -1; |
michael@0 | 55 | while (aState > 0) { |
michael@0 | 56 | ++ stateIndex; |
michael@0 | 57 | aState >>= 1; |
michael@0 | 58 | } |
michael@0 | 59 | return stateIndex; // Returns -1 if not mapped |
michael@0 | 60 | } |
michael@0 | 61 | }; |
michael@0 | 62 | |
michael@0 | 63 | |
michael@0 | 64 | // Map array from cross platform states to ATK states |
michael@0 | 65 | static const AtkStateMap gAtkStateMap[] = { // Cross Platform States |
michael@0 | 66 | { kNone, kMapOpposite }, // states::UNAVAILABLE = 1 << 0 |
michael@0 | 67 | { ATK_STATE_SELECTED, kMapDirectly }, // states::SELECTED = 1 << 1 |
michael@0 | 68 | { ATK_STATE_FOCUSED, kMapDirectly }, // states::FOCUSED = 1 << 2 |
michael@0 | 69 | { ATK_STATE_PRESSED, kMapDirectly }, // states::PRESSED = 1 << 3 |
michael@0 | 70 | { ATK_STATE_CHECKED, kMapDirectly }, // states::CHECKED = 1 << 4 |
michael@0 | 71 | { ATK_STATE_INDETERMINATE, kMapDirectly }, // states::MIXED = 1 << 5 |
michael@0 | 72 | { kNone, kMapDirectly }, // states::READONLY = 1 << 6 |
michael@0 | 73 | { kNone, kMapDirectly }, // states::HOTTRACKED = 1 << 7 |
michael@0 | 74 | { ATK_STATE_DEFAULT, kMapDirectly }, // states::DEFAULT = 1 << 8 |
michael@0 | 75 | { ATK_STATE_EXPANDED, kMapDirectly }, // states::EXPANDED = 1 << 9 |
michael@0 | 76 | { kNone, kNoStateChange }, // states::COLLAPSED = 1 << 10 |
michael@0 | 77 | { ATK_STATE_BUSY, kMapDirectly }, // states::BUSY = 1 << 11 |
michael@0 | 78 | { kNone, kMapDirectly }, // states::FLOATING = 1 << 12 |
michael@0 | 79 | { kNone, kMapDirectly }, // states::CHECKABLE = 1 << 13 |
michael@0 | 80 | { ATK_STATE_ANIMATED, kMapDirectly }, // states::ANIMATED = 1 << 14 |
michael@0 | 81 | { ATK_STATE_VISIBLE, kMapOpposite }, // states::INVISIBLE = 1 << 15 |
michael@0 | 82 | { ATK_STATE_SHOWING, kMapOpposite }, // states::OFFSCREEN = 1 << 16 |
michael@0 | 83 | { ATK_STATE_RESIZABLE, kMapDirectly }, // states::SIZEABLE = 1 << 17 |
michael@0 | 84 | { kNone, kMapDirectly }, // states::MOVEABLE = 1 << 18 |
michael@0 | 85 | { kNone, kMapDirectly }, // states::SELFVOICING = 1 << 19 |
michael@0 | 86 | { ATK_STATE_FOCUSABLE, kMapDirectly }, // states::FOCUSABLE = 1 << 20 |
michael@0 | 87 | { ATK_STATE_SELECTABLE, kMapDirectly }, // states::SELECTABLE = 1 << 21 |
michael@0 | 88 | { kNone, kMapDirectly }, // states::LINKED = 1 << 22 |
michael@0 | 89 | { ATK_STATE_VISITED, kMapDirectly }, // states::TRAVERSED = 1 << 23 |
michael@0 | 90 | { ATK_STATE_MULTISELECTABLE, kMapDirectly }, // states::MULTISELECTABLE = 1 << 24 |
michael@0 | 91 | { kNone, kMapDirectly }, // states::EXTSELECTABLE = 1 << 25 |
michael@0 | 92 | { ATK_STATE_REQUIRED, kMapDirectly }, // states::STATE_REQUIRED = 1 << 26 |
michael@0 | 93 | { kNone, kMapDirectly }, // states::ALERT_MEDIUM = 1 << 27 |
michael@0 | 94 | { ATK_STATE_INVALID_ENTRY, kMapDirectly }, // states::INVALID = 1 << 28 |
michael@0 | 95 | { kNone, kMapDirectly }, // states::PROTECTED = 1 << 29 |
michael@0 | 96 | { kNone, kMapDirectly }, // states::HASPOPUP = 1 << 30 |
michael@0 | 97 | { ATK_STATE_SUPPORTS_AUTOCOMPLETION, kMapDirectly }, // states::SUPPORTS_AUTOCOMPLETION = 1 << 31 |
michael@0 | 98 | { ATK_STATE_DEFUNCT, kMapDirectly }, // states::DEFUNCT = 1 << 32 |
michael@0 | 99 | { ATK_STATE_SELECTABLE_TEXT, kMapDirectly }, // states::SELECTABLE_TEXT = 1 << 33 |
michael@0 | 100 | { ATK_STATE_EDITABLE, kMapDirectly }, // states::EDITABLE = 1 << 34 |
michael@0 | 101 | { ATK_STATE_ACTIVE, kMapDirectly }, // states::ACTIVE = 1 << 35 |
michael@0 | 102 | { ATK_STATE_MODAL, kMapDirectly }, // states::MODAL = 1 << 36 |
michael@0 | 103 | { ATK_STATE_MULTI_LINE, kMapDirectly }, // states::MULTI_LINE = 1 << 37 |
michael@0 | 104 | { ATK_STATE_HORIZONTAL, kMapDirectly }, // states::HORIZONTAL = 1 << 38 |
michael@0 | 105 | { ATK_STATE_OPAQUE, kMapDirectly }, // states::OPAQUE = 1 << 39 |
michael@0 | 106 | { ATK_STATE_SINGLE_LINE, kMapDirectly }, // states::SINGLE_LINE = 1 << 40 |
michael@0 | 107 | { ATK_STATE_TRANSIENT, kMapDirectly }, // states::TRANSIENT = 1 << 41 |
michael@0 | 108 | { ATK_STATE_VERTICAL, kMapDirectly }, // states::VERTICAL = 1 << 42 |
michael@0 | 109 | { ATK_STATE_STALE, kMapDirectly }, // states::STALE = 1 << 43 |
michael@0 | 110 | { ATK_STATE_ENABLED, kMapDirectly }, // states::ENABLED = 1 << 44 |
michael@0 | 111 | { ATK_STATE_SENSITIVE, kMapDirectly }, // states::SENSITIVE = 1 << 45 |
michael@0 | 112 | { ATK_STATE_EXPANDABLE, kMapDirectly }, // states::EXPANDABLE = 1 << 46 |
michael@0 | 113 | { kNone, kMapDirectly }, // states::PINNED = 1 << 47 |
michael@0 | 114 | { kNone, kNoSuchState }, // = 1 << 48 |
michael@0 | 115 | }; |