LMMS
Loading...
Searching...
No Matches
juce_win32_UIASelectionProvider.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
29JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")
30
31//==============================================================================
33 public ComBaseClassHelper<ComTypes::ISelectionItemProvider>
34{
35public:
41
42 //==============================================================================
44 {
45 if (! isElementValid())
46 return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;
47
48 const auto& handler = getHandler();
49
50 if (isRadioButton)
51 {
52 handler.getActions().invoke (AccessibilityActionType::press);
54
55 return S_OK;
56 }
57
58 handler.getActions().invoke (AccessibilityActionType::toggle);
59 handler.getActions().invoke (AccessibilityActionType::press);
60
61 return S_OK;
62 }
63
65 {
66 return withCheckedComArgs (pRetVal, *this, [&]
67 {
68 const auto state = getHandler().getCurrentState();
69 *pRetVal = isRadioButton ? state.isChecked() : state.isSelected();
70 return S_OK;
71 });
72 }
73
74 JUCE_COMRESULT get_SelectionContainer (IRawElementProviderSimple** pRetVal) override
75 {
76 return withCheckedComArgs (pRetVal, *this, [&]
77 {
78 if (! isRadioButton)
79 if (auto* parent = getHandler().getParent())
80 parent->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));
81
82 return S_OK;
83 });
84 }
85
87 {
88 if (! isElementValid())
89 return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;
90
91 if (! isRadioButton)
92 {
93 const auto& handler = getHandler();
94
95 if (handler.getCurrentState().isSelected())
96 getHandler().getActions().invoke (AccessibilityActionType::toggle);
97 }
98
99 return S_OK;
100 }
101
103 {
104 if (! isElementValid())
105 return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;
106
108
109 if (isElementValid() && ! isRadioButton)
110 {
111 const auto& handler = getHandler();
112
113 if (auto* parent = handler.getParent())
114 for (auto* child : parent->getChildren())
115 if (child != &handler && child->getCurrentState().isSelected())
116 child->getActions().invoke (AccessibilityActionType::toggle);
117 }
118
119 return S_OK;
120 }
121
122private:
123 const bool isRadioButton;
124
125 //==============================================================================
127};
128
129//==============================================================================
131 public ComBaseClassHelper<ComTypes::ISelectionProvider2>
132{
133public:
135
136 //==============================================================================
137 JUCE_COMRESULT QueryInterface (REFIID iid, void** result) override
138 {
139 if (iid == __uuidof (IUnknown) || iid == __uuidof (ComTypes::ISelectionProvider))
141
142 if (iid == __uuidof (ComTypes::ISelectionProvider2))
144
145 *result = nullptr;
146 return E_NOINTERFACE;
147 }
148
149 //==============================================================================
151 {
152 return withCheckedComArgs (pRetVal, *this, [&]
153 {
154 *pRetVal = isMultiSelectable();
155 return S_OK;
156 });
157 }
158
160 {
161 return withCheckedComArgs (pRetVal, *this, [&]
162 {
163 *pRetVal = getSelectedChildren().size() > 0 && ! isMultiSelectable();
164 return S_OK;
165 });
166 }
167
168 JUCE_COMRESULT GetSelection (SAFEARRAY** pRetVal) override
169 {
170 return withCheckedComArgs (pRetVal, *this, [&]
171 {
172 return addHandlersToArray (getSelectedChildren(), pRetVal);
173 });
174 }
175
176 //==============================================================================
177 JUCE_COMRESULT get_FirstSelectedItem (IRawElementProviderSimple** pRetVal) override
178 {
179 return withCheckedComArgs (pRetVal, *this, [&]
180 {
181 auto selectedChildren = getSelectedChildren();
182
183 if (! selectedChildren.empty())
184 selectedChildren.front()->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));
185
186 return S_OK;
187 });
188 }
189
190 JUCE_COMRESULT get_LastSelectedItem (IRawElementProviderSimple** pRetVal) override
191 {
192 return withCheckedComArgs (pRetVal, *this, [&]
193 {
194 auto selectedChildren = getSelectedChildren();
195
196 if (! selectedChildren.empty())
197 selectedChildren.back()->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));
198
199 return S_OK;
200 });
201 }
202
203 JUCE_COMRESULT get_CurrentSelectedItem (IRawElementProviderSimple** pRetVal) override
204 {
205 return withCheckedComArgs (pRetVal, *this, [&]
206 {
207 get_FirstSelectedItem (pRetVal);
208 return S_OK;
209 });
210 }
211
212 JUCE_COMRESULT get_ItemCount (int* pRetVal) override
213 {
214 return withCheckedComArgs (pRetVal, *this, [&]
215 {
216 *pRetVal = (int) getSelectedChildren().size();
217 return S_OK;
218 });
219 }
220
221private:
223 {
224 return getHandler().getCurrentState().isMultiSelectable();
225 }
226
227 std::vector<const AccessibilityHandler*> getSelectedChildren() const
228 {
229 std::vector<const AccessibilityHandler*> selectedHandlers;
230
231 for (auto* child : getHandler().getComponent().getChildren())
232 if (auto* handler = child->getAccessibilityHandler())
233 if (handler->getCurrentState().isSelected())
234 selectedHandlers.push_back (handler);
235
236 return selectedHandlers;
237 }
238
239 //==============================================================================
241};
242
244
245} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_android_Accessibility.cpp:207
JUCE_COMRESULT castToType(void **result)
Definition juce_win32_ComSmartPtr.h:186
ComBaseClassHelper(unsigned int initialRefCount=1)
Definition juce_win32_ComSmartPtr.h:203
const AccessibilityHandler & getHandler() const
Definition juce_win32_UIAProviderBase.h:46
UIAProviderBase(AccessibilityNativeHandle *nativeHandleIn)
Definition juce_win32_UIAProviderBase.h:33
bool isElementValid() const
Definition juce_win32_UIAProviderBase.h:38
JUCE_COMRESULT RemoveFromSelection() override
Definition juce_win32_UIASelectionProvider.h:86
JUCE_COMRESULT get_SelectionContainer(IRawElementProviderSimple **pRetVal) override
Definition juce_win32_UIASelectionProvider.h:74
JUCE_COMRESULT get_IsSelected(BOOL *pRetVal) override
Definition juce_win32_UIASelectionProvider.h:64
UIASelectionItemProvider(AccessibilityNativeHandle *handle)
Definition juce_win32_UIASelectionProvider.h:36
const bool isRadioButton
Definition juce_win32_UIASelectionProvider.h:123
JUCE_COMRESULT AddToSelection() override
Definition juce_win32_UIASelectionProvider.h:43
JUCE_COMRESULT Select() override
Definition juce_win32_UIASelectionProvider.h:102
Definition juce_win32_UIASelectionProvider.h:132
JUCE_COMRESULT get_FirstSelectedItem(IRawElementProviderSimple **pRetVal) override
Definition juce_win32_UIASelectionProvider.h:177
JUCE_COMRESULT GetSelection(SAFEARRAY **pRetVal) override
Definition juce_win32_UIASelectionProvider.h:168
std::vector< const AccessibilityHandler * > getSelectedChildren() const
Definition juce_win32_UIASelectionProvider.h:227
JUCE_COMRESULT get_ItemCount(int *pRetVal) override
Definition juce_win32_UIASelectionProvider.h:212
JUCE_COMRESULT get_IsSelectionRequired(BOOL *pRetVal) override
Definition juce_win32_UIASelectionProvider.h:159
JUCE_COMRESULT get_LastSelectedItem(IRawElementProviderSimple **pRetVal) override
Definition juce_win32_UIASelectionProvider.h:190
JUCE_COMRESULT QueryInterface(REFIID iid, void **result) override
Definition juce_win32_UIASelectionProvider.h:137
bool isMultiSelectable() const noexcept
Definition juce_win32_UIASelectionProvider.h:222
JUCE_COMRESULT get_CurrentSelectedItem(IRawElementProviderSimple **pRetVal) override
Definition juce_win32_UIASelectionProvider.h:203
JUCE_COMRESULT get_CanSelectMultiple(BOOL *pRetVal) override
Definition juce_win32_UIASelectionProvider.h:150
UIAProviderBase(AccessibilityNativeHandle *nativeHandleIn)
Definition juce_win32_UIAProviderBase.h:33
static uintptr_t parent
Definition pugl.h:1644
#define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...)
Definition juce_CompilerWarnings.h:181
#define JUCE_END_IGNORE_WARNINGS_GCC_LIKE
Definition juce_CompilerWarnings.h:182
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
#define JUCE_COMRESULT
Definition juce_win32_ComSmartPtr.h:54
#define __uuidof(x)
Definition juce_win32_ComSmartPtr.h:32
Definition juce_win32_ComInterfaces.h:29
const long UIA_SelectionItem_ElementSelectedEventId
Definition juce_win32_ComInterfaces.h:142
Definition carla_juce.cpp:31
JUCE_COMRESULT withCheckedComArgs(Value *pRetVal, Object &handle, Callback &&callback)
Definition juce_win32_UIAHelpers.h:106
@ toggle
Definition juce_AccessibilityActions.h:47
@ press
Definition juce_AccessibilityActions.h:40
void sendAccessibilityAutomationEvent(const AccessibilityHandler &handler, EVENTID event)
Definition juce_win32_Accessibility.cpp:133
AccessibilityRole
Definition juce_AccessibilityRole.h:37
@ radioButton
Definition juce_AccessibilityRole.h:40
JUCE_COMRESULT addHandlersToArray(const std::vector< const AccessibilityHandler * > &handlers, SAFEARRAY **pRetVal)
Definition juce_win32_UIAHelpers.h:75
#define S_OK
Definition swell-types.h:53
signed int HRESULT
Definition swell-types.h:181
signed char BOOL
Definition swell-types.h:160
void handler(int signal)
Definition fileio.c:1632
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
#define const
Definition zconf.h:137