LMMS
Loading...
Searching...
No Matches
juce_AccessibilityHandler.cpp
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
29AccessibilityHandler* AccessibilityHandler::currentlyFocusedHandler = nullptr;
30
40
41void notifyAccessibilityEventInternal (const AccessibilityHandler&, InternalAccessibilityEvent);
42
44{
45 #if defined (JucePlugin_Name)
46 return JucePlugin_Name;
47 #else
48 if (auto* app = JUCEApplicationBase::getInstance())
49 return app->getApplicationName();
50
51 return "JUCE Application";
52 #endif
53}
54
56 AccessibilityRole accessibilityRole,
57 AccessibilityActions accessibilityActions,
58 Interfaces interfacesIn)
59 : component (comp),
60 typeIndex (typeid (component)),
61 role (accessibilityRole),
62 actions (std::move (accessibilityActions)),
63 interfaces (std::move (interfacesIn)),
65{
66}
67
73
74//==============================================================================
76{
77 if (component.isCurrentlyBlockedByAnotherModalComponent()
79 return {};
80
81 auto state = AccessibleState().withFocusable();
82
83 return hasFocus (false) ? state.withFocused() : state;
84}
85
87{
88 return role == AccessibilityRole::ignored || getCurrentState().isIgnored();
89}
90
92{
93 if (auto* peer = comp.getPeer())
94 return ! peer->getAreaCoveredBy (comp).getIntersection (peer->getComponent().getLocalBounds()).isEmpty();
95
96 return false;
97}
98
100{
101 if (auto* parent = comp->getParentComponent())
102 {
103 if (comp->getBoundsInParent().getIntersection (parent->getLocalBounds()).isEmpty())
104 return false;
105
107 }
108
109 return true;
110}
111
117
118//==============================================================================
123
128
133
138
143
144//==============================================================================
146{
147 if (comp != nullptr)
148 {
149 if (auto* handler = comp->getAccessibilityHandler())
150 return handler;
151
152 return findEnclosingHandler (comp->getParentComponent());
153 }
154
155 return nullptr;
156}
157
159{
160 while (handler != nullptr
161 && (handler->isIgnored() || ! handler->isVisibleWithinParent())
162 && handler->getParent() != nullptr)
163 {
164 handler = handler->getParent();
165 }
166
167 return handler;
168}
169
170static AccessibilityHandler* findFirstUnignoredChild (const std::vector<AccessibilityHandler*>& handlers)
171{
172 if (! handlers.empty())
173 {
174 const auto iter = std::find_if (handlers.cbegin(), handlers.cend(),
175 [] (const AccessibilityHandler* handler) { return ! handler->isIgnored() && handler->isVisibleWithinParent(); });
176
177 if (iter != handlers.cend())
178 return *iter;
179
180 for (auto* handler : handlers)
181 if (auto* unignored = findFirstUnignoredChild (handler->getChildren()))
182 return unignored;
183 }
184
185 return nullptr;
186}
187
189{
190 if (handler != nullptr && (handler->isIgnored() || ! handler->isVisibleWithinParent()))
191 return findFirstUnignoredChild (handler->getChildren());
192
193 return handler;
194}
195
197{
198 if (auto* focusContainer = component.findFocusContainer())
199 return getUnignoredAncestor (findEnclosingHandler (focusContainer));
200
201 return nullptr;
202}
203
204std::vector<AccessibilityHandler*> AccessibilityHandler::getChildren() const
205{
206 if (! component.isFocusContainer() && component.getParentComponent() != nullptr)
207 return {};
208
209 const auto addChildComponentHandler = [this] (Component* focusableComponent,
210 std::vector<AccessibilityHandler*>& childHandlers)
211 {
212 if (focusableComponent == nullptr)
213 return;
214
215 if (auto* handler = findEnclosingHandler (focusableComponent))
216 {
217 if (! handler->getCurrentState().isFocusable() || ! isParentOf (handler))
218 return;
219
220 if (auto* unignored = getFirstUnignoredDescendant (handler))
221 if (std::find (childHandlers.cbegin(), childHandlers.cend(), unignored) == childHandlers.cend())
222 childHandlers.push_back (unignored);
223 }
224 };
225
226 std::vector<AccessibilityHandler*> children;
227
228 if (auto traverser = component.createFocusTraverser())
229 {
230 addChildComponentHandler (traverser->getDefaultComponent (&component), children);
231
232 for (auto* focusableChild : traverser->getAllComponents (&component))
233 addChildComponentHandler (focusableChild, children);
234 }
235
236 return children;
237}
238
239bool AccessibilityHandler::isParentOf (const AccessibilityHandler* possibleChild) const noexcept
240{
241 while (possibleChild != nullptr)
242 {
243 possibleChild = possibleChild->getParent();
244
245 if (possibleChild == this)
246 return true;
247 }
248
249 return false;
250}
251
253{
254 if (auto* comp = Desktop::getInstance().findComponentAt (screenPoint))
255 {
257 if (isParentOf (handler))
258 return handler;
259 }
260
261 return nullptr;
262}
263
269
270bool AccessibilityHandler::hasFocus (bool trueIfChildFocused) const
271{
272 return currentlyFocusedHandler != nullptr
273 && (currentlyFocusedHandler == this
274 || (trueIfChildFocused && isParentOf (currentlyFocusedHandler)));
275}
276
278{
279 if (! hasFocus (false))
280 grabFocusInternal (true);
281}
282
284{
285 if (hasFocus (true))
287}
288
290{
291 if (getCurrentState().isFocusable() && ! isIgnored())
292 {
293 takeFocus();
294 return;
295 }
296
298 return;
299
300 if (auto traverser = component.createFocusTraverser())
301 {
302 if (auto* defaultComp = traverser->getDefaultComponent (&component))
303 {
304 if (auto* handler = getUnignoredAncestor (findEnclosingHandler (defaultComp)))
305 {
306 if (isParentOf (handler))
307 {
308 handler->grabFocusInternal (false);
309 return;
310 }
311 }
312 }
313 }
314
315 if (canTryParent)
316 if (auto* parent = getParent())
317 parent->grabFocusInternal (true);
318}
319
325
327{
330
331 if ((component.isShowing() || component.isOnDesktop())
332 && component.getWantsKeyboardFocus()
333 && ! component.hasKeyboardFocus (true))
334 {
335 component.grabKeyboardFocus();
336 }
337}
338
339} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_AccessibilityActions.h:73
Definition juce_AccessibilityCellInterface.h:37
Definition juce_AccessibilityHandler.h:41
virtual AccessibleState getCurrentState() const
Definition juce_AccessibilityHandler.cpp:75
void giveAwayFocusInternal() const
Definition juce_AccessibilityHandler.cpp:320
virtual ~AccessibilityHandler()
Definition juce_AccessibilityHandler.cpp:68
std::vector< AccessibilityHandler * > getChildren() const
Definition juce_AccessibilityHandler.cpp:204
void grabFocus()
Definition juce_AccessibilityHandler.cpp:277
const AccessibilityActions & getActions() const noexcept
Definition juce_AccessibilityHandler.cpp:119
AccessibilityActions actions
Definition juce_AccessibilityHandler.h:311
AccessibilityCellInterface * getCellInterface() const
Definition juce_AccessibilityHandler.cpp:134
AccessibilityHandler * getChildAt(Point< int > screenPoint)
Definition juce_AccessibilityHandler.cpp:252
bool isIgnored() const
Definition juce_AccessibilityHandler.cpp:86
AccessibilityHandler * getChildFocus()
Definition juce_AccessibilityHandler.cpp:264
void grabFocusInternal(bool)
Definition juce_AccessibilityHandler.cpp:289
std::type_index typeIndex
Definition juce_AccessibilityHandler.h:308
std::unique_ptr< AccessibilityNativeImpl > nativeImpl
Definition juce_AccessibilityHandler.h:317
bool hasFocus(bool trueIfChildFocused) const
Definition juce_AccessibilityHandler.cpp:270
void giveAwayFocus() const
Definition juce_AccessibilityHandler.cpp:283
static std::unique_ptr< AccessibilityNativeImpl > createNativeImpl(AccessibilityHandler &)
Definition juce_gui_basics.cpp:337
AccessibilityTableInterface * getTableInterface() const
Definition juce_AccessibilityHandler.cpp:129
Component & component
Definition juce_AccessibilityHandler.h:307
AccessibilityHandler * getParent() const
Definition juce_AccessibilityHandler.cpp:196
Interfaces interfaces
Definition juce_AccessibilityHandler.h:313
void takeFocus()
Definition juce_AccessibilityHandler.cpp:326
static AccessibilityHandler * currentlyFocusedHandler
Definition juce_AccessibilityHandler.h:304
AccessibilityValueInterface * getValueInterface() const
Definition juce_AccessibilityHandler.cpp:124
bool isVisibleWithinParent() const
Definition juce_AccessibilityHandler.cpp:112
AccessibilityTextInterface * getTextInterface() const
Definition juce_AccessibilityHandler.cpp:139
const AccessibilityRole role
Definition juce_AccessibilityHandler.h:310
AccessibilityHandler(Component &componentToWrap, AccessibilityRole accessibilityRole, AccessibilityActions actions={}, Interfaces interfaces={})
Definition juce_AccessibilityHandler.cpp:55
bool isParentOf(const AccessibilityHandler *possibleChild) const noexcept
Definition juce_AccessibilityHandler.cpp:239
Definition juce_AccessibilityTableInterface.h:37
Definition juce_AccessibilityTextInterface.h:39
Definition juce_AccessibilityValueInterface.h:46
Definition juce_AccessibilityState.h:39
JUCE_NODISCARD AccessibleState withFocusable() const noexcept
Definition juce_AccessibilityState.h:83
Definition juce_Component.h:36
static Component *JUCE_CALLTYPE getCurrentlyModalComponent(int index=0) noexcept
Definition juce_Component.cpp:1842
static Desktop &JUCE_CALLTYPE getInstance()
Definition juce_Desktop.cpp:50
static JUCEApplicationBase * getInstance() noexcept
Definition juce_ApplicationBase.h:96
Definition juce_Point.h:42
Definition juce_String.h:53
static uintptr_t parent
Definition pugl.h:1644
static int JUCE_CDECL comp(const void *a, const void *b)
Definition lsp.c:298
Definition carla_juce.cpp:31
static bool isComponentVisibleWithinParent(Component *comp)
Definition juce_AccessibilityHandler.cpp:99
InternalAccessibilityEvent
Definition juce_AccessibilityHandler.cpp:32
@ elementCreated
Definition juce_AccessibilityHandler.cpp:33
@ elementMovedOrResized
Definition juce_AccessibilityHandler.cpp:35
@ windowOpened
Definition juce_AccessibilityHandler.cpp:37
@ elementDestroyed
Definition juce_AccessibilityHandler.cpp:34
@ focusChanged
Definition juce_AccessibilityHandler.cpp:36
@ windowClosed
Definition juce_AccessibilityHandler.cpp:38
void notifyAccessibilityEventInternal(const AccessibilityHandler &, InternalAccessibilityEvent)
Definition juce_gui_basics.cpp:336
static AccessibilityHandler * findFirstUnignoredChild(const std::vector< AccessibilityHandler * > &handlers)
Definition juce_AccessibilityHandler.cpp:170
static AccessibilityHandler * findEnclosingHandler(Component *comp)
Definition juce_AccessibilityHandler.cpp:145
String getAccessibleApplicationOrPluginName()
Definition juce_AccessibilityHandler.cpp:43
static AccessibilityHandler * getUnignoredAncestor(AccessibilityHandler *handler)
Definition juce_AccessibilityHandler.cpp:158
static bool isComponentVisibleWithinWindow(const Component &comp)
Definition juce_AccessibilityHandler.cpp:91
static AccessibilityHandler * getFirstUnignoredDescendant(AccessibilityHandler *handler)
Definition juce_AccessibilityHandler.cpp:188
AccessibilityRole
Definition juce_AccessibilityRole.h:37
@ ignored
Definition juce_AccessibilityRole.h:67
Definition juce_Uuid.h:141
Definition juce_AccessibilityHandler.h:49
void handler(int signal)
Definition fileio.c:1632
#define const
Definition zconf.h:137