5#include <QtGui/qtguiglobal.h>
6#if QT_CONFIG(accessibility)
8#include "qwindowsuiaselectionitemprovider.h"
9#include "qwindowsuiamainprovider.h"
10#include "qwindowsuiautils.h"
11#include "qwindowscontext.h"
13#include <QtGui/qaccessible.h>
14#include <QtCore/qloggingcategory.h>
15#include <QtCore/qstring.h>
19using namespace QWindowsUiAutomation;
22QWindowsUiaSelectionItemProvider::QWindowsUiaSelectionItemProvider(QAccessible::Id id) :
23 QWindowsUiaBaseProvider(id)
27QWindowsUiaSelectionItemProvider::~QWindowsUiaSelectionItemProvider()
32HRESULT STDMETHODCALLTYPE QWindowsUiaSelectionItemProvider::Select()
34 qCDebug(lcQpaUiAutomation) <<
__FUNCTION__;
36 QAccessibleInterface *accessible = accessibleInterface();
38 return UIA_E_ELEMENTNOTAVAILABLE;
40 if (QAccessibleInterface *parent = accessible->parent()) {
41 if (QAccessibleSelectionInterface *selectionInterface = parent->selectionInterface()) {
42 selectionInterface->clear();
43 bool ok = selectionInterface->select(accessible);
44 return ok ? S_OK : S_FALSE;
48 QAccessibleActionInterface *actionInterface = accessible->actionInterface();
50 return UIA_E_ELEMENTNOTAVAILABLE;
52 if (accessible->role() == QAccessible::RadioButton || accessible->role() == QAccessible::PageTab) {
54 actionInterface->doAction(QAccessibleActionInterface::pressAction());
57 if (!accessible->state().selected) {
58 actionInterface->doAction(QAccessibleActionInterface::toggleAction());
61 if (QAccessibleInterface *parent = accessible->parent()) {
62 for (
int i = 0; i < parent->childCount(); ++i) {
63 if (QAccessibleInterface *sibling = parent->child(i)) {
64 if ((sibling != accessible) && (sibling->state().selected)) {
65 if (QAccessibleActionInterface *siblingAction = sibling->actionInterface()) {
66 siblingAction->doAction(QAccessibleActionInterface::toggleAction());
77HRESULT STDMETHODCALLTYPE QWindowsUiaSelectionItemProvider::AddToSelection()
79 qCDebug(lcQpaUiAutomation) <<
__FUNCTION__;
81 QAccessibleInterface *accessible = accessibleInterface();
83 return UIA_E_ELEMENTNOTAVAILABLE;
85 if (QAccessibleInterface *parent = accessible->parent()) {
86 if (QAccessibleSelectionInterface *selectionInterface = parent->selectionInterface()) {
87 bool ok = selectionInterface->select(accessible);
88 return ok ? S_OK : S_FALSE;
92 QAccessibleActionInterface *actionInterface = accessible->actionInterface();
94 return UIA_E_ELEMENTNOTAVAILABLE;
96 if (accessible->role() == QAccessible::RadioButton || accessible->role() == QAccessible::PageTab) {
98 actionInterface->doAction(QAccessibleActionInterface::pressAction());
101 if (!accessible->state().selected) {
102 actionInterface->doAction(QAccessibleActionInterface::toggleAction());
109HRESULT STDMETHODCALLTYPE QWindowsUiaSelectionItemProvider::RemoveFromSelection()
111 qCDebug(lcQpaUiAutomation) <<
__FUNCTION__;
113 QAccessibleInterface *accessible = accessibleInterface();
115 return UIA_E_ELEMENTNOTAVAILABLE;
117 if (QAccessibleInterface *parent = accessible->parent()) {
118 if (QAccessibleSelectionInterface *selectionInterface = parent->selectionInterface()) {
119 bool ok = selectionInterface->unselect(accessible);
120 return ok ? S_OK : S_FALSE;
124 QAccessibleActionInterface *actionInterface = accessible->actionInterface();
125 if (!actionInterface)
126 return UIA_E_ELEMENTNOTAVAILABLE;
128 if (accessible->role() != QAccessible::RadioButton && accessible->role() != QAccessible::PageTab) {
129 if (accessible->state().selected) {
130 actionInterface->doAction(QAccessibleActionInterface::toggleAction());
138HRESULT STDMETHODCALLTYPE QWindowsUiaSelectionItemProvider::get_IsSelected(BOOL *pRetVal)
140 qCDebug(lcQpaUiAutomation) <<
__FUNCTION__;
146 QAccessibleInterface *accessible = accessibleInterface();
148 return UIA_E_ELEMENTNOTAVAILABLE;
150 if (QAccessibleInterface *parent = accessible->parent()) {
151 if (QAccessibleSelectionInterface *selectionInterface = parent->selectionInterface()) {
152 bool selected = selectionInterface->isSelected(accessible);
153 *pRetVal = selected ? TRUE : FALSE;
158 if (accessible->role() == QAccessible::RadioButton)
159 *pRetVal = accessible->state().checked;
160 else if (accessible->role() == QAccessible::PageTab)
161 *pRetVal = accessible->state().focused;
163 *pRetVal = accessible->state().selected;
168HRESULT STDMETHODCALLTYPE QWindowsUiaSelectionItemProvider::get_SelectionContainer(IRawElementProviderSimple **pRetVal)
170 qCDebug(lcQpaUiAutomation) <<
__FUNCTION__;
176 QAccessibleInterface *accessible = accessibleInterface();
178 return UIA_E_ELEMENTNOTAVAILABLE;
180 QAccessibleInterface *parent = accessible->parent();
181 if (parent && parent->selectionInterface()) {
182 *pRetVal = QWindowsUiaMainProvider::providerForAccessible(parent).Detach();
186 QAccessibleActionInterface *actionInterface = accessible->actionInterface();
187 if (!actionInterface)
188 return UIA_E_ELEMENTNOTAVAILABLE;
192 if ((accessible->role() == QAccessible::ListItem && parent->role() == QAccessible::List)
193 || (accessible->role() == QAccessible::PageTab && parent->role() == QAccessible::PageTabList)) {
194 *pRetVal = QWindowsUiaMainProvider::providerForAccessible(parent).Detach();