29 #include <com/sun/star/accessibility/XAccessible.hpp>
30 #include <com/sun/star/accessibility/AccessibleRole.hpp>
31 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
32 #include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
33 #include <com/sun/star/awt/XWindowPeer.hpp>
70 return css::uno::Reference< css::accessibility::XAccessible >();
79 css::uno::Reference< css::accessibility::XAccessible > xAcc(
GetComponentInterface(), css::uno::UNO_QUERY );
122 if(
GetType() == WindowType::MENUBARWINDOW )
126 while( pWorkWin && (pWorkWin ==
this) )
132 else if(
GetType() == WindowType::FLOATINGWINDOW &&
149 sal_uInt16 nChildren = 0;
159 if(
GetType() == WindowType::BORDERWINDOW )
167 else if(
GetType() == WindowType::WORKWINDOW )
183 if(
GetType() == WindowType::WORKWINDOW && static_cast<WorkWindow *>(
this)->GetMenuBar() )
196 sal_uInt16 nChildren = n;
209 if(
GetType() == WindowType::BORDERWINDOW && pChild && pChild->
GetType() == WindowType::MENUBARWINDOW )
212 SAL_WARN_IF( !pChild,
"vcl",
"GetAccessibleChildWindow(): wrong index in border window");
215 if ( pChild && ( pChild->
GetType() == WindowType::BORDERWINDOW ) && ( pChild->
GetChildCount() == 1 ) )
227 SAL_WARN_IF(
mpWindowImpl->mpAccessibleInfos->nAccessibleRole != 0xFFFF,
"vcl",
"AccessibleRole already set!" );
228 mpWindowImpl->mpAccessibleInfos->nAccessibleRole = nRole;
233 sal_uInt16 nRole = 0xFFFF;
236 case WindowType::MESSBOX:
237 case WindowType::INFOBOX:
238 case WindowType::WARNINGBOX:
239 case WindowType::ERRORBOX:
240 case WindowType::QUERYBOX: nRole = accessibility::AccessibleRole::ALERT;
break;
242 case WindowType::MODELESSDIALOG:
243 case WindowType::TABDIALOG:
244 case WindowType::BUTTONDIALOG:
245 case WindowType::DIALOG: nRole = accessibility::AccessibleRole::DIALOG;
break;
247 case WindowType::PUSHBUTTON:
248 case WindowType::OKBUTTON:
249 case WindowType::CANCELBUTTON:
250 case WindowType::HELPBUTTON:
251 case WindowType::IMAGEBUTTON:
252 case WindowType::MOREBUTTON: nRole = accessibility::AccessibleRole::PUSH_BUTTON;
break;
253 case WindowType::MENUBUTTON: nRole = accessibility::AccessibleRole::BUTTON_MENU;
break;
255 case WindowType::RADIOBUTTON: nRole = accessibility::AccessibleRole::RADIO_BUTTON;
break;
256 case WindowType::TRISTATEBOX:
257 case WindowType::CHECKBOX: nRole = accessibility::AccessibleRole::CHECK_BOX;
break;
259 case WindowType::MULTILINEEDIT: nRole = accessibility::AccessibleRole::SCROLL_PANE;
break;
261 case WindowType::PATTERNFIELD:
262 case WindowType::EDIT: nRole =
static_cast<Edit const *
>(
this)->IsPassword() ? accessibility::AccessibleRole::PASSWORD_TEXT : accessibility::AccessibleRole::TEXT;
break;
264 case WindowType::PATTERNBOX:
265 case WindowType::NUMERICBOX:
266 case WindowType::METRICBOX:
267 case WindowType::CURRENCYBOX:
268 case WindowType::LONGCURRENCYBOX:
269 case WindowType::COMBOBOX: nRole = accessibility::AccessibleRole::COMBO_BOX;
break;
271 case WindowType::LISTBOX:
272 case WindowType::MULTILISTBOX: nRole = accessibility::AccessibleRole::LIST;
break;
274 case WindowType::TREELISTBOX: nRole = accessibility::AccessibleRole::TREE;
break;
276 case WindowType::FIXEDTEXT: nRole = accessibility::AccessibleRole::LABEL;
break;
277 case WindowType::FIXEDLINE:
279 nRole = accessibility::AccessibleRole::LABEL;
281 nRole = accessibility::AccessibleRole::SEPARATOR;
284 case WindowType::FIXEDBITMAP:
285 case WindowType::FIXEDIMAGE: nRole = accessibility::AccessibleRole::ICON;
break;
286 case WindowType::GROUPBOX: nRole = accessibility::AccessibleRole::GROUP_BOX;
break;
287 case WindowType::SCROLLBAR: nRole = accessibility::AccessibleRole::SCROLL_BAR;
break;
289 case WindowType::SLIDER:
290 case WindowType::SPLITTER:
291 case WindowType::SPLITWINDOW: nRole = accessibility::AccessibleRole::SPLIT_PANE;
break;
293 case WindowType::DATEBOX:
294 case WindowType::TIMEBOX:
295 case WindowType::DATEFIELD:
296 case WindowType::TIMEFIELD: nRole = accessibility::AccessibleRole::DATE_EDITOR;
break;
298 case WindowType::METRICFIELD:
299 case WindowType::CURRENCYFIELD:
300 case WindowType::SPINBUTTON:
301 case WindowType::SPINFIELD:
302 case WindowType::FORMATTEDFIELD: nRole = accessibility::AccessibleRole::SPIN_BOX;
break;
304 case WindowType::TOOLBOX: nRole = accessibility::AccessibleRole::TOOL_BAR;
break;
305 case WindowType::STATUSBAR: nRole = accessibility::AccessibleRole::STATUS_BAR;
break;
307 case WindowType::TABPAGE: nRole = accessibility::AccessibleRole::PANEL;
break;
308 case WindowType::TABCONTROL: nRole = accessibility::AccessibleRole::PAGE_TAB_LIST;
break;
310 case WindowType::DOCKINGWINDOW: nRole = (
mpWindowImpl->mbFrame) ? accessibility::AccessibleRole::FRAME :
311 accessibility::AccessibleRole::PANEL;
break;
313 case WindowType::FLOATINGWINDOW: nRole = (
mpWindowImpl->mbFrame ||
316 accessibility::AccessibleRole::WINDOW;
break;
318 case WindowType::WORKWINDOW: nRole = accessibility::AccessibleRole::ROOT_PANE;
break;
320 case WindowType::SCROLLBARBOX: nRole = accessibility::AccessibleRole::FILLER;
break;
322 case WindowType::HELPTEXTWINDOW: nRole = accessibility::AccessibleRole::TOOL_TIP;
break;
324 case WindowType::RULER: nRole = accessibility::AccessibleRole::RULER;
break;
326 case WindowType::SCROLLWINDOW: nRole = accessibility::AccessibleRole::SCROLL_PANE;
break;
328 case WindowType::WINDOW:
329 case WindowType::CONTROL:
330 case WindowType::BORDERWINDOW:
331 case WindowType::SYSTEMCHILDWINDOW:
334 nRole = accessibility::AccessibleRole::FRAME;
336 nRole = accessibility::AccessibleRole::SCROLL_PANE;
338 nRole = accessibility::AccessibleRole::WINDOW;
343 nRole = accessibility::AccessibleRole::PANEL;
354 if ( nRole == 0xFFFF )
366 mpWindowImpl->mpAccessibleInfos->pAccessibleName = rName;
377 return *
mpWindowImpl->mpAccessibleInfos->pAccessibleName;
383 OUString aAccessibleName;
386 case WindowType::MULTILINEEDIT:
387 case WindowType::PATTERNFIELD:
388 case WindowType::METRICFIELD:
389 case WindowType::CURRENCYFIELD:
390 case WindowType::EDIT:
392 case WindowType::DATEBOX:
393 case WindowType::TIMEBOX:
394 case WindowType::CURRENCYBOX:
395 case WindowType::LONGCURRENCYBOX:
396 case WindowType::DATEFIELD:
397 case WindowType::TIMEFIELD:
398 case WindowType::SPINFIELD:
399 case WindowType::FORMATTEDFIELD:
401 case WindowType::COMBOBOX:
402 case WindowType::LISTBOX:
403 case WindowType::MULTILISTBOX:
404 case WindowType::TREELISTBOX:
405 case WindowType::METRICBOX:
408 if ( pLabel && pLabel !=
this )
409 aAccessibleName = pLabel->
GetText();
410 if (aAccessibleName.isEmpty())
412 if (aAccessibleName.isEmpty())
417 case WindowType::IMAGEBUTTON:
418 case WindowType::PUSHBUTTON:
420 if (aAccessibleName.isEmpty())
423 if (aAccessibleName.isEmpty())
428 case WindowType::TOOLBOX:
432 case WindowType::MOREBUTTON:
449 std::optional<OUString>& rCurrentDescription =
mpWindowImpl->mpAccessibleInfos->pAccessibleDescription;
450 SAL_WARN_IF( rCurrentDescription && *rCurrentDescription != rDescription,
"vcl",
"AccessibleDescription already set" );
451 rCurrentDescription = rDescription;
459 OUString aAccessibleDescription;
462 aAccessibleDescription = *
mpWindowImpl->mpAccessibleInfos->pAccessibleDescription;
469 if ( pWin->
GetType() == WindowType::HELPTEXTWINDOW )
475 return aAccessibleDescription;
482 mpWindowImpl->mpAccessibleInfos->pLabeledByWindow = pLabeledBy;
489 mpWindowImpl->mpAccessibleInfos->pLabelForWindow = pLabelFor;
503 return mpWindowImpl->mpAccessibleInfos->pLabelForWindow;
524 return mpWindowImpl->mpAccessibleInfos->pLabeledByWindow;
527 if (!aMnemonicLabels.empty())
530 for (
auto const & rCandidate : aMnemonicLabels)
532 if (rCandidate->IsVisible())
535 return aMnemonicLabels[0];
546 if( !bTraverseParentPath )
553 if( pParent->
mpWindowImpl->mbSuppressAccessibilityEvents )
564 mpWindowImpl->mbSuppressAccessibilityEvents = bSuppressed;
569 uno::Reference<accessibility::XAccessibleEditableText>
573 return uno::Reference<accessibility::XAccessibleEditableText>();
575 uno::Reference<accessibility::XAccessibleStateSet> xState = xContext->getAccessibleStateSet();
578 if (xState->contains(accessibility::AccessibleStateType::FOCUSED))
580 uno::Reference<accessibility::XAccessibleEditableText> xText(xContext, uno::UNO_QUERY);
583 if (xState->contains(accessibility::AccessibleStateType::MANAGES_DESCENDANTS))
584 return uno::Reference<accessibility::XAccessibleEditableText>();
588 bool bSafeToIterate =
true;
589 sal_Int32
nCount = xContext->getAccessibleChildCount();
591 bSafeToIterate =
false;
593 return uno::Reference<accessibility::XAccessibleEditableText>();
595 for (sal_Int32
i = 0;
i < xContext->getAccessibleChildCount(); ++
i)
597 uno::Reference<accessibility::XAccessible> xChild = xContext->getAccessibleChild(
i);
600 uno::Reference<accessibility::XAccessibleContext> xChildContext
601 = xChild->getAccessibleContext();
602 if (!xChildContext.is())
604 uno::Reference<accessibility::XAccessibleEditableText> xText
609 return uno::Reference<accessibility::XAccessibleEditableText>();
vcl::Window * ImplGetWindow() const
if this is a proxy return the client, otherwise itself
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationMemberOf() const
void SetAccessibilityEventsSuppressed(bool bSuppressed)
vcl::Window * GetAccessibleParentWindow() const
SAL_DLLPRIVATE bool ImplIsAccessibleCandidate() const
VclPtr< vcl::Window > pLabeledByWindow
const OUString & GetHelpText() const
const OUString & GetQuickHelpText() const
const std::vector< VclPtr< FixedText > > & list_mnemonic_labels() const
void SetAccessibleName(const OUString &rName)
void SetAccessibleRelationLabelFor(vcl::Window *pLabelFor)
sal_uInt16 GetAccessibleChildWindowCount()
OUString GetAccessibleDescription() const
OUString GetAccessibleName() const
WinBits const WB_OWNERDRAWDECORATION
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible()
virtual css::uno::Reference< css::awt::XWindowPeer > GetComponentInterface(bool bCreate=true)
sal_uInt16 nAccessibleRole
css::uno::Reference< css::accessibility::XAccessible > GetAccessible(bool bCreate=true)
virtual OUString GetText() const
void SetAccessible(const css::uno::Reference< css::accessibility::XAccessible > &)
vcl::Window * GetAccessibleChildWindow(sal_uInt16 n)
bool isContainerWindow(const vcl::Window &rWindow)
uno::Reference< accessibility::XAccessibleEditableText > FindFocusedEditableText(uno::Reference< accessibility::XAccessibleContext > const &xContext)
bool IsAccessibilityEventsSuppressed(bool bTraverseParentPath=true)
virtual vcl::Window * getAccessibleRelationLabelFor() const
void SetAccessibleRelationLabeledBy(vcl::Window *pLabeledBy)
VclPtr< vcl::Window > mpMenuBarWindow
bool IsMenuFloatingWindow() const
std::unique_ptr< WindowImpl > mpWindowImpl
virtual sal_uInt16 getDefaultAccessibleRole() const
vcl::Window * GetParent() const
vcl::Window * GetAccessibleRelationMemberOf() const
VclPtr< vcl::Window > pLabelForWindow
WinBits const WB_SIZEABLE
sal_uInt16 GetChildCount() const
vcl::Window * GetAccessibleRelationLabelFor() const
SAL_DLLPRIVATE bool ImplIsAccessibleNativeFrame() const
#define SAL_WARN_IF(condition, area, stream)
MenuBar * GetMenuBar() const
void SetAccessibleDescription(const OUString &rDescr)
virtual OUString getDefaultAccessibleName() const
WindowType GetType() const
WinBits const WB_MOVEABLE
void SetAccessibleRole(sal_uInt16 nRole)
sal_uInt16 GetAccessibleRole() const
void CallEventListeners(VclEventId nEvent, void *pData=nullptr)
vcl::Window * GetAccessibleRelationLabeledBy() const
static OUString GetNonMnemonicString(const OUString &rStr, sal_Int32 &rMnemonicPos)
bool IsScrollable() const
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationLabeledBy() const
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationLabelFor() const
vcl::Window * GetChild(sal_uInt16 nChild) const