LibreOffice Module accessibility (master) 1
acc_factory.cxx
Go to the documentation of this file.
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 */
19
20#include <config_features.h>
21#include <config_feature_desktop.h>
22
23#include <toolkit/awt/vclxwindows.hxx>
58#include <com/sun/star/accessibility/AccessibleRole.hpp>
63
65
66using namespace ::accessibility;
67using namespace ::com::sun::star::uno;
68using namespace ::com::sun::star::awt;
69using namespace ::com::sun::star::accessibility;
70using namespace ::vcl;
71using namespace ::vcl::table;
72
73namespace {
74
75bool hasFloatingChild(vcl::Window *pWindow)
76{
77 vcl::Window * pChild = pWindow->GetAccessibleChildWindow(0);
78 return pChild && pChild->GetType() == WindowType::FLOATINGWINDOW;
79}
80
81// IAccessibleFactory
82class AccessibleFactory :public ::toolkit::IAccessibleFactory
84{
85public:
86 AccessibleFactory();
87
88 // ::toolkit::IAccessibleFactory
89 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
90 createAccessibleContext( VCLXButton* _pXWindow ) override;
91 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
92 createAccessibleContext( VCLXCheckBox* _pXWindow ) override;
93 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
94 createAccessibleContext( VCLXRadioButton* _pXWindow ) override;
95 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
96 createAccessibleContext( VCLXListBox* _pXWindow ) override;
97 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
98 createAccessibleContext( VCLXFixedText* _pXWindow ) override;
99 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
100 createAccessibleContext( VCLXFixedHyperlink* _pXWindow ) override;
101 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
102 createAccessibleContext( VCLXScrollBar* _pXWindow ) override;
103 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
104 createAccessibleContext( VCLXEdit* _pXWindow ) override;
105 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
106 createAccessibleContext( VCLXComboBox* _pXWindow ) override;
107 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
108 createAccessibleContext( VCLXToolBox* _pXWindow ) override;
109 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
110 createAccessibleContext( VCLXHeaderBar* _pXWindow ) override;
111 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
112 createAccessibleContext( SVTXNumericField* _pXWindow ) override;
113 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
114 createAccessibleContext( VCLXWindow* _pXWindow ) override;
115 virtual css::uno::Reference< css::accessibility::XAccessible >
116 createAccessible( Menu* _pMenu, bool _bIsMenuBar ) override;
117
118 // ::vcl::IAccessibleFactory
121 const css::uno::Reference< css::accessibility::XAccessible >& rxParent,
123 ) const override;
124
127 const css::uno::Reference< css::accessibility::XAccessible >& _rxParent,
129 ) const override;
130
131 virtual IAccessibleTableControl*
133 const css::uno::Reference< css::accessibility::XAccessible >& _rxParent,
134 IAccessibleTable& _rTable
135 ) const override;
136
137 virtual css::uno::Reference< css::accessibility::XAccessible >
139 SvtIconChoiceCtrl& _rIconCtrl,
140 const css::uno::Reference< css::accessibility::XAccessible >& _xParent
141 ) const override;
142
143 virtual css::uno::Reference< css::accessibility::XAccessible >
145 TabBar& _rTabBar
146 ) const override;
147
148 virtual css::uno::Reference< css::accessibility::XAccessibleContext >
150 VCLXWindow* pVclXWindow, TextEngine& rEngine, TextView& rView
151 ) const override;
152
153 virtual css::uno::Reference< css::accessibility::XAccessible >
155 SvTreeListBox& _rListBox,
156 const css::uno::Reference< css::accessibility::XAccessible >& _xParent
157 ) const override;
158
159 virtual css::uno::Reference< css::accessibility::XAccessible >
161 SvTreeListBox& _rListBox,
162 const css::uno::Reference< css::accessibility::XAccessible >& _xParent
163 ) const override;
164
165 virtual css::uno::Reference< css::accessibility::XAccessible >
167 const css::uno::Reference< css::accessibility::XAccessible >& rxParent,
168 vcl::IAccessibleTableProvider& _rOwningTable,
170 ) const override;
171
172 virtual css::uno::Reference< css::accessibility::XAccessible >
174 const css::uno::Reference< css::accessibility::XAccessible >& _rxParent,
176 const css::uno::Reference< css::awt::XWindow >& _xFocusWindow,
177 sal_Int32 _nRowId,
178 sal_uInt16 _nColId,
179 sal_Int32 _nOffset
180 ) const override;
181
182 virtual css::uno::Reference< css::accessibility::XAccessible >
184 sal_Int32 _nColumnRowId,
185 const css::uno::Reference< css::accessibility::XAccessible >& rxParent,
187 const css::uno::Reference< css::awt::XWindow >& _xFocusWindow,
189 ) const override;
190
191 virtual css::uno::Reference< css::accessibility::XAccessible >
193 const css::uno::Reference< css::accessibility::XAccessible >& _rxParent,
195 const css::uno::Reference< css::awt::XWindow >& _xFocusWindow,
196 sal_Int32 _nRowPos,
197 sal_uInt16 _nColPos,
198 const TriState& _eState,
199 bool _bIsTriState
200 ) const override;
201
202 virtual css::uno::Reference< css::accessibility::XAccessible >
204 const css::uno::Reference< css::accessibility::XAccessible >& _rxParent,
205 const css::uno::Reference< css::accessibility::XAccessible >& _rxControlAccessible,
206 const css::uno::Reference< css::awt::XWindow >& _rxFocusWindow,
208 sal_Int32 _nRowPos,
209 sal_uInt16 _nColPos
210 ) const override;
211
212protected:
213 virtual ~AccessibleFactory() override;
214};
215
216AccessibleFactory::AccessibleFactory()
217{
218}
219
220AccessibleFactory::~AccessibleFactory()
221{
222}
223
224Reference< XAccessible > AccessibleFactory::createAccessible( Menu* _pMenu, bool _bIsMenuBar )
225{
227 if ( _bIsMenuBar )
228 pAccessible = new VCLXAccessibleMenuBar( _pMenu );
229 else
230 pAccessible = new VCLXAccessiblePopupMenu( _pMenu );
231 pAccessible->SetStates();
232 return pAccessible;
233}
234
235Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXButton* _pXWindow )
236{
237 return new VCLXAccessibleButton( _pXWindow );
238}
239
240Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXCheckBox* _pXWindow )
241{
242 return new VCLXAccessibleCheckBox( _pXWindow );
243}
244
245Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXRadioButton* _pXWindow )
246{
247 return new VCLXAccessibleRadioButton( _pXWindow );
248}
249
250Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXListBox* _pXWindow )
251{
252 bool bIsDropDownBox = false;
253 VclPtr< ListBox > pBox = _pXWindow->GetAs< ListBox >();
254 if ( pBox )
255 bIsDropDownBox = ( ( pBox->GetStyle() & WB_DROPDOWN ) == WB_DROPDOWN );
256
257 if ( bIsDropDownBox )
258 return new VCLXAccessibleDropDownListBox( _pXWindow );
259 else
260 return new VCLXAccessibleListBox( _pXWindow );
261}
262
263Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXFixedText* _pXWindow )
264{
265 return new VCLXAccessibleFixedText( _pXWindow );
266}
267
268Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXFixedHyperlink* _pXWindow )
269{
270 return new VCLXAccessibleFixedHyperlink( _pXWindow );
271}
272
273Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXScrollBar* _pXWindow )
274{
275 return new VCLXAccessibleScrollBar( _pXWindow );
276}
277
278Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXEdit* _pXWindow )
279{
280 return new VCLXAccessibleEdit( _pXWindow );
281}
282
283Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXComboBox* _pXWindow )
284{
285 bool bIsDropDownBox = false;
286 VclPtr< ComboBox > pBox = _pXWindow->GetAs< ComboBox >();
287 if ( pBox )
288 bIsDropDownBox = ( ( pBox->GetStyle() & WB_DROPDOWN ) == WB_DROPDOWN );
289
290 if ( bIsDropDownBox )
291 return new VCLXAccessibleDropDownComboBox( _pXWindow );
292 else
293 return new VCLXAccessibleComboBox( _pXWindow );
294}
295
296Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXWindow* _pXWindow )
297{
298 Reference< XAccessibleContext > xContext;
299
300 VclPtr<vcl::Window> pWindow = _pXWindow->GetWindow();
301 if ( pWindow )
302 {
303 WindowType nType = pWindow->GetType();
304
305 if ( nType == WindowType::MENUBARWINDOW || pWindow->IsMenuFloatingWindow() || pWindow->IsToolbarFloatingWindow() )
306 {
307 Reference< XAccessible > xAcc( pWindow->GetAccessible() );
308 if ( xAcc.is() )
309 {
310 Reference< XAccessibleContext > xCont( xAcc->getAccessibleContext() );
311 if ( pWindow->GetType() == WindowType::MENUBARWINDOW ||
312 ( xCont.is() && xCont->getAccessibleRole() == AccessibleRole::POPUP_MENU ) )
313 {
314 xContext = xCont;
315 }
316 }
317 }
318
319 else if ( nType == WindowType::STATUSBAR )
320 {
321 xContext = new VCLXAccessibleStatusBar(_pXWindow);
322 }
323
324 else if ( nType == WindowType::TABCONTROL )
325 {
326 xContext = new VCLXAccessibleTabControl(_pXWindow);
327 }
328
329 else if ( nType == WindowType::TABPAGE && pWindow->GetAccessibleParentWindow() && pWindow->GetAccessibleParentWindow()->GetType() == WindowType::TABCONTROL )
330 {
331 xContext = new VCLXAccessibleTabPageWindow( _pXWindow );
332 }
333
334 else if ( nType == WindowType::FLOATINGWINDOW )
335 {
336 xContext = new FloatingWindowAccessible( _pXWindow );
337 }
338
339 else if ( nType == WindowType::BORDERWINDOW && hasFloatingChild( pWindow ) )
340 {
341 xContext = new FloatingWindowAccessible( _pXWindow );
342 }
343
344 else if ( ( nType == WindowType::HELPTEXTWINDOW ) || ( nType == WindowType::FIXEDLINE ) )
345 {
346 xContext = new VCLXAccessibleFixedText(_pXWindow);
347 }
348 else
349 {
350 xContext = new VCLXAccessibleComponent(_pXWindow);
351 }
352 }
353 return xContext;
354}
355
356Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXToolBox* _pXWindow )
357{
358 return new VCLXAccessibleToolBox( _pXWindow );
359}
360
361Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( VCLXHeaderBar* _pXWindow )
362{
363 return new VCLXAccessibleHeaderBar(_pXWindow);
364}
365
366Reference< XAccessibleContext > AccessibleFactory::createAccessibleContext( SVTXNumericField* _pXWindow )
367{
368 return new SVTXAccessibleNumericField( _pXWindow );
369}
370
371vcl::IAccessibleTabListBox* AccessibleFactory::createAccessibleTabListBox(
372 const Reference< XAccessible >& rxParent, SvHeaderTabListBox& rBox ) const
373{
374 return new AccessibleTabListBox( rxParent, rBox );
375}
376
377vcl::IAccessibleBrowseBox* AccessibleFactory::createAccessibleBrowseBox(
378 const Reference< XAccessible >& _rxParent, vcl::IAccessibleTableProvider& _rBrowseBox ) const
379{
380 return new AccessibleBrowseBoxAccess( _rxParent, _rBrowseBox );
381}
382
383IAccessibleTableControl* AccessibleFactory::createAccessibleTableControl(
384 const Reference< XAccessible >& _rxParent, IAccessibleTable& _rTable ) const
385{
386 return new AccessibleGridControlAccess( _rxParent, _rTable );
387}
388
389Reference< XAccessible > AccessibleFactory::createAccessibleIconChoiceCtrl(
390 SvtIconChoiceCtrl& _rIconCtrl, const Reference< XAccessible >& _xParent ) const
391{
392 return new AccessibleIconChoiceCtrl( _rIconCtrl, _xParent );
393}
394
395Reference< XAccessible > AccessibleFactory::createAccessibleTabBar( TabBar& _rTabBar ) const
396{
397#if HAVE_FEATURE_SCRIPTING
398 return new AccessibleTabBar( &_rTabBar );
399#else
400 (void)_rTabBar;
401 return nullptr;
402#endif
403}
404
405Reference< XAccessibleContext > AccessibleFactory::createAccessibleTextWindowContext(
406 VCLXWindow* pVclXWindow, TextEngine& rEngine, TextView& rView ) const
407{
408 return new Document( pVclXWindow, rEngine, rView );
409}
410
411Reference< XAccessible > AccessibleFactory::createAccessibleTreeListBox(
412 SvTreeListBox& _rListBox, const Reference< XAccessible >& _xParent ) const
413{
414 return new AccessibleListBox( _rListBox, _xParent );
415}
416
417Reference< XAccessible > AccessibleFactory::createAccessibleIconView(
418 SvTreeListBox& _rListBox, const Reference< XAccessible >& _xParent ) const
419{
420 return new AccessibleIconView( _rListBox, _xParent );
421}
422
423Reference< XAccessible > AccessibleFactory::createAccessibleBrowseBoxHeaderBar(
424 const Reference< XAccessible >& rxParent, vcl::IAccessibleTableProvider& _rOwningTable,
425 AccessibleBrowseBoxObjType _eObjType ) const
426{
427 return new AccessibleBrowseBoxHeaderBar( rxParent, _rOwningTable, _eObjType );
428}
429
430Reference< XAccessible > AccessibleFactory::createAccessibleBrowseBoxTableCell(
431 const Reference< XAccessible >& _rxParent, vcl::IAccessibleTableProvider& _rBrowseBox,
432 const Reference< XWindow >& _xFocusWindow, sal_Int32 _nRowId, sal_uInt16 _nColId, sal_Int32 _nOffset ) const
433{
434 return new AccessibleBrowseBoxTableCell( _rxParent, _rBrowseBox, _xFocusWindow,
435 _nRowId, _nColId, _nOffset );
436}
437
438Reference< XAccessible > AccessibleFactory::createAccessibleBrowseBoxHeaderCell(
439 sal_Int32 _nColumnRowId, const Reference< XAccessible >& rxParent, vcl::IAccessibleTableProvider& _rBrowseBox,
440 const Reference< XWindow >& _xFocusWindow, AccessibleBrowseBoxObjType _eObjType ) const
441{
442 return new AccessibleBrowseBoxHeaderCell( _nColumnRowId, rxParent, _rBrowseBox,
443 _xFocusWindow, _eObjType );
444}
445
446Reference< XAccessible > AccessibleFactory::createAccessibleCheckBoxCell(
447 const Reference< XAccessible >& _rxParent, vcl::IAccessibleTableProvider& _rBrowseBox,
448 const Reference< XWindow >& _xFocusWindow, sal_Int32 _nRowPos, sal_uInt16 _nColPos,
449 const TriState& _eState, bool _bIsTriState ) const
450{
451 return new AccessibleCheckBoxCell( _rxParent, _rBrowseBox, _xFocusWindow,
452 _nRowPos, _nColPos, _eState, _bIsTriState );
453}
454
455Reference< XAccessible > AccessibleFactory::createEditBrowseBoxTableCellAccess(
456 const Reference< XAccessible >& _rxParent, const Reference< XAccessible >& _rxControlAccessible,
457 const Reference< XWindow >& _rxFocusWindow, vcl::IAccessibleTableProvider& _rBrowseBox,
458 sal_Int32 _nRowPos, sal_uInt16 _nColPos ) const
459{
460 return new EditBrowseBoxTableCellAccess( _rxParent, _rxControlAccessible,
461 _rxFocusWindow, _rBrowseBox, _nRowPos, _nColPos );
462}
463
464} // anonymous namespace
465
466#if HAVE_FEATURE_DESKTOP
467/* this is the entry point to retrieve a factory for the toolkit-level Accessible/Contexts supplied
468 by this library
469
470 This function implements the factory function needed in toolkit
471 (of type GetStandardAccComponentFactory).
472*/
473extern "C"
474{
475 SAL_DLLPUBLIC_EXPORT void* getStandardAccessibleFactory()
476 {
477 ::toolkit::IAccessibleFactory* pFactory = new AccessibleFactory;
478 pFactory->acquire();
479 return pFactory;
480 }
481}
482
489extern "C"
490{
491 SAL_DLLPUBLIC_EXPORT void* getSvtAccessibilityComponentFactory()
492 {
493 ::vcl::IAccessibleFactory* pFactory = new AccessibleFactory;
494 pFactory->acquire();
495 return pFactory;
496 }
497}
498#endif // HAVE_FEATURE_DESKTOP
499
500/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
AccessibleBrowseBoxObjType
The accessible combobox has two children.
The accessible drop down combobox has two children.
The accessible drop down combobox has two children.
The accessible drop down combobox has one children.
vcl::Window * GetWindow() const
virtual css::uno::Reference< css::accessibility::XAccessibleContext > createAccessibleContext(VCLXButton *_pXWindow)=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessible(Menu *_pMenu, bool _bIsMenuBar)=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessibleTabBar(TabBar &_rTabBar) const=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessibleCheckBoxCell(const css::uno::Reference< css::accessibility::XAccessible > &_rxParent, vcl::IAccessibleTableProvider &_rBrowseBox, const css::uno::Reference< css::awt::XWindow > &_xFocusWindow, sal_Int32 _nRowPos, sal_uInt16 _nColPos, const TriState &_eState, bool _bIsTriState) const=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessibleBrowseBoxTableCell(const css::uno::Reference< css::accessibility::XAccessible > &_rxParent, vcl::IAccessibleTableProvider &_rBrowseBox, const css::uno::Reference< css::awt::XWindow > &_xFocusWindow, sal_Int32 _nRowId, sal_uInt16 _nColId, sal_Int32 _nOffset) const=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessibleBrowseBoxHeaderCell(sal_Int32 _nColumnRowId, const css::uno::Reference< css::accessibility::XAccessible > &rxParent, vcl::IAccessibleTableProvider &_rBrowseBox, const css::uno::Reference< css::awt::XWindow > &_xFocusWindow, AccessibleBrowseBoxObjType _eObjType) const=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessibleIconView(SvTreeListBox &_rListBox, const css::uno::Reference< css::accessibility::XAccessible > &_xParent) const=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessibleBrowseBoxHeaderBar(const css::uno::Reference< css::accessibility::XAccessible > &rxParent, vcl::IAccessibleTableProvider &_rOwningTable, AccessibleBrowseBoxObjType _eObjType) const=0
virtual vcl::IAccessibleBrowseBox * createAccessibleBrowseBox(const css::uno::Reference< css::accessibility::XAccessible > &_rxParent, vcl::IAccessibleTableProvider &_rBrowseBox) const=0
virtual css::uno::Reference< css::accessibility::XAccessibleContext > createAccessibleTextWindowContext(VCLXWindow *pVclXWindow, TextEngine &rEngine, TextView &rView) const=0
virtual css::uno::Reference< css::accessibility::XAccessible > createEditBrowseBoxTableCellAccess(const css::uno::Reference< css::accessibility::XAccessible > &_rxParent, const css::uno::Reference< css::accessibility::XAccessible > &_rxControlAccessible, const css::uno::Reference< css::awt::XWindow > &_rxFocusWindow, vcl::IAccessibleTableProvider &_rBrowseBox, sal_Int32 _nRowPos, sal_uInt16 _nColPos) const=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessibleIconChoiceCtrl(SvtIconChoiceCtrl &_rIconCtrl, const css::uno::Reference< css::accessibility::XAccessible > &_xParent) const=0
virtual vcl::IAccessibleTabListBox * createAccessibleTabListBox(const css::uno::Reference< css::accessibility::XAccessible > &rxParent, SvHeaderTabListBox &rBox) const=0
virtual table::IAccessibleTableControl * createAccessibleTableControl(const css::uno::Reference< css::accessibility::XAccessible > &_rxParent, table::IAccessibleTable &_rTable) const=0
virtual css::uno::Reference< css::accessibility::XAccessible > createAccessibleTreeListBox(SvTreeListBox &_rListBox, const css::uno::Reference< css::accessibility::XAccessible > &_xParent) const=0
vcl::Window * GetAccessibleChildWindow(sal_uInt16 n)
WindowType GetType() const
TriState
QPRO_FUNC_TYPE nType
WinBits const WB_DROPDOWN
WindowType