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