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