android: Update app icon to new startcenter icon
[LibreOffice.git] / vcl / osx / a11yrolehelper.mm
blobe95036dbebd9c5f331fdd86f75c8d4276c6e8f97
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
21 #include <osx/a11yfactory.h>
23 #include "a11yrolehelper.h"
25 #include <com/sun/star/accessibility/AccessibleRole.hpp>
26 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
27 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
29 #include <sal/log.hxx>
31 using namespace ::com::sun::star::accessibility;
32 using namespace ::com::sun::star::lang;
33 using namespace ::com::sun::star::uno;
35 @implementation AquaA11yRoleHelper
37 +(id)simpleMapNativeRoleFrom: (XAccessibleContext *) accessibleContext {
38     id nativeRole = nil;
40     if (accessibleContext == nullptr)
41         return nativeRole;
43     switch( accessibleContext -> getAccessibleRole() ) {
44 #define MAP(a,b) \
45         case a: nativeRole = b; break
46             
47         MAP( AccessibleRole::UNKNOWN, NSAccessibilityUnknownRole );
48         MAP( AccessibleRole::ALERT, NSAccessibilityUnknownRole ); // FIXME
49         MAP( AccessibleRole::COLUMN_HEADER, NSAccessibilityColumnRole );
50         MAP( AccessibleRole::CANVAS, NSAccessibilityUnknownRole ); // FIXME
51         MAP( AccessibleRole::CHECK_BOX, NSAccessibilityCheckBoxRole );
52         MAP( AccessibleRole::CHECK_MENU_ITEM, NSAccessibilityUnknownRole ); // FIXME
53         MAP( AccessibleRole::COLOR_CHOOSER, NSAccessibilityColorWellRole ); // FIXME
54         MAP( AccessibleRole::COMBO_BOX, NSAccessibilityComboBoxRole );
55         MAP( AccessibleRole::DATE_EDITOR, NSAccessibilityUnknownRole ); // FIXME
56         MAP( AccessibleRole::DESKTOP_ICON, NSAccessibilityUnknownRole ); // FIXME
57         MAP( AccessibleRole::DESKTOP_PANE, NSAccessibilityUnknownRole ); // FIXME
58         MAP( AccessibleRole::DIRECTORY_PANE, NSAccessibilityUnknownRole ); // FIXME
59         MAP( AccessibleRole::DIALOG, NSAccessibilityGroupRole );
60         MAP( AccessibleRole::DOCUMENT, NSAccessibilityGroupRole );
61         MAP( AccessibleRole::EMBEDDED_OBJECT, NSAccessibilityUnknownRole ); // FIXME
62         MAP( AccessibleRole::END_NOTE, NSAccessibilityUnknownRole ); // FIXME
63         MAP( AccessibleRole::FILE_CHOOSER, NSAccessibilityUnknownRole ); // FIXME
64         MAP( AccessibleRole::FILLER, NSAccessibilityUnknownRole ); // FIXME
65         MAP( AccessibleRole::FONT_CHOOSER, NSAccessibilityUnknownRole ); // FIXME
66         MAP( AccessibleRole::FOOTER, NSAccessibilityGroupRole ); // FIXME
67         MAP( AccessibleRole::FOOTNOTE, NSAccessibilityUnknownRole ); // FIXME
68         MAP( AccessibleRole::FRAME, NSAccessibilityWindowRole );
69         MAP( AccessibleRole::GLASS_PANE, NSAccessibilityUnknownRole ); // FIXME
70         MAP( AccessibleRole::GRAPHIC, NSAccessibilityImageRole );
71         MAP( AccessibleRole::GROUP_BOX, NSAccessibilityGroupRole );
72         MAP( AccessibleRole::HEADER, NSAccessibilityGroupRole ); // FIXME
73         MAP( AccessibleRole::HEADING, NSAccessibilityTextAreaRole ); // FIXME
74         MAP( AccessibleRole::HYPER_LINK, NSAccessibilityLinkRole );
75         MAP( AccessibleRole::ICON, NSAccessibilityImageRole );
76         MAP( AccessibleRole::INTERNAL_FRAME, NSAccessibilityUnknownRole ); // FIXME
77         MAP( AccessibleRole::LABEL, NSAccessibilityStaticTextRole );
78         MAP( AccessibleRole::LAYERED_PANE, NSAccessibilityUnknownRole ); // FIXME
79         MAP( AccessibleRole::LIST, NSAccessibilityMenuRole );
80         MAP( AccessibleRole::LIST_ITEM, NSAccessibilityMenuItemRole );
81         MAP( AccessibleRole::MENU, NSAccessibilityMenuRole );
82         MAP( AccessibleRole::MENU_BAR, NSAccessibilityMenuBarRole );
83         MAP( AccessibleRole::MENU_ITEM, NSAccessibilityMenuItemRole );
84         MAP( AccessibleRole::OPTION_PANE, NSAccessibilityUnknownRole ); // FIXME
85         MAP( AccessibleRole::PAGE_TAB, NSAccessibilityButtonRole );
86         MAP( AccessibleRole::PAGE_TAB_LIST, NSAccessibilityTabGroupRole );
87         MAP( AccessibleRole::PANEL, NSAccessibilityGroupRole );
88         MAP( AccessibleRole::PARAGRAPH, NSAccessibilityTextAreaRole );
89         MAP( AccessibleRole::PASSWORD_TEXT, NSAccessibilityTextFieldRole );
90         MAP( AccessibleRole::POPUP_MENU, NSAccessibilityMenuRole );
91         MAP( AccessibleRole::PUSH_BUTTON, NSAccessibilityButtonRole );
92         MAP( AccessibleRole::PROGRESS_BAR, NSAccessibilityProgressIndicatorRole );
93         MAP( AccessibleRole::RADIO_BUTTON, NSAccessibilityRadioButtonRole );
94         MAP( AccessibleRole::RADIO_MENU_ITEM, NSAccessibilityUnknownRole ); // FIXME
95         MAP( AccessibleRole::ROW_HEADER, NSAccessibilityRowRole );
96         MAP( AccessibleRole::ROOT_PANE, NSAccessibilityUnknownRole ); // FIXME
97         MAP( AccessibleRole::SCROLL_BAR, NSAccessibilityScrollBarRole );
98         MAP( AccessibleRole::SCROLL_PANE, NSAccessibilityScrollAreaRole );
99         MAP( AccessibleRole::SHAPE, NSAccessibilityUnknownRole ); // FIXME
100         MAP( AccessibleRole::SEPARATOR, NSAccessibilitySplitterRole ); // FIXME
101         MAP( AccessibleRole::SLIDER, NSAccessibilitySliderRole );
102         MAP( AccessibleRole::SPIN_BOX, NSAccessibilityUnknownRole ); // FIXME
103         MAP( AccessibleRole::SPLIT_PANE, NSAccessibilitySplitGroupRole );
104         MAP( AccessibleRole::STATUS_BAR, NSAccessibilityGroupRole ); // FIXME
105         MAP( AccessibleRole::TABLE, NSAccessibilityTableRole );
106         MAP( AccessibleRole::TABLE_CELL, NSAccessibilityTextFieldRole );
107         MAP( AccessibleRole::TEXT, NSAccessibilityTextAreaRole );
108         MAP( AccessibleRole::TEXT_FRAME, NSAccessibilityGroupRole );
109         MAP( AccessibleRole::TOGGLE_BUTTON, NSAccessibilityCheckBoxRole );
110         MAP( AccessibleRole::TOOL_BAR, NSAccessibilityToolbarRole );
111         MAP( AccessibleRole::TOOL_TIP, NSAccessibilityUnknownRole ); // FIXME
112         MAP( AccessibleRole::TREE, NSAccessibilityGroupRole );
113         MAP( AccessibleRole::VIEW_PORT, NSAccessibilityUnknownRole ); // FIXME
114         MAP( AccessibleRole::WINDOW, NSAccessibilityWindowRole );
116         MAP( AccessibleRole::BUTTON_DROPDOWN, NSAccessibilityMenuButtonRole );
117         MAP( AccessibleRole::BUTTON_MENU, NSAccessibilityMenuButtonRole );
118         MAP( AccessibleRole::CAPTION, NSAccessibilityUnknownRole );
119         MAP( AccessibleRole::CHART, NSAccessibilityUnknownRole );
120         MAP( AccessibleRole::FORM, NSAccessibilityUnknownRole );
121         MAP( AccessibleRole::IMAGE_MAP, NSAccessibilityUnknownRole );
122         MAP( AccessibleRole::NOTE, NSAccessibilityUnknownRole );
123         MAP( AccessibleRole::PAGE, NSAccessibilityUnknownRole );
124         MAP( AccessibleRole::RULER, NSAccessibilityUnknownRole );
125         MAP( AccessibleRole::SECTION, NSAccessibilityUnknownRole );
126         MAP( AccessibleRole::TREE_ITEM, NSAccessibilityUnknownRole );
127         MAP( AccessibleRole::TREE_TABLE, NSAccessibilityUnknownRole );
129         MAP( AccessibleRole::DOCUMENT_PRESENTATION, NSAccessibilityGroupRole );
130         MAP( AccessibleRole::DOCUMENT_SPREADSHEET, NSAccessibilityGroupRole );
131         MAP( AccessibleRole::DOCUMENT_TEXT, NSAccessibilityGroupRole );
132         MAP( AccessibleRole::STATIC, NSAccessibilityStaticTextRole );
133         MAP( AccessibleRole::NOTIFICATION, NSAccessibilityStaticTextRole );
135 #undef MAP
136         default:
137             break;
138     }
139     return nativeRole;
142 +(id)getNativeRoleFrom: (XAccessibleContext *) accessibleContext {
143     id nativeRole = [ AquaA11yRoleHelper simpleMapNativeRoleFrom: accessibleContext ];
144     if ( accessibleContext -> getAccessibleRole() == AccessibleRole::LABEL ) {
145         if ( accessibleContext -> getAccessibleChildCount() > 0 ) {
146             [ nativeRole release ];
147             nativeRole = NSAccessibilityOutlineRole;
148         } else if ( accessibleContext -> getAccessibleParent().is() ) {
149             Reference < XAccessibleContext > rxParentContext = accessibleContext -> getAccessibleParent() -> getAccessibleContext();
150             if ( rxParentContext.is() ) {
151                 NSString * roleParent = static_cast<NSString *>([ AquaA11yRoleHelper simpleMapNativeRoleFrom: rxParentContext.get() ]);
152                 if ( [ roleParent isEqualToString: NSAccessibilityOutlineRole ] ) {
153                     [ nativeRole release ];
154                     nativeRole = NSAccessibilityRowRole;
155                 }
156                 [ roleParent release ];
157             }
158         }
159     } else if ( accessibleContext -> getAccessibleRole() == AccessibleRole::COMBO_BOX ) {
160         try {
161             Reference < XAccessible > rxAccessible = accessibleContext -> getAccessibleChild(0);
162             if ( rxAccessible.is() ) {
163                 Reference < XAccessibleContext > rxAccessibleContext = rxAccessible -> getAccessibleContext();
164                 if ( rxAccessibleContext.is() && rxAccessibleContext -> getAccessibleRole() == AccessibleRole::TEXT ) {
165                     sal_Int64 nStateSet = rxAccessibleContext -> getAccessibleStateSet();
166                     if ( !(nStateSet & AccessibleStateType::EDITABLE ) ) {
167                         [ nativeRole release ];
168                         nativeRole = NSAccessibilityPopUpButtonRole;
169                     }
170                 }
171             }
172         }
173         catch (const IndexOutOfBoundsException&)
174         {
175             SAL_WARN("vcl", "No valid accessible objects in parent");
176         }
177     }
178     return nativeRole;
181 +(id)getNativeSubroleFrom: (sal_Int16) nRole {
182     id nativeSubrole = nil;
183     switch( nRole ) {
184 #define MAP(a,b) \
185         case a: nativeSubrole = b; break
187         MAP( AccessibleRole::UNKNOWN, NSAccessibilityUnknownSubrole );
188         MAP( AccessibleRole::ALERT, NSAccessibilitySystemDialogSubrole );
189         MAP( AccessibleRole::COLUMN_HEADER, @"" );
190         MAP( AccessibleRole::CANVAS, @"" );
191         MAP( AccessibleRole::CHECK_BOX, @"" );
192         MAP( AccessibleRole::CHECK_MENU_ITEM, @"" );
193         MAP( AccessibleRole::COLOR_CHOOSER, @"" );
194         MAP( AccessibleRole::COMBO_BOX, @"" );
195         MAP( AccessibleRole::DATE_EDITOR, @"" );
196         MAP( AccessibleRole::DESKTOP_ICON, @"" );
197         MAP( AccessibleRole::DESKTOP_PANE, @"" );
198         MAP( AccessibleRole::DIRECTORY_PANE, @"" );
199         MAP( AccessibleRole::DIALOG, NSAccessibilityDialogSubrole );
200         MAP( AccessibleRole::DOCUMENT, @"" );
201         MAP( AccessibleRole::EMBEDDED_OBJECT, @"" );
202         MAP( AccessibleRole::END_NOTE, @"" );
203         MAP( AccessibleRole::FILE_CHOOSER, @"" );
204         MAP( AccessibleRole::FILLER, @"" );
205         MAP( AccessibleRole::FONT_CHOOSER, @"" );
206         MAP( AccessibleRole::FOOTER, @"" );
207         MAP( AccessibleRole::FOOTNOTE, @"" );
208         MAP( AccessibleRole::FRAME, @"" );
209         MAP( AccessibleRole::GLASS_PANE, @"" );
210         MAP( AccessibleRole::GRAPHIC, @"" );
211         MAP( AccessibleRole::GROUP_BOX, @"" );
212         MAP( AccessibleRole::HEADER, @"" );
213         MAP( AccessibleRole::HEADING, @"" );
214         MAP( AccessibleRole::HYPER_LINK, NSAccessibilityTextLinkSubrole );
215         MAP( AccessibleRole::ICON, @"" );
216         MAP( AccessibleRole::INTERNAL_FRAME, @"" );
217         MAP( AccessibleRole::LABEL, @"" );
218         MAP( AccessibleRole::LAYERED_PANE, @"" );
219         MAP( AccessibleRole::LIST, @"" );
220         MAP( AccessibleRole::LIST_ITEM, NSAccessibilityOutlineRowSubrole );
221         MAP( AccessibleRole::MENU, @"" );
222         MAP( AccessibleRole::MENU_BAR, @"" );
223         MAP( AccessibleRole::MENU_ITEM, @"" );
224         MAP( AccessibleRole::OPTION_PANE, @"" );
225         MAP( AccessibleRole::PAGE_TAB, @"" );
226         MAP( AccessibleRole::PAGE_TAB_LIST, @"" );
227         MAP( AccessibleRole::PANEL, @"" );
228         MAP( AccessibleRole::PARAGRAPH, @"" );
229         MAP( AccessibleRole::PASSWORD_TEXT, NSAccessibilitySecureTextFieldSubrole );
230         MAP( AccessibleRole::POPUP_MENU, @"" );
231         MAP( AccessibleRole::PUSH_BUTTON, @"" );
232         MAP( AccessibleRole::PROGRESS_BAR, @"" );
233         MAP( AccessibleRole::RADIO_BUTTON, @"" );
234         MAP( AccessibleRole::RADIO_MENU_ITEM, @"" );
235         MAP( AccessibleRole::ROW_HEADER, @"" );
236         MAP( AccessibleRole::ROOT_PANE, @"" );
237         MAP( AccessibleRole::SCROLL_BAR, @"" );
238         MAP( AccessibleRole::SCROLL_PANE, @"" );
239         MAP( AccessibleRole::SHAPE, @"" );
240         MAP( AccessibleRole::SEPARATOR, @"" );
241         MAP( AccessibleRole::SLIDER, @"" );
242         MAP( AccessibleRole::SPIN_BOX, @"" );
243         MAP( AccessibleRole::SPLIT_PANE, @"" );
244         MAP( AccessibleRole::STATUS_BAR, @"" );
245         MAP( AccessibleRole::TABLE, @"" );
246         MAP( AccessibleRole::TABLE_CELL, @"" );
247         MAP( AccessibleRole::TEXT, @"" );
248         MAP( AccessibleRole::TEXT_FRAME, @"" );
249         MAP( AccessibleRole::TOGGLE_BUTTON, @"" );
250         MAP( AccessibleRole::TOOL_BAR, @"" );
251         MAP( AccessibleRole::TOOL_TIP, @"" );
252         MAP( AccessibleRole::TREE, @"" );
253         MAP( AccessibleRole::VIEW_PORT, @"" );
254         MAP( AccessibleRole::WINDOW, NSAccessibilityStandardWindowSubrole );
256         MAP( AccessibleRole::BUTTON_DROPDOWN, @"" );
257         MAP( AccessibleRole::BUTTON_MENU, @"" );
258         MAP( AccessibleRole::CAPTION, @"" );
259         MAP( AccessibleRole::CHART, @"" );
260         MAP( AccessibleRole::FORM, @"" );
261         MAP( AccessibleRole::IMAGE_MAP, @"" );
262         MAP( AccessibleRole::NOTE, @"" );
263         MAP( AccessibleRole::PAGE, @"" );
264         MAP( AccessibleRole::RULER, @"" );
265         MAP( AccessibleRole::SECTION, @"" );
266         MAP( AccessibleRole::TREE_ITEM, @"" );
267         MAP( AccessibleRole::TREE_TABLE, @"" );
269         MAP( AccessibleRole::DOCUMENT_PRESENTATION, @"" );
270         MAP( AccessibleRole::DOCUMENT_SPREADSHEET, @"" );
271         MAP( AccessibleRole::DOCUMENT_TEXT, @"" );
273         MAP( AccessibleRole::STATIC, @"" );
274         MAP( AccessibleRole::NOTIFICATION, @"" );
276 #undef MAP
277         default:
278             break;
279     }
280     return nativeSubrole;
283 +(id)getRoleDescriptionFrom: (NSString *) role with: (NSString *) subRole {
284     id roleDescription;
285     if ( [ subRole length ] == 0 )
286         roleDescription = NSAccessibilityRoleDescription( role, nil );
287     else
288         roleDescription = NSAccessibilityRoleDescription( role, subRole );
289     return roleDescription;
292 @end
294 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */