LibreOffice Module vcl (master)  1
accessibility.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 <vcl/layout.hxx>
21 #include <vcl/toolkit/fixed.hxx>
22 #include <vcl/window.hxx>
23 #include <vcl/menu.hxx>
24 #include <vcl/wrkwin.hxx>
25 
26 #include <window.h>
27 #include <brdwin.hxx>
28 
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>
34 
35 #include <sal/log.hxx>
36 
37 using namespace ::com::sun::star::uno;
38 using namespace ::com::sun::star::lang;
40 using namespace ::com::sun::star::datatransfer::dnd;
41 using namespace ::com::sun::star;
42 
43 
45 {
46  nAccessibleRole = 0xFFFF;
47  pLabeledByWindow = nullptr;
48  pLabelForWindow = nullptr;
49  pMemberOfWindow = nullptr;
50 }
51 
53 {
54 }
55 
56 namespace vcl {
57 
58 css::uno::Reference< css::accessibility::XAccessible > Window::GetAccessible( bool bCreate )
59 {
60  // do not optimize hierarchy for the top level border win (ie, when there is no parent)
61  /* // do not optimize accessible hierarchy at all to better reflect real VCL hierarchy
62  if ( GetParent() && ( GetType() == WindowType::BORDERWINDOW ) && ( GetChildCount() == 1 ) )
63  //if( !ImplIsAccessibleCandidate() )
64  {
65  vcl::Window* pChild = GetAccessibleChildWindow( 0 );
66  if ( pChild )
67  return pChild->GetAccessible();
68  }
69  */
70  if ( !mpWindowImpl )
71  return css::uno::Reference< css::accessibility::XAccessible >();
72  if ( !mpWindowImpl->mxAccessible.is() && bCreate )
73  mpWindowImpl->mxAccessible = CreateAccessible();
74 
75  return mpWindowImpl->mxAccessible;
76 }
77 
78 css::uno::Reference< css::accessibility::XAccessible > Window::CreateAccessible()
79 {
80  css::uno::Reference< css::accessibility::XAccessible > xAcc( GetComponentInterface(), css::uno::UNO_QUERY );
81  return xAcc;
82 }
83 
84 void Window::SetAccessible( const css::uno::Reference< css::accessibility::XAccessible >& x )
85 {
86  if (!mpWindowImpl)
87  return;
88 
89  mpWindowImpl->mxAccessible = x;
90 }
91 
92 // skip all border windows that are not top level frames
94 {
95  if( !mpWindowImpl->mbBorderWin )
96  return true;
97  else
98  // #101741 do not check for WB_CLOSEABLE because undecorated floaters (like menus!) are closeable
99  if( mpWindowImpl->mbFrame && mpWindowImpl->mnStyle & (WB_MOVEABLE | WB_SIZEABLE) )
100  return true;
101  else
102  return false;
103 }
104 
106 {
107  if( mpWindowImpl->mbFrame )
108  // #101741 do not check for WB_CLOSEABLE because undecorated floaters (like menus!) are closeable
109  if( mpWindowImpl->mnStyle & (WB_MOVEABLE | WB_SIZEABLE) )
110  return true;
111  else
112  return false;
113  else
114  return false;
115 }
116 
118 {
120  return nullptr;
121 
122  vcl::Window* pParent = mpWindowImpl->mpParent;
123  if( GetType() == WindowType::MENUBARWINDOW )
124  {
125  // report the menubar as a child of THE workwindow
126  vcl::Window *pWorkWin = GetParent()->mpWindowImpl->mpFirstChild;
127  while( pWorkWin && (pWorkWin == this) )
128  pWorkWin = pWorkWin->mpWindowImpl->mpNext;
129  pParent = pWorkWin;
130  }
131  // If this is a floating window which has a native border window, then that border should be reported as
132  // the accessible parent
133  else if( GetType() == WindowType::FLOATINGWINDOW &&
134  mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame )
135  {
136  pParent = mpWindowImpl->mpBorderWindow;
137  }
138  else if( pParent && !pParent->ImplIsAccessibleCandidate() )
139  {
140  pParent = pParent->mpWindowImpl->mpParent;
141  }
142  return pParent;
143 }
144 
146 {
147  if (!mpWindowImpl)
148  return 0;
149 
150  sal_uInt16 nChildren = 0;
151  vcl::Window* pChild = mpWindowImpl->mpFirstChild;
152  while( pChild )
153  {
154  if( pChild->IsVisible() )
155  nChildren++;
156  pChild = pChild->mpWindowImpl->mpNext;
157  }
158 
159  // report the menubarwindow as a child of THE workwindow
160  if( GetType() == WindowType::BORDERWINDOW )
161  {
162  ImplBorderWindow *pBorderWindow = static_cast<ImplBorderWindow*>(this);
163  if( pBorderWindow->mpMenuBarWindow &&
164  pBorderWindow->mpMenuBarWindow->IsVisible()
165  )
166  --nChildren;
167  }
168  else if( GetType() == WindowType::WORKWINDOW )
169  {
170  WorkWindow *pWorkWindow = static_cast<WorkWindow*>(this);
171  if( pWorkWindow->GetMenuBar() &&
172  pWorkWindow->GetMenuBar()->GetWindow() &&
173  pWorkWindow->GetMenuBar()->GetWindow()->IsVisible()
174  )
175  ++nChildren;
176  }
177 
178  return nChildren;
179 }
180 
182 {
183  // report the menubarwindow as the first child of THE workwindow
184  if( GetType() == WindowType::WORKWINDOW && static_cast<WorkWindow *>(this)->GetMenuBar() )
185  {
186  if( n == 0 )
187  {
188  MenuBar *pMenuBar = static_cast<WorkWindow *>(this)->GetMenuBar();
189  if( pMenuBar->GetWindow() && pMenuBar->GetWindow()->IsVisible() )
190  return pMenuBar->GetWindow();
191  }
192  else
193  --n;
194  }
195 
196  // transform n to child number including invisible children
197  sal_uInt16 nChildren = n;
198  vcl::Window* pChild = mpWindowImpl->mpFirstChild;
199  while( pChild )
200  {
201  if( pChild->IsVisible() )
202  {
203  if( ! nChildren )
204  break;
205  nChildren--;
206  }
207  pChild = pChild->mpWindowImpl->mpNext;
208  }
209 
210  if( GetType() == WindowType::BORDERWINDOW && pChild && pChild->GetType() == WindowType::MENUBARWINDOW )
211  {
212  do pChild = pChild->mpWindowImpl->mpNext; while( pChild && ! pChild->IsVisible() );
213  SAL_WARN_IF( !pChild, "vcl", "GetAccessibleChildWindow(): wrong index in border window");
214  }
215 
216  if ( pChild && ( pChild->GetType() == WindowType::BORDERWINDOW ) && ( pChild->GetChildCount() == 1 ) )
217  {
218  pChild = pChild->GetChild( 0 );
219  }
220  return pChild;
221 }
222 
223 void Window::SetAccessibleRole( sal_uInt16 nRole )
224 {
225  if ( !mpWindowImpl->mpAccessibleInfos )
226  mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
227 
228  SAL_WARN_IF( mpWindowImpl->mpAccessibleInfos->nAccessibleRole != 0xFFFF, "vcl", "AccessibleRole already set!" );
229  mpWindowImpl->mpAccessibleInfos->nAccessibleRole = nRole;
230 }
231 
233 {
234  sal_uInt16 nRole = 0xFFFF;
235  switch ( GetType() )
236  {
237  case WindowType::MESSBOX: // MT: Would be nice to have special roles!
238  case WindowType::INFOBOX:
239  case WindowType::WARNINGBOX:
240  case WindowType::ERRORBOX:
241  case WindowType::QUERYBOX: nRole = accessibility::AccessibleRole::ALERT; break;
242 
243  case WindowType::MODELESSDIALOG:
244  case WindowType::TABDIALOG:
245  case WindowType::BUTTONDIALOG:
246  case WindowType::DIALOG: nRole = accessibility::AccessibleRole::DIALOG; break;
247 
248  case WindowType::PUSHBUTTON:
249  case WindowType::OKBUTTON:
250  case WindowType::CANCELBUTTON:
251  case WindowType::HELPBUTTON:
252  case WindowType::IMAGEBUTTON:
253  case WindowType::MOREBUTTON:
254  case WindowType::SPINBUTTON: nRole = accessibility::AccessibleRole::PUSH_BUTTON; break;
255  case WindowType::MENUBUTTON: nRole = accessibility::AccessibleRole::BUTTON_MENU; break;
256 
257  case WindowType::RADIOBUTTON: nRole = accessibility::AccessibleRole::RADIO_BUTTON; break;
258  case WindowType::TRISTATEBOX:
259  case WindowType::CHECKBOX: nRole = accessibility::AccessibleRole::CHECK_BOX; break;
260 
261  case WindowType::MULTILINEEDIT: nRole = accessibility::AccessibleRole::SCROLL_PANE; break;
262 
263  case WindowType::PATTERNFIELD:
264  case WindowType::EDIT: nRole = static_cast<Edit const *>(this)->IsPassword() ? accessibility::AccessibleRole::PASSWORD_TEXT : accessibility::AccessibleRole::TEXT; break;
265 
266  case WindowType::PATTERNBOX:
267  case WindowType::NUMERICBOX:
268  case WindowType::METRICBOX:
269  case WindowType::CURRENCYBOX:
270  case WindowType::LONGCURRENCYBOX:
271  case WindowType::COMBOBOX: nRole = accessibility::AccessibleRole::COMBO_BOX; break;
272 
273  case WindowType::LISTBOX:
274  case WindowType::MULTILISTBOX: nRole = accessibility::AccessibleRole::LIST; break;
275 
276  case WindowType::TREELISTBOX: nRole = accessibility::AccessibleRole::TREE; break;
277 
278  case WindowType::FIXEDTEXT: nRole = accessibility::AccessibleRole::LABEL; break;
279  case WindowType::FIXEDLINE:
280  if( !GetText().isEmpty() )
281  nRole = accessibility::AccessibleRole::LABEL;
282  else
283  nRole = accessibility::AccessibleRole::SEPARATOR;
284  break;
285 
286  case WindowType::FIXEDBITMAP:
287  case WindowType::FIXEDIMAGE: nRole = accessibility::AccessibleRole::ICON; break;
288  case WindowType::GROUPBOX: nRole = accessibility::AccessibleRole::GROUP_BOX; break;
289  case WindowType::SCROLLBAR: nRole = accessibility::AccessibleRole::SCROLL_BAR; break;
290 
291  case WindowType::SLIDER:
292  case WindowType::SPLITTER:
293  case WindowType::SPLITWINDOW: nRole = accessibility::AccessibleRole::SPLIT_PANE; break;
294 
295  case WindowType::DATEBOX:
296  case WindowType::TIMEBOX:
297  case WindowType::DATEFIELD:
298  case WindowType::TIMEFIELD: nRole = accessibility::AccessibleRole::DATE_EDITOR; break;
299 
300  case WindowType::METRICFIELD:
301  case WindowType::CURRENCYFIELD:
302  case WindowType::SPINFIELD:
303  case WindowType::FORMATTEDFIELD: nRole = accessibility::AccessibleRole::SPIN_BOX; break;
304 
305  case WindowType::TOOLBOX: nRole = accessibility::AccessibleRole::TOOL_BAR; break;
306  case WindowType::STATUSBAR: nRole = accessibility::AccessibleRole::STATUS_BAR; break;
307 
308  case WindowType::TABPAGE: nRole = accessibility::AccessibleRole::PANEL; break;
309  case WindowType::TABCONTROL: nRole = accessibility::AccessibleRole::PAGE_TAB_LIST; break;
310 
311  case WindowType::DOCKINGWINDOW: nRole = (mpWindowImpl->mbFrame) ? accessibility::AccessibleRole::FRAME :
312  accessibility::AccessibleRole::PANEL; break;
313 
314  case WindowType::FLOATINGWINDOW: nRole = ( mpWindowImpl->mbFrame ||
315  (mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame) ||
316  (GetStyle() & WB_OWNERDRAWDECORATION) ) ? accessibility::AccessibleRole::FRAME :
317  accessibility::AccessibleRole::WINDOW; break;
318 
319  case WindowType::WORKWINDOW: nRole = accessibility::AccessibleRole::ROOT_PANE; break;
320 
321  case WindowType::SCROLLBARBOX: nRole = accessibility::AccessibleRole::FILLER; break;
322 
323  case WindowType::HELPTEXTWINDOW: nRole = accessibility::AccessibleRole::TOOL_TIP; break;
324 
325  case WindowType::RULER: nRole = accessibility::AccessibleRole::RULER; break;
326 
327  case WindowType::SCROLLWINDOW: nRole = accessibility::AccessibleRole::SCROLL_PANE; break;
328 
329  case WindowType::WINDOW:
330  case WindowType::CONTROL:
331  case WindowType::BORDERWINDOW:
332  case WindowType::SYSTEMCHILDWINDOW:
333  default:
335  nRole = accessibility::AccessibleRole::FRAME;
336  else if( IsScrollable() )
337  nRole = accessibility::AccessibleRole::SCROLL_PANE;
338  else if( this->ImplGetWindow()->IsMenuFloatingWindow() )
339  nRole = accessibility::AccessibleRole::WINDOW; // #106002#, contextmenus are windows (i.e. toplevel)
340  else
341  // #104051# WINDOW seems to be a bad default role, use LAYEREDPANE instead
342  // a WINDOW is interpreted as a top-level window, which is typically not the case
343  //nRole = accessibility::AccessibleRole::WINDOW;
344  nRole = accessibility::AccessibleRole::PANEL;
345  }
346  return nRole;
347 }
348 
349 sal_uInt16 Window::GetAccessibleRole() const
350 {
351  if (!mpWindowImpl)
352  return 0;
353 
354  sal_uInt16 nRole = mpWindowImpl->mpAccessibleInfos ? mpWindowImpl->mpAccessibleInfos->nAccessibleRole : 0xFFFF;
355  if ( nRole == 0xFFFF )
356  nRole = getDefaultAccessibleRole();
357  return nRole;
358 }
359 
360 void Window::SetAccessibleName( const OUString& rName )
361 {
362  if ( !mpWindowImpl->mpAccessibleInfos )
363  mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
364 
365  OUString oldName = GetAccessibleName();
366 
367  mpWindowImpl->mpAccessibleInfos->pAccessibleName = rName;
368 
370 }
371 
373 {
374  if (!mpWindowImpl)
375  return OUString();
376 
377  if (mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pAccessibleName)
378  return *mpWindowImpl->mpAccessibleInfos->pAccessibleName;
379  return getDefaultAccessibleName();
380 }
381 
383 {
384  OUString aAccessibleName;
385  switch ( GetType() )
386  {
387  case WindowType::MULTILINEEDIT:
388  case WindowType::PATTERNFIELD:
389  case WindowType::METRICFIELD:
390  case WindowType::CURRENCYFIELD:
391  case WindowType::EDIT:
392 
393  case WindowType::DATEBOX:
394  case WindowType::TIMEBOX:
395  case WindowType::CURRENCYBOX:
396  case WindowType::LONGCURRENCYBOX:
397  case WindowType::DATEFIELD:
398  case WindowType::TIMEFIELD:
399  case WindowType::SPINFIELD:
400  case WindowType::FORMATTEDFIELD:
401 
402  case WindowType::COMBOBOX:
403  case WindowType::LISTBOX:
404  case WindowType::MULTILISTBOX:
405  case WindowType::TREELISTBOX:
406  case WindowType::METRICBOX:
407  {
409  if ( pLabel && pLabel != this )
410  aAccessibleName = pLabel->GetText();
411  if (aAccessibleName.isEmpty())
412  aAccessibleName = GetQuickHelpText();
413  }
414  break;
415 
416  case WindowType::IMAGEBUTTON:
417  case WindowType::PUSHBUTTON:
418  aAccessibleName = GetText();
419  if (aAccessibleName.isEmpty())
420  {
421  aAccessibleName = GetQuickHelpText();
422  if (aAccessibleName.isEmpty())
423  aAccessibleName = GetHelpText();
424  }
425  break;
426 
427  case WindowType::TOOLBOX:
428  aAccessibleName = GetText();
429  break;
430 
431  case WindowType::MOREBUTTON:
432  aAccessibleName = mpWindowImpl->maText;
433  break;
434 
435  default:
436  aAccessibleName = GetText();
437  break;
438  }
439 
440  return OutputDevice::GetNonMnemonicString( aAccessibleName );
441 }
442 
443 void Window::SetAccessibleDescription( const OUString& rDescription )
444 {
445  if ( ! mpWindowImpl->mpAccessibleInfos )
446  mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
447 
448  std::optional<OUString>& rCurrentDescription = mpWindowImpl->mpAccessibleInfos->pAccessibleDescription;
449  SAL_WARN_IF( rCurrentDescription && *rCurrentDescription != rDescription, "vcl", "AccessibleDescription already set" );
450  rCurrentDescription = rDescription;
451 }
452 
454 {
455  if (!mpWindowImpl)
456  return OUString();
457 
458  OUString aAccessibleDescription;
459  if ( mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pAccessibleDescription )
460  {
461  aAccessibleDescription = *mpWindowImpl->mpAccessibleInfos->pAccessibleDescription;
462  }
463  else
464  {
465  // Special code for help text windows. ZT asks the border window for the
466  // description so we have to forward this request to our inner window.
467  const vcl::Window* pWin = this->ImplGetWindow();
468  if ( pWin->GetType() == WindowType::HELPTEXTWINDOW )
469  aAccessibleDescription = pWin->GetHelpText();
470  else
471  aAccessibleDescription = GetHelpText();
472  }
473 
474  return aAccessibleDescription;
475 }
476 
478 {
479  if ( !mpWindowImpl->mpAccessibleInfos )
480  mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
481  mpWindowImpl->mpAccessibleInfos->pLabeledByWindow = pLabeledBy;
482 }
483 
485 {
486  if ( !mpWindowImpl->mpAccessibleInfos )
487  mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
488  mpWindowImpl->mpAccessibleInfos->pLabelForWindow = pLabelFor;
489 }
490 
492 {
493  if ( !mpWindowImpl->mpAccessibleInfos )
494  mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
495  mpWindowImpl->mpAccessibleInfos->pMemberOfWindow = pMemberOfWin;
496 }
497 
499 {
500  if (mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pMemberOfWindow)
501  return mpWindowImpl->mpAccessibleInfos->pMemberOfWindow;
502 
505 
506  return nullptr;
507 }
508 
510 {
511  if (mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pLabelForWindow)
512  return mpWindowImpl->mpAccessibleInfos->pLabelForWindow;
513 
514  return nullptr;
515 }
516 
518 {
520 
521  if (pWindow)
522  return pWindow;
523 
526 
527  return nullptr;
528 }
529 
531 {
532  if (mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pLabeledByWindow)
533  return mpWindowImpl->mpAccessibleInfos->pLabeledByWindow;
534 
535  std::vector<VclPtr<FixedText> > aMnemonicLabels(list_mnemonic_labels());
536  if (!aMnemonicLabels.empty())
537  {
538  //if we have multiple labels, then prefer the first that is visible
539  for (auto const & rCandidate : aMnemonicLabels)
540  {
541  if (rCandidate->IsVisible())
542  return rCandidate;
543  }
544  return aMnemonicLabels[0];
545  }
546 
549 
550  return nullptr;
551 }
552 
553 bool Window::IsAccessibilityEventsSuppressed( bool bTraverseParentPath )
554 {
555  if( !bTraverseParentPath )
556  return mpWindowImpl->mbSuppressAccessibilityEvents;
557  else
558  {
559  vcl::Window *pParent = this;
560  while ( pParent && pParent->mpWindowImpl)
561  {
562  if( pParent->mpWindowImpl->mbSuppressAccessibilityEvents )
563  return true;
564  else
565  pParent = pParent->mpWindowImpl->mpParent; // do not use GetParent() to find borderwindows that are frames
566  }
567  return false;
568  }
569 }
570 
572 {
573  mpWindowImpl->mbSuppressAccessibilityEvents = bSuppressed;
574 }
575 
576 } /* namespace vcl */
577 
578 uno::Reference<accessibility::XAccessibleEditableText>
579 FindFocusedEditableText(uno::Reference<accessibility::XAccessibleContext> const& xContext)
580 {
581  if (!xContext.is())
582  return uno::Reference<accessibility::XAccessibleEditableText>();
583 
584  uno::Reference<accessibility::XAccessibleStateSet> xState = xContext->getAccessibleStateSet();
585  if (xState.is())
586  {
587  if (xState->contains(accessibility::AccessibleStateType::FOCUSED))
588  {
589  uno::Reference<accessibility::XAccessibleEditableText> xText(xContext, uno::UNO_QUERY);
590  if (xText.is())
591  return xText;
592  if (xState->contains(accessibility::AccessibleStateType::MANAGES_DESCENDANTS))
593  return uno::Reference<accessibility::XAccessibleEditableText>();
594  }
595  }
596 
597  bool bSafeToIterate = true;
598  sal_Int32 nCount = xContext->getAccessibleChildCount();
599  if (nCount < 0 || nCount > SAL_MAX_UINT16 /* slow enough for anyone */)
600  bSafeToIterate = false;
601  if (!bSafeToIterate)
602  return uno::Reference<accessibility::XAccessibleEditableText>();
603 
604  for (sal_Int32 i = 0; i < xContext->getAccessibleChildCount(); ++i)
605  {
606  uno::Reference<accessibility::XAccessible> xChild = xContext->getAccessibleChild(i);
607  if (!xChild.is())
608  continue;
609  uno::Reference<accessibility::XAccessibleContext> xChildContext
610  = xChild->getAccessibleContext();
611  if (!xChildContext.is())
612  continue;
613  uno::Reference<accessibility::XAccessibleEditableText> xText
614  = FindFocusedEditableText(xChildContext);
615  if (xText.is())
616  return xText;
617  }
618  return uno::Reference<accessibility::XAccessibleEditableText>();
619 }
620 
621 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
vcl::Window * ImplGetWindow() const
if this is a proxy return the client, otherwise itself
Definition: window2.cxx:829
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationMemberOf() const
void SetAccessibilityEventsSuppressed(bool bSuppressed)
vcl::Window * GetAccessibleParentWindow() const
SAL_DLLPRIVATE bool ImplIsAccessibleCandidate() const
VclPtr< vcl::Window > pLabeledByWindow
Definition: window.h:188
const OUString & GetHelpText() const
Definition: window.cxx:3079
const OUString & GetQuickHelpText() const
Definition: window2.cxx:1231
const std::vector< VclPtr< FixedText > > & list_mnemonic_labels() const
Definition: window2.cxx:1989
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)
Definition: window.cxx:3134
sal_uInt16 nAccessibleRole
Definition: window.h:183
#define SAL_MAX_UINT16
css::uno::Reference< css::accessibility::XAccessible > GetAccessible(bool bCreate=true)
int nCount
void SetAccessibleRelationMemberOf(vcl::Window *pMemberOf)
virtual OUString GetText() const
Definition: window.cxx:3044
void SetAccessible(const css::uno::Reference< css::accessibility::XAccessible > &)
Definition: edit.hxx:55
vcl::Window * GetAccessibleChildWindow(sal_uInt16 n)
bool isContainerWindow(const vcl::Window &rWindow)
Definition: layout.hxx:835
uno::Reference< accessibility::XAccessibleEditableText > FindFocusedEditableText(uno::Reference< accessibility::XAccessibleContext > const &xContext)
bool IsAccessibilityEventsSuppressed(bool bTraverseParentPath=true)
int i
virtual vcl::Window * getAccessibleRelationLabelFor() const
void SetAccessibleRelationLabeledBy(vcl::Window *pLabeledBy)
VclPtr< vcl::Window > mpMenuBarWindow
Definition: brdwin.hxx:86
bool IsMenuFloatingWindow() const
Definition: window2.cxx:1006
std::unique_ptr< WindowImpl > mpWindowImpl
Definition: window.hxx:496
virtual sal_uInt16 getDefaultAccessibleRole() const
vcl::Window * GetParent() const
Definition: window2.cxx:1096
vcl::Window * GetAccessibleRelationMemberOf() const
VclPtr< vcl::Window > pLabelForWindow
Definition: window.h:189
WinBits const WB_SIZEABLE
sal_uInt16 GetChildCount() const
Definition: stacking.cxx:1001
vcl::Window * GetAccessibleRelationLabelFor() const
SAL_DLLPRIVATE bool ImplIsAccessibleNativeFrame() const
#define SAL_WARN_IF(condition, area, stream)
MenuBar * GetMenuBar() const
Definition: syswin.hxx:184
vcl::Window * GetWindow() const
Definition: menu.hxx:384
void SetAccessibleDescription(const OUString &rDescr)
bool IsVisible() const
Definition: window2.cxx:1101
virtual OUString getDefaultAccessibleName() const
WindowType GetType() const
Definition: window2.cxx:973
WinBits GetStyle() const
Definition: window2.cxx:952
WinBits const WB_MOVEABLE
void SetAccessibleRole(sal_uInt16 nRole)
sal_uInt16 GetAccessibleRole() const
void CallEventListeners(VclEventId nEvent, void *pData=nullptr)
Definition: event.cxx:218
vcl::Window * GetAccessibleRelationLabeledBy() const
static OUString GetNonMnemonicString(const OUString &rStr, sal_Int32 &rMnemonicPos)
Definition: text.cxx:2219
VclPtr< vcl::Window > pMemberOfWindow
Definition: window.h:190
bool IsScrollable() const
Definition: window.cxx:3559
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationLabeledBy() const
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationLabelFor() const
vcl::Window * GetChild(sal_uInt16 nChild) const
Definition: stacking.cxx:1017