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/. */
7 #include "InterfaceInitFuncs.h"
9 #include "Accessible-inl.h"
12 #include "mozilla/Likely.h"
16 using namespace mozilla::a11y
;
21 doActionCB(AtkAction
*aAction
, gint aActionIndex
)
23 AccessibleWrap
* accWrap
= GetAccessibleWrap(ATK_OBJECT(aAction
));
24 return accWrap
&& accWrap
->DoAction(aActionIndex
);
28 getActionCountCB(AtkAction
*aAction
)
30 AccessibleWrap
* accWrap
= GetAccessibleWrap(ATK_OBJECT(aAction
));
31 return accWrap
? accWrap
->ActionCount() : 0;
35 getActionDescriptionCB(AtkAction
*aAction
, gint aActionIndex
)
37 AccessibleWrap
* accWrap
= GetAccessibleWrap(ATK_OBJECT(aAction
));
41 nsAutoString description
;
42 accWrap
->ActionDescriptionAt(aActionIndex
, description
);
43 return AccessibleWrap::ReturnString(description
);
47 getActionNameCB(AtkAction
*aAction
, gint aActionIndex
)
49 AccessibleWrap
* accWrap
= GetAccessibleWrap(ATK_OBJECT(aAction
));
54 accWrap
->ActionNameAt(aActionIndex
, autoStr
);
55 return AccessibleWrap::ReturnString(autoStr
);
59 getKeyBindingCB(AtkAction
*aAction
, gint aActionIndex
)
61 AccessibleWrap
* acc
= GetAccessibleWrap(ATK_OBJECT(aAction
));
65 // Return all key bindings including access key and keyboard shortcut.
66 nsAutoString keyBindingsStr
;
69 KeyBinding keyBinding
= acc
->AccessKey();
70 if (!keyBinding
.IsEmpty()) {
71 keyBinding
.AppendToString(keyBindingsStr
, KeyBinding::eAtkFormat
);
73 Accessible
* parent
= acc
->Parent();
74 roles::Role role
= parent
? parent
->Role() : roles::NOTHING
;
75 if (role
== roles::PARENT_MENUITEM
|| role
== roles::MENUITEM
||
76 role
== roles::RADIO_MENU_ITEM
|| role
== roles::CHECK_MENU_ITEM
) {
77 // It is submenu, expose keyboard shortcuts from menu hierarchy like
79 nsAutoString keysInHierarchyStr
= keyBindingsStr
;
81 KeyBinding parentKeyBinding
= parent
->AccessKey();
82 if (!parentKeyBinding
.IsEmpty()) {
84 parentKeyBinding
.ToString(str
, KeyBinding::eAtkFormat
);
87 keysInHierarchyStr
.Insert(str
, 0);
89 } while ((parent
= parent
->Parent()) && parent
->Role() != roles::MENUBAR
);
91 keyBindingsStr
.Append(';');
92 keyBindingsStr
.Append(keysInHierarchyStr
);
95 // No access key, add ';' to point this.
96 keyBindingsStr
.Append(';');
99 // Get keyboard shortcut.
100 keyBindingsStr
.Append(';');
101 keyBinding
= acc
->KeyboardShortcut();
102 if (!keyBinding
.IsEmpty()) {
103 keyBinding
.AppendToString(keyBindingsStr
, KeyBinding::eAtkFormat
);
106 return AccessibleWrap::ReturnString(keyBindingsStr
);
111 actionInterfaceInitCB(AtkActionIface
* aIface
)
113 NS_ASSERTION(aIface
, "Invalid aIface");
114 if (MOZ_UNLIKELY(!aIface
))
117 aIface
->do_action
= doActionCB
;
118 aIface
->get_n_actions
= getActionCountCB
;
119 aIface
->get_description
= getActionDescriptionCB
;
120 aIface
->get_keybinding
= getKeyBindingCB
;
121 aIface
->get_name
= getActionNameCB
;