20#include <com/sun/star/accessibility/AccessibleRole.hpp>
21#include <com/sun/star/accessibility/AccessibleStateType.hpp>
22#include <com/sun/star/accessibility/AccessibleEventId.hpp>
23#include <com/sun/star/accessibility/AccessibleRelationType.hpp>
24#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
45VCLXAccessibleComponent::VCLXAccessibleComponent(
VCLXWindow* pVCLXWindow )
47 m_xVCLXWindow = pVCLXWindow;
50 m_xEventSource = pVCLXWindow->
GetWindow();
54 m_xEventSource->AddChildEventListener(
LINK(
this, VCLXAccessibleComponent, WindowChildEventListener ) );
61VCLXWindow* VCLXAccessibleComponent::GetVCLXWindow()
const
63 return m_xVCLXWindow.get();
66void VCLXAccessibleComponent::DisconnectEvents()
70 m_xEventSource->RemoveEventListener(
LINK(
this, VCLXAccessibleComponent, WindowEventListener ) );
71 m_xEventSource->RemoveChildEventListener(
LINK(
this, VCLXAccessibleComponent, WindowChildEventListener ) );
72 m_xEventSource.clear();
76VCLXAccessibleComponent::~VCLXAccessibleComponent()
82OUString VCLXAccessibleComponent::getImplementationName()
84 return "com.sun.star.comp.toolkit.AccessibleWindow";
87sal_Bool VCLXAccessibleComponent::supportsService(
const OUString& rServiceName )
92uno::Sequence< OUString > VCLXAccessibleComponent::getSupportedServiceNames()
94 uno::Sequence< OUString > aNames {
"com.sun.star.awt.AccessibleWindow" };
104 if ( m_xVCLXWindow.is() && (rEvent.GetId() != VclEventId::WindowEndPopupMode) )
106 DBG_ASSERT( rEvent.GetWindow(),
"Window???" );
107 if( !rEvent.GetWindow()->IsAccessibilityEventsSuppressed() || ( rEvent.GetId() == VclEventId::ObjectDying ) )
109 ProcessWindowEvent( rEvent );
116 if ( m_xVCLXWindow.is() )
118 DBG_ASSERT( rEvent.GetWindow(),
"Window???" );
119 if( !rEvent.GetWindow()->IsAccessibilityEventsSuppressed() )
122 uno::Reference< accessibility::XAccessibleContext > xHoldAlive =
this;
124 ProcessWindowChildEvent( rEvent );
129uno::Reference< accessibility::XAccessible > VCLXAccessibleComponent::GetChildAccessible(
const VclWindowEvent& rVclWindowEvent )
137 return pChildWindow->
GetAccessible( rVclWindowEvent.
GetId() == VclEventId::WindowShow );
139 return uno::Reference< accessibility::XAccessible > ();
142void VCLXAccessibleComponent::ProcessWindowChildEvent(
const VclWindowEvent& rVclWindowEvent )
145 uno::Reference< accessibility::XAccessible > xAcc;
147 switch ( rVclWindowEvent.
GetId() )
149 case VclEventId::WindowShow:
151 xAcc = GetChildAccessible( rVclWindowEvent );
155 NotifyAccessibleEvent( accessibility::AccessibleEventId::CHILD, aOldValue, aNewValue );
159 uno::Reference<XAccessibleContext> xChildContext = xAcc->getAccessibleContext();
160 if (xChildContext.is())
162 VCLXAccessibleComponent* pChildComponent =
dynamic_cast<VCLXAccessibleComponent*
>(xChildContext.get());
165 css::uno::Any aNewStateValue;
166 aNewStateValue <<= accessibility::AccessibleStateType::SHOWING;
167 pChildComponent->NotifyAccessibleEvent(accessibility::AccessibleEventId::STATE_CHANGED, css::uno::Any(), aNewStateValue);
173 case VclEventId::WindowHide:
175 xAcc = GetChildAccessible( rVclWindowEvent );
180 uno::Reference<XAccessibleContext> xChildContext = xAcc->getAccessibleContext();
181 if (xChildContext.is())
183 VCLXAccessibleComponent* pChildComponent =
dynamic_cast<VCLXAccessibleComponent*
>(xChildContext.get());
186 css::uno::Any aOldStateValue;
187 aOldStateValue <<= accessibility::AccessibleStateType::SHOWING;
188 pChildComponent->NotifyAccessibleEvent(accessibility::AccessibleEventId::STATE_CHANGED, aOldStateValue, css::uno::Any());
193 NotifyAccessibleEvent( accessibility::AccessibleEventId::CHILD, aOldValue, aNewValue );
201void VCLXAccessibleComponent::ProcessWindowEvent(
const VclWindowEvent& rVclWindowEvent )
206 assert(pAccWindow &&
"VCLXAccessibleComponent::ProcessWindowEvent - Window?");
208 switch ( rVclWindowEvent.
GetId() )
210 case VclEventId::ObjectDying:
213 m_xVCLXWindow.clear();
216 case VclEventId::WindowChildDestroyed:
219 DBG_ASSERT( pWindow,
"VclEventId::WindowChildDestroyed - Window=?" );
223 NotifyAccessibleEvent( accessibility::AccessibleEventId::CHILD, aOldValue, aNewValue );
227 case VclEventId::WindowActivate:
229 sal_Int16 aAccessibleRole = getAccessibleRole();
233 ( aAccessibleRole == accessibility::AccessibleRole::FRAME ||
234 aAccessibleRole == accessibility::AccessibleRole::ALERT ||
235 aAccessibleRole == accessibility::AccessibleRole::DIALOG ) )
237 aNewValue <<= accessibility::AccessibleStateType::ACTIVE;
238 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
242 case VclEventId::WindowDeactivate:
244 sal_Int16 aAccessibleRole = getAccessibleRole();
245 if ( aAccessibleRole == accessibility::AccessibleRole::FRAME ||
246 aAccessibleRole == accessibility::AccessibleRole::ALERT ||
247 aAccessibleRole == accessibility::AccessibleRole::DIALOG )
249 aOldValue <<= accessibility::AccessibleStateType::ACTIVE;
250 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
254 case VclEventId::WindowGetFocus:
255 case VclEventId::ControlGetFocus:
266 aNewValue <<= accessibility::AccessibleStateType::FOCUSED;
267 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
272 case VclEventId::WindowLoseFocus:
273 case VclEventId::ControlLoseFocus:
278 aOldValue <<= accessibility::AccessibleStateType::FOCUSED;
279 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
283 case VclEventId::WindowFrameTitleChanged:
285 OUString aOldName( *
static_cast<OUString*
>(rVclWindowEvent.
GetData()) );
286 OUString aNewName( getAccessibleName() );
287 aOldValue <<= aOldName;
288 aNewValue <<= aNewName;
289 NotifyAccessibleEvent( accessibility::AccessibleEventId::NAME_CHANGED, aOldValue, aNewValue );
292 case VclEventId::WindowEnabled:
294 aNewValue <<= accessibility::AccessibleStateType::ENABLED;
295 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
296 aNewValue <<= accessibility::AccessibleStateType::SENSITIVE;
297 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
300 case VclEventId::WindowDisabled:
302 aOldValue <<= accessibility::AccessibleStateType::SENSITIVE;
303 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
305 aOldValue <<= accessibility::AccessibleStateType::ENABLED;
306 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
309 case VclEventId::WindowMove:
310 case VclEventId::WindowResize:
312 NotifyAccessibleEvent( accessibility::AccessibleEventId::BOUNDRECT_CHANGED, aOldValue, aNewValue );
315 case VclEventId::WindowMenubarAdded:
320 uno::Reference< accessibility::XAccessible > xChild( pMenuBar->
GetAccessible() );
323 aNewValue <<= xChild;
324 NotifyAccessibleEvent( accessibility::AccessibleEventId::CHILD, aOldValue, aNewValue );
329 case VclEventId::WindowMenubarRemoved:
334 uno::Reference< accessibility::XAccessible > xChild( pMenuBar->
GetAccessible() );
337 aOldValue <<= xChild;
338 NotifyAccessibleEvent( accessibility::AccessibleEventId::CHILD, aOldValue, aNewValue );
343 case VclEventId::WindowMinimize:
345 aNewValue <<= accessibility::AccessibleStateType::ICONIFIED;
346 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
349 case VclEventId::WindowNormalize:
351 aOldValue <<= accessibility::AccessibleStateType::ICONIFIED;
352 NotifyAccessibleEvent( accessibility::AccessibleEventId::STATE_CHANGED, aOldValue, aNewValue );
355 case VclEventId::WindowHide:
356 case VclEventId::WindowShow:
366void VCLXAccessibleComponent::disposing()
370 OAccessibleExtendedComponentHelper::disposing();
372 m_xVCLXWindow.clear();
375vcl::Window* VCLXAccessibleComponent::GetWindow()
const
377 return GetVCLXWindow() ? GetVCLXWindow()->GetWindow()
387 vcl::Window *pLabeledBy = pWindow->GetAccessibleRelationLabeledBy();
388 if ( pLabeledBy && pLabeledBy != pWindow )
390 uno::Sequence< uno::Reference< uno::XInterface > > aSequence { pLabeledBy->
GetAccessible() };
391 rRelationSet.
AddRelation( accessibility::AccessibleRelation( accessibility::AccessibleRelationType::LABELED_BY, aSequence ) );
394 vcl::Window* pLabelFor = pWindow->GetAccessibleRelationLabelFor();
395 if ( pLabelFor && pLabelFor != pWindow )
397 uno::Sequence< uno::Reference< uno::XInterface > > aSequence { pLabelFor->
GetAccessible() };
398 rRelationSet.
AddRelation( accessibility::AccessibleRelation( accessibility::AccessibleRelationType::LABEL_FOR, aSequence ) );
401 vcl::Window* pMemberOf = pWindow->GetAccessibleRelationMemberOf();
402 if ( pMemberOf && pMemberOf != pWindow )
404 uno::Sequence< uno::Reference< uno::XInterface > > aSequence { pMemberOf->
GetAccessible() };
405 rRelationSet.
AddRelation( accessibility::AccessibleRelation( accessibility::AccessibleRelationType::MEMBER_OF, aSequence ) );
409void VCLXAccessibleComponent::FillAccessibleStateSet( sal_Int64& rStateSet )
414 if ( pWindow->IsVisible() )
416 rStateSet |= accessibility::AccessibleStateType::VISIBLE;
417 rStateSet |= accessibility::AccessibleStateType::SHOWING;
421 rStateSet |= accessibility::AccessibleStateType::INVALID;
424 if ( pWindow->IsEnabled() )
426 rStateSet |= accessibility::AccessibleStateType::ENABLED;
427 rStateSet |= accessibility::AccessibleStateType::SENSITIVE;
430 if ( pWindow->HasChildPathFocus() &&
431 ( getAccessibleRole() == accessibility::AccessibleRole::FRAME ||
432 getAccessibleRole() == accessibility::AccessibleRole::ALERT ||
433 getAccessibleRole() == accessibility::AccessibleRole::DIALOG ) )
434 rStateSet |= accessibility::AccessibleStateType::ACTIVE;
436 if ( pWindow->HasFocus() || ( pWindow->IsCompoundControl() && pWindow->HasChildPathFocus() ) )
437 rStateSet |= accessibility::AccessibleStateType::FOCUSED;
439 if ( pWindow->IsWait() )
440 rStateSet |= accessibility::AccessibleStateType::BUSY;
442 if ( pWindow->GetStyle() & WB_SIZEABLE )
443 rStateSet |= accessibility::AccessibleStateType::RESIZABLE;
446 if( ( getAccessibleRole() == accessibility::AccessibleRole::FRAME ||getAccessibleRole() == accessibility::AccessibleRole::DIALOG )&& pWindow->GetStyle() & WB_MOVEABLE )
447 rStateSet |= accessibility::AccessibleStateType::MOVEABLE;
448 if( pWindow->IsDialog() )
452 rStateSet |= accessibility::AccessibleStateType::MODAL;
456 if( pWindow && pWindow->GetType() == WindowType::COMBOBOX )
458 if( !( pWindow->GetStyle() & WB_READONLY) ||
460 rStateSet |= accessibility::AccessibleStateType::EDITABLE;
465 while( pWindow && pChild )
468 if( pWinTemp && pWinTemp->GetType() == WindowType::EDIT )
472 rStateSet |= accessibility::AccessibleStateType::EDITABLE;
475 if( pChild->GetType() == WindowType::EDIT )
479 rStateSet |= accessibility::AccessibleStateType::EDITABLE;
482 pChild = pChild->GetWindow( GetWindowType::Next );
487 rStateSet |= accessibility::AccessibleStateType::DEFUNC;
516sal_Int64 VCLXAccessibleComponent::getAccessibleChildCount()
518 OExternalLockGuard aGuard(
this );
520 sal_Int64 nChildren = 0;
522 nChildren = GetWindow()->GetAccessibleChildWindowCount();
527uno::Reference< accessibility::XAccessible > VCLXAccessibleComponent::getAccessibleChild( sal_Int64 i )
529 OExternalLockGuard aGuard(
this );
531 if ( i >= getAccessibleChildCount() )
532 throw lang::IndexOutOfBoundsException();
534 uno::Reference< accessibility::XAccessible > xAcc;
537 vcl::Window* pChild = GetWindow()->GetAccessibleChildWindow(
static_cast<sal_uInt16
>(i) );
545uno::Reference< accessibility::XAccessible > VCLXAccessibleComponent::getAccessibleParent( )
547 OExternalLockGuard aGuard(
this );
549 uno::Reference< accessibility::XAccessible > xAcc;
552 vcl::Window* pParent = GetWindow()->GetAccessibleParentWindow();
559sal_Int64 VCLXAccessibleComponent::getAccessibleIndexInParent( )
561 OExternalLockGuard aGuard(
this );
572 uno::Reference< accessibility::XAccessible > xParentAcc( pParent->
GetAccessible() );
573 if ( xParentAcc.is() )
575 uno::Reference< accessibility::XAccessibleContext > xParentContext ( xParentAcc->getAccessibleContext() );
576 if ( xParentContext.is() )
578 sal_Int64 nChildCount = xParentContext->getAccessibleChildCount();
579 for ( sal_Int64 i = 0;
i < nChildCount;
i++ )
581 uno::Reference< accessibility::XAccessible > xChild( xParentContext->getAccessibleChild(i) );
584 uno::Reference< accessibility::XAccessibleContext > xChildContext = xChild->getAccessibleContext();
585 if ( xChildContext ==
static_cast<accessibility::XAccessibleContext*
>(
this) )
599sal_Int16 VCLXAccessibleComponent::getAccessibleRole( )
601 OExternalLockGuard aGuard(
this );
606 nRole = GetWindow()->GetAccessibleRole();
611OUString VCLXAccessibleComponent::getAccessibleDescription( )
613 OExternalLockGuard aGuard(
this );
615 OUString aDescription;
618 aDescription = GetWindow()->GetAccessibleDescription();
623OUString VCLXAccessibleComponent::getAccessibleName( )
625 OExternalLockGuard aGuard(
this );
630 aName = GetWindow()->GetAccessibleName();
631#if OSL_DEBUG_LEVEL > 0
632 aName +=
" (Type = " + OUString::number(
static_cast<sal_Int32
>(GetWindow()->GetType())) +
")";
638OUString VCLXAccessibleComponent::getAccessibleId( )
640 OExternalLockGuard aGuard(
this );
645 const OUString &aWindowId = GetWindow()->get_id();
651uno::Reference< accessibility::XAccessibleRelationSet > VCLXAccessibleComponent::getAccessibleRelationSet( )
653 OExternalLockGuard aGuard(
this );
656 FillAccessibleRelationSet( *pRelationSetHelper );
657 return pRelationSetHelper;
660sal_Int64 VCLXAccessibleComponent::getAccessibleStateSet( )
662 OExternalLockGuard aGuard(
this );
664 sal_Int64 nStateSet = 0;
665 FillAccessibleStateSet( nStateSet );
669lang::Locale VCLXAccessibleComponent::getLocale()
671 OExternalLockGuard aGuard(
this );
676uno::Reference< accessibility::XAccessible > VCLXAccessibleComponent::getAccessibleAtPoint(
const awt::Point& rPoint )
678 OExternalLockGuard aGuard(
this );
680 uno::Reference< accessibility::XAccessible > xChild;
681 for ( sal_Int64 i = 0, nCount = getAccessibleChildCount();
i <
nCount; ++
i )
683 uno::Reference< accessibility::XAccessible > xAcc = getAccessibleChild( i );
686 uno::Reference< accessibility::XAccessibleComponent > xComp( xAcc->getAccessibleContext(), uno::UNO_QUERY );
704awt::Rectangle VCLXAccessibleComponent::implGetBounds()
706 awt::Rectangle aBounds ( 0, 0, 0, 0 );
713 vcl::Window* pParent = pWindow->GetAccessibleParentWindow();
718 aBounds.X -= aParentScreenLoc.X;
719 aBounds.Y -= aParentScreenLoc.Y;
726awt::Point VCLXAccessibleComponent::getLocationOnScreen( )
728 OExternalLockGuard aGuard(
this );
734 aPos.X = aRect.
Left();
735 aPos.Y = aRect.
Top();
741void VCLXAccessibleComponent::grabFocus( )
743 OExternalLockGuard aGuard(
this );
745 sal_Int64 nStates = getAccessibleStateSet();
746 if ( m_xVCLXWindow.is() && ( nStates & accessibility::AccessibleStateType::FOCUSABLE ) )
747 m_xVCLXWindow->setFocus();
750sal_Int32 SAL_CALL VCLXAccessibleComponent::getForeground( )
752 OExternalLockGuard aGuard(
this );
758 if ( pWindow->IsControlForeground() )
759 nColor = pWindow->GetControlForeground();
763 if ( pWindow->IsControlFont() )
764 aFont = pWindow->GetControlFont();
766 aFont = pWindow->GetFont();
769 if ( nColor == COL_AUTO)
770 nColor = pWindow->GetTextColor();
774 return sal_Int32(nColor);
777sal_Int32 SAL_CALL VCLXAccessibleComponent::getBackground( )
779 OExternalLockGuard aGuard(
this );
785 if ( pWindow->IsControlBackground() )
786 nColor = pWindow->GetControlBackground();
788 nColor = pWindow->GetBackground().GetColor();
791 return sal_Int32(nColor);
796uno::Reference< awt::XFont > SAL_CALL VCLXAccessibleComponent::getFont( )
798 OExternalLockGuard aGuard(
this );
800 uno::Reference< awt::XFont > xFont;
804 uno::Reference< awt::XDevice > xDev( pWindow->GetComponentInterface(), uno::UNO_QUERY );
808 if ( pWindow->IsControlFont() )
809 aFont = pWindow->GetControlFont();
811 aFont = pWindow->GetFont();
813 pVCLXFont->Init( *xDev, aFont );
821OUString SAL_CALL VCLXAccessibleComponent::getTitledBorderText( )
823 OExternalLockGuard aGuard(
this );
827 sRet = GetWindow()->GetText();
832OUString SAL_CALL VCLXAccessibleComponent::getToolTipText( )
834 OExternalLockGuard aGuard(
this );
838 sRet = GetWindow()->GetQuickHelpText();
const LanguageTag & GetLanguageTag() const
static const AllSettings & GetSettings()
const css::lang::Locale & getLocale(bool bResolveSystem=true) const
vcl::Window * GetWindow() const
reference_type * get() const
vcl::Window * GetWindow() const
void AddRelation(const css::accessibility::AccessibleRelation &rRelation)
const Color & GetColor() const
tools::Rectangle GetWindowExtentsAbsolute() const
bool HasActiveChildFrame() const
bool HasChildPathFocus(bool bSystemWindow=false) const
bool IsCompoundControl() const
vcl::Window * GetAccessibleParentWindow() const
void AddEventListener(const Link< VclWindowEvent &, void > &rEventListener)
css::uno::Reference< css::accessibility::XAccessible > GetAccessible(bool bCreate=true)
css::awt::Point AWTPoint(const ::Point &rVCLPoint)
css::awt::Rectangle AWTRectangle(const ::tools::Rectangle &rVCLRect)
inline ::tools::Rectangle VCLRectangle(const css::awt::Rectangle &rAWTRect)
inline ::Point VCLPoint(const css::awt::Point &rAWTPoint)
#define DBG_ASSERT(sCon, aError)
constexpr OUStringLiteral IsReadOnly(u"IsReadOnly")
#define LINK(Instance, Class, Member)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
IMPL_LINK(VCLXAccessibleComponent, WindowEventListener, VclWindowEvent &, rEvent, void)
WinBits const WB_READONLY