• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HUB_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HUB_H
18 
19 #include "base/memory/ace_type.h"
20 #include "core/components_ng/base/geometry_node.h"
21 #include "core/components_ng/event/touch_event.h"
22 #include "core/event/key_event.h"
23 #include "core/gestures/gesture_event.h"
24 
25 namespace OHOS::Ace::NG {
26 
27 class FrameNode;
28 class FocusHub;
29 class EventHub;
30 
31 using TabIndexNodeList = std::list<std::pair<int32_t, WeakPtr<FocusHub>>>;
32 constexpr int32_t DEFAULT_TAB_FOCUSED_INDEX = -2;
33 constexpr int32_t NONE_TAB_FOCUSED_INDEX = -1;
34 constexpr int32_t MASK_FOCUS_STEP_FORWARD = 0x10;
35 constexpr int32_t MASK_FOCUS_STEP_TAB = 0x5;
36 
37 enum class FocusType : int32_t {
38     DISABLE = 0,
39     NODE = 1,
40     SCOPE = 2,
41 };
42 enum class FocusNodeType : int32_t {
43     DEFAULT = 0,
44     GROUP_DEFAULT = 1,
45 };
46 enum class ScopeType : int32_t {
47     OTHERS = 0,
48     FLEX = 1,
49     PROJECT_AREA = 2,
50 };
51 enum class FocusStep : int32_t {
52     NONE = 0x0,
53     LEFT = 0x1,
54     UP = 0x2,
55     RIGHT = 0x11,
56     DOWN = 0x12,
57     LEFT_END = 0x3,
58     UP_END = 0x4,
59     RIGHT_END = 0X13,
60     DOWN_END = 0x14,
61     SHIFT_TAB = 0x5,
62     TAB = 0x15,
63 };
64 
65 using GetNextFocusNodeFunc = std::function<void(FocusStep, const WeakPtr<FocusHub>&, WeakPtr<FocusHub>&)>;
66 
67 enum class FocusStyleType : int32_t {
68     NONE = -1,
69     INNER_BORDER = 0,
70     OUTER_BORDER = 1,
71     CUSTOM_BORDER = 2,
72     CUSTOM_REGION = 3,
73 };
74 
75 enum class OnKeyEventType : int32_t {
76     DEFAULT = 0,
77     CONTEXT_MENU = 1,
78 };
79 
80 enum class FocusDependence : int32_t {
81     CHILD = 0,
82     SELF = 1,
83     AUTO = 2,
84 };
85 
86 class ACE_EXPORT FocusPaintParam : public virtual AceType {
87     DECLARE_ACE_TYPE(FocusPaintParam, AceType)
88 
89 public:
90     FocusPaintParam() = default;
91     ~FocusPaintParam() override = default;
92 
HasPaintRect()93     bool HasPaintRect() const
94     {
95         return paintRect.has_value();
96     }
GetPaintRect()97     const RoundRect& GetPaintRect() const
98     {
99         return paintRect.value();
100     }
101 
HasPaintColor()102     bool HasPaintColor() const
103     {
104         return paintColor.has_value();
105     }
GetPaintColor()106     const Color& GetPaintColor() const
107     {
108         return paintColor.value();
109     }
110 
HasPaintWidth()111     bool HasPaintWidth() const
112     {
113         return paintWidth.has_value();
114     }
GetPaintWidth()115     const Dimension& GetPaintWidth() const
116     {
117         return paintWidth.value();
118     }
119 
HasFocusPadding()120     bool HasFocusPadding() const
121     {
122         return focusPadding.has_value();
123     }
GetFocusPadding()124     const Dimension& GetFocusPadding() const
125     {
126         return focusPadding.value();
127     }
SetPaintRect(const RoundRect & rect)128     void SetPaintRect(const RoundRect& rect)
129     {
130         paintRect = rect;
131     }
SetPaintColor(const Color & color)132     void SetPaintColor(const Color& color)
133     {
134         paintColor = color;
135     }
SetPaintWidth(const Dimension & width)136     void SetPaintWidth(const Dimension& width)
137     {
138         paintWidth = width;
139     }
SetFocusPadding(const Dimension & padding)140     void SetFocusPadding(const Dimension& padding)
141     {
142         focusPadding = padding;
143     }
144 
145 private:
146     std::optional<RoundRect> paintRect;
147     std::optional<Color> paintColor;
148     std::optional<Dimension> paintWidth;
149     std::optional<Dimension> focusPadding;
150 };
151 
152 class ACE_EXPORT FocusPattern : public virtual AceType {
153     DECLARE_ACE_TYPE(FocusPattern, AceType)
154 
155 public:
156     FocusPattern() = default;
FocusPattern(FocusType focusType,bool focusable)157     FocusPattern(FocusType focusType, bool focusable) : focusType_(focusType), focusable_(focusable) {}
FocusPattern(FocusType focusType,bool focusable,FocusStyleType styleType)158     FocusPattern(FocusType focusType, bool focusable, FocusStyleType styleType)
159         : focusType_(focusType), focusable_(focusable), styleType_(styleType)
160     {}
FocusPattern(FocusType focusType,bool focusable,FocusStyleType styleType,const FocusPaintParam & paintParams)161     FocusPattern(FocusType focusType, bool focusable, FocusStyleType styleType, const FocusPaintParam& paintParams)
162         : focusType_(focusType), focusable_(focusable), styleType_(styleType)
163     {
164         if (!paintParams_) {
165             paintParams_ = std::make_unique<FocusPaintParam>();
166         }
167         if (paintParams.HasPaintRect()) {
168             paintParams_->SetPaintRect(paintParams.GetPaintRect());
169         }
170         if (paintParams.HasPaintColor()) {
171             paintParams_->SetPaintColor(paintParams.GetPaintColor());
172         }
173         if (paintParams.HasPaintWidth()) {
174             paintParams_->SetPaintWidth(paintParams.GetPaintWidth());
175         }
176         if (paintParams.HasFocusPadding()) {
177             paintParams_->SetFocusPadding(paintParams.GetFocusPadding());
178         }
179     }
FocusPattern(const FocusPattern & focusPattern)180     FocusPattern(const FocusPattern& focusPattern)
181     {
182         focusType_ = focusPattern.GetFocusType();
183         focusable_ = focusPattern.GetFocusable();
184         styleType_ = focusPattern.GetStyleType();
185         if (focusPattern.GetFocusPaintParams()) {
186             SetFocusPaintParams(*focusPattern.GetFocusPaintParams());
187         }
188         isFocusActiveWhenFocused_ = focusPattern.GetIsFocusActiveWhenFocused();
189     }
190     ~FocusPattern() override = default;
191 
GetFocusType()192     FocusType GetFocusType() const
193     {
194         return focusType_;
195     }
SetFocusType(FocusType type)196     void SetFocusType(FocusType type)
197     {
198         focusType_ = type;
199     }
200 
GetFocusable()201     bool GetFocusable() const
202     {
203         return focusable_;
204     }
SetFocusable(bool focusable)205     void SetFocusable(bool focusable)
206     {
207         focusable_ = focusable;
208     }
209 
GetStyleType()210     FocusStyleType GetStyleType() const
211     {
212         return styleType_;
213     }
SetStyleType(FocusStyleType styleType)214     void SetStyleType(FocusStyleType styleType)
215     {
216         styleType_ = styleType;
217     }
218 
GetFocusPaintParams()219     const std::unique_ptr<FocusPaintParam>& GetFocusPaintParams() const
220     {
221         return paintParams_;
222     }
SetFocusPaintParams(const FocusPaintParam & paintParams)223     void SetFocusPaintParams(const FocusPaintParam& paintParams)
224     {
225         if (!paintParams_) {
226             paintParams_ = std::make_unique<FocusPaintParam>();
227         }
228         if (paintParams.HasPaintRect()) {
229             paintParams_->SetPaintRect(paintParams.GetPaintRect());
230         }
231         if (paintParams.HasPaintColor()) {
232             paintParams_->SetPaintColor(paintParams.GetPaintColor());
233         }
234         if (paintParams.HasPaintWidth()) {
235             paintParams_->SetPaintWidth(paintParams.GetPaintWidth());
236         }
237         if (paintParams.HasFocusPadding()) {
238             paintParams_->SetFocusPadding(paintParams.GetFocusPadding());
239         }
240     }
241 
GetIsFocusActiveWhenFocused()242     bool GetIsFocusActiveWhenFocused() const
243     {
244         return isFocusActiveWhenFocused_;
245     }
SetIsFocusActiveWhenFocused(bool value)246     void SetIsFocusActiveWhenFocused(bool value)
247     {
248         isFocusActiveWhenFocused_ = value;
249     }
250 
251 private:
252     FocusType focusType_ = FocusType::DISABLE;
253     bool focusable_ = false;
254     FocusStyleType styleType_ = FocusStyleType::OUTER_BORDER;
255     std::unique_ptr<FocusPaintParam> paintParams_ = nullptr;
256     bool isFocusActiveWhenFocused_ = false;
257 };
258 
259 struct ScopeFocusAlgorithm final {
260     ScopeFocusAlgorithm() = default;
ScopeFocusAlgorithmfinal261     ScopeFocusAlgorithm(bool isVertical, bool isLeftToRight, ScopeType scopeType)
262         : isVertical(isVertical), isLeftToRight(isLeftToRight), scopeType(scopeType)
263     {}
ScopeFocusAlgorithmfinal264     ScopeFocusAlgorithm(bool isVertical, bool isLeftToRight, ScopeType scopeType, GetNextFocusNodeFunc&& function)
265         : isVertical(isVertical), isLeftToRight(isLeftToRight), scopeType(scopeType),
266           getNextFocusNode(std::move(function))
267     {}
268     ~ScopeFocusAlgorithm() = default;
269 
270     bool isVertical { true };
271     bool isLeftToRight { true };
272     ScopeType scopeType { ScopeType::OTHERS };
273     GetNextFocusNodeFunc getNextFocusNode;
274 };
275 
276 class ACE_EXPORT FocusCallbackEvents : public virtual AceType {
277     DECLARE_ACE_TYPE(FocusCallbackEvents, AceType)
278 public:
279     FocusCallbackEvents() = default;
280     ~FocusCallbackEvents() override = default;
281 
ClearOnFocusCallback()282     void ClearOnFocusCallback()
283     {
284         if (onFocusCallback_) {
285             onFocusCallback_ = nullptr;
286         }
287     }
288 
SetOnFocusCallback(OnFocusFunc && onFocusCallback)289     void SetOnFocusCallback(OnFocusFunc&& onFocusCallback)
290     {
291         onFocusCallback_ = std::move(onFocusCallback);
292     }
293 
GetOnFocusCallback()294     const OnFocusFunc& GetOnFocusCallback()
295     {
296         return onFocusCallback_;
297     }
298 
ClearOnBlurCallback()299     void ClearOnBlurCallback()
300     {
301         if (onBlurCallback_) {
302             onBlurCallback_ = nullptr;
303         }
304     }
305 
SetOnBlurCallback(OnBlurFunc && onBlurCallback)306     void SetOnBlurCallback(OnBlurFunc&& onBlurCallback)
307     {
308         onBlurCallback_ = std::move(onBlurCallback);
309     }
310 
GetOnBlurCallback()311     const OnBlurFunc& GetOnBlurCallback()
312     {
313         return onBlurCallback_;
314     }
315 
SetOnKeyEventCallback(OnKeyCallbackFunc && onKeyEventCallback)316     void SetOnKeyEventCallback(OnKeyCallbackFunc&& onKeyEventCallback)
317     {
318         onKeyEventCallback_ = std::move(onKeyEventCallback);
319     }
320 
ClearOnKeyEventCallback()321     void ClearOnKeyEventCallback()
322     {
323         if (onKeyEventCallback_) {
324             onKeyEventCallback_ = nullptr;
325         }
326     }
327 
GetOnKeyEventCallback()328     const OnKeyCallbackFunc& GetOnKeyEventCallback()
329     {
330         return onKeyEventCallback_;
331     }
332 
SetOnClickCallback(GestureEventFunc && onClickEventCallback)333     void SetOnClickCallback(GestureEventFunc&& onClickEventCallback)
334     {
335         onClickEventCallback_ = std::move(onClickEventCallback);
336     }
337 
GetOnClickCallback()338     const GestureEventFunc& GetOnClickCallback()
339     {
340         return onClickEventCallback_;
341     }
342 
GetTabIndex()343     int32_t GetTabIndex() const
344     {
345         return tabIndex_;
346     }
347 
SetTabIndex(int32_t tabIndex)348     void SetTabIndex(int32_t tabIndex)
349     {
350         tabIndex_ = tabIndex;
351     }
352 
IsDefaultFocus()353     bool IsDefaultFocus() const
354     {
355         return isDefaultFocus_;
356     }
357 
SetIsDefaultFocus(bool isDefaultFocus)358     void SetIsDefaultFocus(bool isDefaultFocus)
359     {
360         isDefaultFocus_ = isDefaultFocus;
361     }
362 
IsDefaultGroupFocus()363     bool IsDefaultGroupFocus() const
364     {
365         return isDefaultGroupFocus_;
366     }
367 
SetIsDefaultGroupFocus(bool isDefaultGroupFocus)368     void SetIsDefaultGroupFocus(bool isDefaultGroupFocus)
369     {
370         isDefaultGroupFocus_ = isDefaultGroupFocus;
371     }
372 
GetDefaultFocusNode()373     WeakPtr<FocusHub> GetDefaultFocusNode() const
374     {
375         return defaultFocusNode_;
376     }
377 
SetDefaultFocusNode(const WeakPtr<FocusHub> & node)378     void SetDefaultFocusNode(const WeakPtr<FocusHub>& node)
379     {
380         defaultFocusNode_ = node;
381     }
382 
IsFocusOnTouch()383     std::optional<bool> IsFocusOnTouch() const
384     {
385         return isFocusOnTouch_;
386     }
387 
SetIsFocusOnTouch(bool isFocusOnTouch)388     void SetIsFocusOnTouch(bool isFocusOnTouch)
389     {
390         isFocusOnTouch_ = isFocusOnTouch;
391     }
392 
SetIsDefaultHasFocused(bool isDefaultHasFocused)393     void SetIsDefaultHasFocused(bool isDefaultHasFocused)
394     {
395         isDefaultHasFocused_ = isDefaultHasFocused;
396     }
397 
IsDefaultHasFocused()398     bool IsDefaultHasFocused() const
399     {
400         return isDefaultHasFocused_;
401     }
402 
SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)403     void SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)
404     {
405         isDefaultGroupHasFocused_ = isDefaultGroupHasFocused;
406     }
407 
IsDefaultGroupHasFocused()408     bool IsDefaultGroupHasFocused() const
409     {
410         return isDefaultGroupHasFocused_;
411     }
412 
413 private:
414     OnFocusFunc onFocusCallback_;
415     OnBlurFunc onBlurCallback_;
416     OnKeyCallbackFunc onKeyEventCallback_;
417     GestureEventFunc onClickEventCallback_;
418 
419     WeakPtr<FocusHub> defaultFocusNode_;
420 
421     std::optional<bool> isFocusOnTouch_;
422     bool isDefaultFocus_ = { false };
423     bool isDefaultHasFocused_ = { false };
424     bool isDefaultGroupFocus_ = { false };
425     bool isDefaultGroupHasFocused_ { false };
426 
427     int32_t tabIndex_ = 0;
428 };
429 
430 class ACE_EXPORT FocusHub : public virtual AceType {
DECLARE_ACE_TYPE(FocusHub,AceType)431     DECLARE_ACE_TYPE(FocusHub, AceType)
432 public:
433     explicit FocusHub(const WeakPtr<EventHub>& eventHub, FocusType type = FocusType::DISABLE, bool focusable = false)
434         : eventHub_(eventHub), focusable_(focusable), focusType_(type)
435     {}
FocusHub(const WeakPtr<EventHub> & eventHub,const FocusPattern & focusPattern)436     explicit FocusHub(const WeakPtr<EventHub>& eventHub, const FocusPattern& focusPattern)
437     {
438         eventHub_ = eventHub;
439         focusable_ = focusPattern.GetFocusable();
440         focusType_ = focusPattern.GetFocusType();
441         focusStyleType_ = focusPattern.GetStyleType();
442         if (focusPattern.GetFocusPaintParams()) {
443             SetFocusPaintParamsPtr(focusPattern.GetFocusPaintParams());
444         }
445         isFocusActiveWhenFocused_ = focusPattern.GetIsFocusActiveWhenFocused();
446     }
447     ~FocusHub() override = default;
448 
SetFocusStyleType(FocusStyleType type)449     void SetFocusStyleType(FocusStyleType type)
450     {
451         focusStyleType_ = type;
452     }
GetFocusStyleType()453     FocusStyleType GetFocusStyleType() const
454     {
455         return focusStyleType_;
456     }
457 
458     static void CloseKeyboard();
459 
460     static void IsCloseKeyboard(RefPtr<FrameNode> frameNode);
461 
462     static void PushPageCloseKeyboard();
463 
464     static void NavCloseKeyboard();
465 
GetBlurReason()466     BlurReason GetBlurReason() const
467     {
468         return blurReason_;
469     }
470 
SetFocusPaintParamsPtr(const std::unique_ptr<FocusPaintParam> & paramsPtr)471     void SetFocusPaintParamsPtr(const std::unique_ptr<FocusPaintParam>& paramsPtr)
472     {
473         CHECK_NULL_VOID(paramsPtr);
474         if (!focusPaintParamsPtr_) {
475             focusPaintParamsPtr_ = std::make_unique<FocusPaintParam>();
476         }
477         if (paramsPtr->HasPaintRect()) {
478             focusPaintParamsPtr_->SetPaintRect(paramsPtr->GetPaintRect());
479         }
480         if (paramsPtr->HasPaintColor()) {
481             focusPaintParamsPtr_->SetPaintColor(paramsPtr->GetPaintColor());
482         }
483         if (paramsPtr->HasPaintWidth()) {
484             focusPaintParamsPtr_->SetPaintWidth(paramsPtr->GetPaintWidth());
485         }
486         if (paramsPtr->HasFocusPadding()) {
487             focusPaintParamsPtr_->SetFocusPadding(paramsPtr->GetFocusPadding());
488         }
489     }
490 
HasPaintRect()491     bool HasPaintRect() const
492     {
493         return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintRect() : false;
494     }
GetPaintRect()495     RoundRect GetPaintRect() const
496     {
497         CHECK_NULL_RETURN(focusPaintParamsPtr_, RoundRect());
498         return focusPaintParamsPtr_->GetPaintRect();
499     }
500 
HasPaintColor()501     bool HasPaintColor() const
502     {
503         return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintColor() : false;
504     }
GetPaintColor()505     const Color& GetPaintColor() const
506     {
507         CHECK_NULL_RETURN(focusPaintParamsPtr_, Color::TRANSPARENT);
508         return focusPaintParamsPtr_->GetPaintColor();
509     }
510 
HasPaintWidth()511     bool HasPaintWidth() const
512     {
513         return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintWidth() : false;
514     }
GetPaintWidth()515     Dimension GetPaintWidth() const
516     {
517         CHECK_NULL_RETURN(focusPaintParamsPtr_, Dimension());
518         return focusPaintParamsPtr_->GetPaintWidth();
519     }
520 
HasFocusPadding()521     bool HasFocusPadding() const
522     {
523         return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasFocusPadding() : false;
524     }
525 
HasBackwardFocusMovement()526     bool HasBackwardFocusMovement() const
527     {
528         return hasBackwardMovement_;
529     }
530 
HasForwardFocusMovement()531     bool HasForwardFocusMovement() const
532     {
533         return hasForwardMovement_;
534     }
535 
ClearFocusMovementFlags()536     void ClearFocusMovementFlags()
537     {
538         hasBackwardMovement_ = false;
539         hasForwardMovement_ = false;
540     }
541 
542     bool HasBackwardFocusMovementInChildren();
543     bool HasForwardFocusMovementInChildren();
544     void ClearFocusMovementFlagsInChildren();
545 
GetFocusPadding()546     Dimension GetFocusPadding() const
547     {
548         CHECK_NULL_RETURN(focusPaintParamsPtr_, Dimension());
549         return focusPaintParamsPtr_->GetFocusPadding();
550     }
SetPaintRect(const RoundRect & rect)551     void SetPaintRect(const RoundRect& rect)
552     {
553         if (!focusPaintParamsPtr_) {
554             focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>();
555         }
556         focusPaintParamsPtr_->SetPaintRect(rect);
557     }
SetPaintColor(const Color & color)558     void SetPaintColor(const Color& color)
559     {
560         if (!focusPaintParamsPtr_) {
561             focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>();
562         }
563         focusPaintParamsPtr_->SetPaintColor(color);
564     }
SetPaintWidth(const Dimension & width)565     void SetPaintWidth(const Dimension& width)
566     {
567         if (!focusPaintParamsPtr_) {
568             focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>();
569         }
570         focusPaintParamsPtr_->SetPaintWidth(width);
571     }
SetFocusPadding(const Dimension & padding)572     void SetFocusPadding(const Dimension& padding)
573     {
574         if (!focusPaintParamsPtr_) {
575             focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>();
576         }
577         focusPaintParamsPtr_->SetFocusPadding(padding);
578     }
579 
580     RefPtr<FrameNode> GetFrameNode() const;
581     RefPtr<GeometryNode> GetGeometryNode() const;
582     RefPtr<FocusHub> GetParentFocusHub() const;
583     RefPtr<FocusHub> GetRootFocusHub();
584     std::string GetFrameName() const;
585     int32_t GetFrameId() const;
586 
587     bool HandleKeyEvent(const KeyEvent& keyEvent);
588     bool RequestFocusImmediately(bool isJudgeRootTree = false);
589     void RequestFocus() const;
590     void RequestFocusWithDefaultFocusFirstly();
591     void UpdateAccessibilityFocusInfo();
592     void SwitchFocus(const RefPtr<FocusHub>& focusNode);
593 
594     RefPtr<FocusHub> GetChildMainView();
595     RefPtr<FocusHub> GetMainViewRootScope();
596 
597     static RefPtr<FocusHub> GetCurrentMainView();
598     static void LostFocusToViewRoot();
599 
600     bool HandleFocusOnMainView();
601     void LostFocus(BlurReason reason = BlurReason::FOCUS_SWITCH);
602     void LostSelfFocus();
603     void RemoveSelf(BlurReason reason = BlurReason::FRAME_DESTROY);
604     void RemoveChild(const RefPtr<FocusHub>& focusNode, BlurReason reason = BlurReason::FRAME_DESTROY);
605     bool GoToNextFocusLinear(FocusStep step, const RectF& rect = RectF());
606     bool TryRequestFocus(const RefPtr<FocusHub>& focusNode, const RectF& rect, FocusStep step = FocusStep::NONE);
607 
608     void CollectTabIndexNodes(TabIndexNodeList& tabIndexNodes);
609     bool GoToFocusByTabNodeIdx(TabIndexNodeList& tabIndexNodes, int32_t tabNodeIdx);
610     bool HandleFocusByTabIndex(const KeyEvent& event);
611     RefPtr<FocusHub> GetChildFocusNodeByType(FocusNodeType nodeType = FocusNodeType::DEFAULT);
612     RefPtr<FocusHub> GetChildFocusNodeById(const std::string& id);
613     void HandleParentScroll() const;
614     int32_t GetFocusingTabNodeIdx(TabIndexNodeList& tabIndexNodes) const;
615     bool RequestFocusImmediatelyById(const std::string& id);
616 
617     bool IsFocusableByTab();
618     bool IsFocusableNodeByTab();
619     bool IsFocusableScopeByTab();
620 
621     bool IsFocusableWholePath();
622     bool IsOnRootTree() const;
623 
624     bool IsFocusable();
625     bool IsFocusableNode();
626     bool IsFocusableScope();
627 
IsParentFocusable()628     bool IsParentFocusable() const
629     {
630         return parentFocusable_;
631     }
632     void SetParentFocusable(bool parentFocusable);
633 
634     void RefreshFocus();
635 
636     void SetFocusable(bool focusable, bool isExplicit = true);
637     void SetShow(bool show);
638     void SetEnabled(bool enabled);
639 
640     bool IsShow() const;
641 
642     bool IsEnabled() const;
643 
IsCurrentFocus()644     bool IsCurrentFocus() const
645     {
646         return currentFocus_;
647     }
648     bool IsCurrentFocusWholePath();
649 
ClearUserOnFocus()650     void ClearUserOnFocus()
651     {
652         if (focusCallbackEvents_) {
653             focusCallbackEvents_->ClearOnFocusCallback();
654         }
655     }
656 
SetOnFocusCallback(OnFocusFunc && onFocusCallback)657     void SetOnFocusCallback(OnFocusFunc&& onFocusCallback)
658     {
659         if (!focusCallbackEvents_) {
660             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
661         }
662         focusCallbackEvents_->SetOnFocusCallback(std::move(onFocusCallback));
663     }
GetOnFocusCallback()664     OnFocusFunc GetOnFocusCallback()
665     {
666         return focusCallbackEvents_ ? focusCallbackEvents_->GetOnFocusCallback() : nullptr;
667     }
668 
ClearUserOnBlur()669     void ClearUserOnBlur()
670     {
671         if (focusCallbackEvents_) {
672             focusCallbackEvents_->ClearOnBlurCallback();
673         }
674     }
675 
SetOnBlurCallback(OnBlurFunc && onBlurCallback)676     void SetOnBlurCallback(OnBlurFunc&& onBlurCallback)
677     {
678         if (!focusCallbackEvents_) {
679             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
680         }
681         focusCallbackEvents_->SetOnBlurCallback(std::move(onBlurCallback));
682     }
683 
GetOnBlurCallback()684     OnBlurFunc GetOnBlurCallback()
685     {
686         return focusCallbackEvents_ ? focusCallbackEvents_->GetOnBlurCallback() : nullptr;
687     }
688 
SetOnKeyCallback(OnKeyCallbackFunc && onKeyCallback)689     void SetOnKeyCallback(OnKeyCallbackFunc&& onKeyCallback)
690     {
691         if (!focusCallbackEvents_) {
692             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
693         }
694         focusCallbackEvents_->SetOnKeyEventCallback(std::move(onKeyCallback));
695     }
696 
ClearUserOnKey()697     void ClearUserOnKey()
698     {
699         if (focusCallbackEvents_) {
700             focusCallbackEvents_->ClearOnKeyEventCallback();
701         }
702     }
703 
GetOnKeyCallback()704     OnKeyCallbackFunc GetOnKeyCallback()
705     {
706         return focusCallbackEvents_ ? focusCallbackEvents_->GetOnKeyEventCallback() : nullptr;
707     }
708 
SetOnClickCallback(GestureEventFunc && onClickCallback)709     void SetOnClickCallback(GestureEventFunc&& onClickCallback)
710     {
711         if (!focusCallbackEvents_) {
712             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
713         }
714         focusCallbackEvents_->SetOnClickCallback(std::move(onClickCallback));
715     }
GetOnClickCallback()716     GestureEventFunc GetOnClickCallback()
717     {
718         return focusCallbackEvents_ ? focusCallbackEvents_->GetOnClickCallback() : nullptr;
719     }
720 
SetOnFocusInternal(OnFocusFunc && onFocusInternal)721     void SetOnFocusInternal(OnFocusFunc&& onFocusInternal)
722     {
723         onFocusInternal_ = std::move(onFocusInternal);
724     }
SetOnBlurInternal(OnBlurFunc && onBlurInternal)725     void SetOnBlurInternal(OnBlurFunc&& onBlurInternal)
726     {
727         onBlurInternal_ = std::move(onBlurInternal);
728     }
SetOnBlurReasonInternal(OnBlurReasonFunc && onBlurReasonInternal)729     void SetOnBlurReasonInternal(OnBlurReasonFunc&& onBlurReasonInternal)
730     {
731         onBlurReasonInternal_ = std::move(onBlurReasonInternal);
732     }
SetOnPreFocusCallback(OnPreFocusFunc && onPreFocusCallback)733     void SetOnPreFocusCallback(OnPreFocusFunc&& onPreFocusCallback)
734     {
735         onPreFocusCallback_ = std::move(onPreFocusCallback);
736     }
737 
SetOnClearFocusStateInternal(OnClearFocusStateFunc && onClearFocusCallback)738     void SetOnClearFocusStateInternal(OnClearFocusStateFunc&& onClearFocusCallback)
739     {
740         onClearFocusStateCallback_ = std::move(onClearFocusCallback);
741     }
742 
SetOnPaintFocusStateInternal(OnPaintFocusStateFunc && onPaintFocusCallback)743     void SetOnPaintFocusStateInternal(OnPaintFocusStateFunc&& onPaintFocusCallback)
744     {
745         onPaintFocusStateCallback_ = std::move(onPaintFocusCallback);
746     }
747 
748     void SetOnKeyEventInternal(OnKeyEventFunc&& onKeyEvent, OnKeyEventType type = OnKeyEventType::DEFAULT)
749     {
750         onKeyEventsInternal_[type] = std::move(onKeyEvent);
751     }
752 
FindContextMenuOnKeyEvent(OnKeyEventType type)753     bool FindContextMenuOnKeyEvent(OnKeyEventType type)
754     {
755         return (onKeyEventsInternal_.find(type) != onKeyEventsInternal_.end());
756     }
757 
ProcessOnKeyEventInternal(const KeyEvent & event)758     bool ProcessOnKeyEventInternal(const KeyEvent& event)
759     {
760         bool result = false;
761         for (const auto& onKeyEvent : onKeyEventsInternal_) {
762             auto callback = onKeyEvent.second;
763             if (callback && callback(event)) {
764                 result = true;
765             }
766         }
767         return result;
768     }
769 
770     std::list<RefPtr<FocusHub>>::iterator FlushChildrenFocusHub(std::list<RefPtr<FocusHub>>& focusNodes);
771 
GetChildren()772     std::list<RefPtr<FocusHub>> GetChildren()
773     {
774         std::list<RefPtr<FocusHub>> focusNodes;
775         FlushChildrenFocusHub(focusNodes);
776         return focusNodes;
777     }
778 
IsChild()779     bool IsChild() const
780     {
781         return focusType_ == FocusType::NODE;
782     }
783 
SetRect(const RectF & rect)784     void SetRect(const RectF& rect)
785     {
786         rectFromOrigin_ = rect;
787     }
GetRect()788     const RectF& GetRect() const
789     {
790         return rectFromOrigin_;
791     }
792 
793     void DumpFocusTree(int32_t depth);
794     void DumpFocusNodeTree(int32_t depth);
795     void DumpFocusScopeTree(int32_t depth);
796 
797     bool OnClick(const KeyEvent& event);
798 
SetFocusType(FocusType type)799     void SetFocusType(FocusType type)
800     {
801         if (focusType_ != type && type == FocusType::DISABLE) {
802             RemoveSelf(BlurReason::FOCUS_SWITCH);
803         }
804         focusType_ = type;
805     }
GetFocusType()806     FocusType GetFocusType() const
807     {
808         return focusType_;
809     }
810 
GetTabIndex()811     int32_t GetTabIndex() const
812     {
813         return focusCallbackEvents_ ? focusCallbackEvents_->GetTabIndex() : 0;
814     }
SetTabIndex(int32_t tabIndex)815     void SetTabIndex(int32_t tabIndex)
816     {
817         if (!focusCallbackEvents_) {
818             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
819         }
820         focusCallbackEvents_->SetTabIndex(tabIndex);
821     }
822 
IsDefaultFocus()823     bool IsDefaultFocus() const
824     {
825         return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultFocus() : false;
826     }
827     void SetIsDefaultFocus(bool isDefaultFocus);
828 
IsDefaultGroupFocus()829     bool IsDefaultGroupFocus() const
830     {
831         return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultGroupFocus() : false;
832     }
833     void SetIsDefaultGroupFocus(bool isDefaultGroupFocus);
834 
GetDefaultFocusNode()835     WeakPtr<FocusHub> GetDefaultFocusNode() const
836     {
837         return focusCallbackEvents_ ? focusCallbackEvents_->GetDefaultFocusNode() : nullptr;
838     }
SetDefaultFocusNode(const WeakPtr<FocusHub> & node)839     void SetDefaultFocusNode(const WeakPtr<FocusHub>& node)
840     {
841         if (!focusCallbackEvents_) {
842             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
843         }
844         focusCallbackEvents_->SetDefaultFocusNode(node);
845     }
846 
IsFocusOnTouch()847     std::optional<bool> IsFocusOnTouch() const
848     {
849         return focusCallbackEvents_ ? focusCallbackEvents_->IsFocusOnTouch() : std::nullopt;
850     }
851     void SetIsFocusOnTouch(bool isFocusOnTouch);
852 
SetIsDefaultHasFocused(bool isDefaultHasFocused)853     void SetIsDefaultHasFocused(bool isDefaultHasFocused)
854     {
855         if (!focusCallbackEvents_) {
856             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
857         }
858         focusCallbackEvents_->SetIsDefaultHasFocused(isDefaultHasFocused);
859     }
IsDefaultHasFocused()860     bool IsDefaultHasFocused() const
861     {
862         return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultHasFocused() : false;
863     }
864 
SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)865     void SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)
866     {
867         if (!focusCallbackEvents_) {
868             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
869         }
870         focusCallbackEvents_->SetIsDefaultGroupHasFocused(isDefaultGroupHasFocused);
871     }
872 
IsDefaultGroupHasFocused()873     bool IsDefaultGroupHasFocused() const
874     {
875         return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultGroupHasFocused() : false;
876     }
877 
SetIsViewRootScopeFocused(const RefPtr<FocusHub> & viewRootScope,bool isViewRootScopeFocused)878     void SetIsViewRootScopeFocused(const RefPtr<FocusHub>& viewRootScope, bool isViewRootScopeFocused)
879     {
880         isViewRootScopeFocused_ = isViewRootScopeFocused;
881         if (viewRootScope) {
882             viewRootScope->SetFocusDependence(isViewRootScopeFocused ? FocusDependence::SELF : FocusDependence::AUTO);
883         }
884     }
GetIsViewRootScopeFocused()885     bool GetIsViewRootScopeFocused() const
886     {
887         return isViewRootScopeFocused_;
888     }
889 
IsImplicitFocusableScope()890     bool IsImplicitFocusableScope() const
891     {
892         return (focusType_ == FocusType::SCOPE) && focusable_ && implicitFocusable_;
893     }
894 
895     std::optional<std::string> GetInspectorKey() const;
896 
897     bool PaintFocusState(bool isNeedStateStyles = true, bool forceUpdate = false);
898     bool PaintAllFocusState();
899     bool PaintInnerFocusState(const RoundRect& paintRect, bool forceUpdate = false);
900     void ClearFocusState(bool isNeedStateStyles = true);
901     void ClearAllFocusState();
902 
SetInnerFocusPaintRectCallback(const std::function<void (RoundRect &)> & callback)903     void SetInnerFocusPaintRectCallback(const std::function<void(RoundRect&)>& callback)
904     {
905         getInnerFocusRectFunc_ = callback;
906     }
907 
SetLastWeakFocusNode(const WeakPtr<FocusHub> & focusHub)908     void SetLastWeakFocusNode(const WeakPtr<FocusHub>& focusHub)
909     {
910         lastWeakFocusNode_ = focusHub;
911     }
GetLastWeakFocusNode()912     WeakPtr<FocusHub> GetLastWeakFocusNode() const
913     {
914         return lastWeakFocusNode_;
915     }
916 
SetIsFocusUnit(bool isFocusUnit)917     void SetIsFocusUnit(bool isFocusUnit)
918     {
919         isFocusUnit_ = isFocusUnit;
920     }
921 
GetFocusDependence()922     FocusDependence GetFocusDependence() const
923     {
924         return focusDepend_;
925     }
SetFocusDependence(FocusDependence focusDepend)926     void SetFocusDependence(FocusDependence focusDepend)
927     {
928         focusDepend_ = focusDepend;
929     }
930 
SetIsViewHasFocused(bool isViewHasFocused)931     void SetIsViewHasFocused(bool isViewHasFocused)
932     {
933         isViewHasFocused_ = isViewHasFocused;
934     }
GetIsViewHasFocused()935     bool GetIsViewHasFocused() const
936     {
937         return isViewHasFocused_;
938     }
939 
GetFocusableCount()940     size_t GetFocusableCount()
941     {
942         size_t count = 0;
943         auto children = GetChildren();
944         for (const auto& child : children) {
945             if (child->IsFocusable()) {
946                 count++;
947             }
948         }
949         return count;
950     }
951 
SetIsFocusActiveWhenFocused(bool value)952     void SetIsFocusActiveWhenFocused(bool value)
953     {
954         isFocusActiveWhenFocused_ = value;
955     }
GetIsFocusActiveWhenFocused()956     bool GetIsFocusActiveWhenFocused() const
957     {
958         return isFocusActiveWhenFocused_;
959     }
960 
IsFocusStepVertical(FocusStep step)961     static inline bool IsFocusStepVertical(FocusStep step)
962     {
963         return (static_cast<uint32_t>(step) & 0x1) == 0;
964     }
965 
IsFocusStepForward(FocusStep step)966     static inline bool IsFocusStepForward(FocusStep step)
967     {
968         return (static_cast<uint32_t>(step) & MASK_FOCUS_STEP_FORWARD) != 0;
969     }
970 
IsFocusStepTab(FocusStep step)971     static inline bool IsFocusStepTab(FocusStep step)
972     {
973         return (static_cast<uint32_t>(step) & MASK_FOCUS_STEP_TAB) == MASK_FOCUS_STEP_TAB;
974     }
975 
976     static double GetProjectAreaOnRect(const RectF& rect, const RectF& projectRect, FocusStep step);
977 
978 protected:
979     bool OnKeyEvent(const KeyEvent& keyEvent);
980     bool OnKeyEventNode(const KeyEvent& keyEvent);
981     bool OnKeyEventScope(const KeyEvent& keyEvent);
982 
983     bool AcceptFocusOfSpecifyChild(FocusStep step);
984     bool AcceptFocusOfLastFocus();
985     bool AcceptFocusByRectOfLastFocus(const RectF& rect);
986     bool AcceptFocusByRectOfLastFocusNode(const RectF& rect);
987     bool AcceptFocusByRectOfLastFocusScope(const RectF& rect);
988     bool AcceptFocusByRectOfLastFocusFlex(const RectF& rect);
989 
990     bool CalculateRect(const RefPtr<FocusHub>& childNode, RectF& rect) const;
991     bool RequestNextFocus(FocusStep moveStep, const RectF& rect);
992     bool FocusToHeadOrTailChild(bool isHead);
993 
994     void OnFocus();
995     void OnFocusNode();
996     void OnFocusScope(bool currentHasFocused = false);
997     void OnBlur();
998     void OnBlurNode();
999     void OnBlurScope();
1000 
HandleFocus()1001     void HandleFocus()
1002     {
1003         // Need update: void RenderNode::MoveWhenOutOfViewPort(bool hasEffect)
1004         OnFocus();
1005     }
1006 
1007 private:
1008     bool CalculatePosition();
1009 
1010     void SetScopeFocusAlgorithm();
1011 
1012     void SetLastFocusNodeIndex(const RefPtr<FocusHub>& focusNode);
1013 
1014     void ScrollToLastFocusIndex() const;
1015 
1016     void CheckFocusStateStyle(bool onFocus);
1017     bool HasFocusStateStyle();
1018 
1019     bool IsNeedPaintFocusState();
1020 
1021     RefPtr<FocusHub> GetNearestNodeByProjectArea(const std::list<RefPtr<FocusHub>>& allNodes, FocusStep step);
1022 
1023     OnFocusFunc onFocusInternal_;
1024     OnBlurFunc onBlurInternal_;
1025     OnBlurReasonFunc onBlurReasonInternal_;
1026     std::unordered_map<OnKeyEventType, OnKeyEventFunc> onKeyEventsInternal_;
1027     OnPreFocusFunc onPreFocusCallback_;
1028     OnClearFocusStateFunc onClearFocusStateCallback_;
1029     OnPaintFocusStateFunc onPaintFocusStateCallback_;
1030 
1031     RefPtr<FocusCallbackEvents> focusCallbackEvents_;
1032 
1033     RefPtr<TouchEventImpl> focusOnTouchListener_;
1034 
1035     WeakPtr<EventHub> eventHub_;
1036 
1037     WeakPtr<FocusHub> lastWeakFocusNode_ { nullptr };
1038     int32_t lastFocusNodeIndex_ { -1 };
1039     int32_t lastTabIndexNodeId_ { DEFAULT_TAB_FOCUSED_INDEX };
1040 
1041     bool focusable_ { true };
1042     bool isFocusableExplicit_ { false };
1043     bool implicitFocusable_ { false };
1044     bool parentFocusable_ { true };
1045     bool currentFocus_ { false };
1046     bool isFocusUnit_ { false };
1047     bool isViewRootScopeFocused_ { true };
1048     bool isViewHasFocused_ { false };
1049     bool hasForwardMovement_ { false };
1050     bool hasBackwardMovement_ { false };
1051     bool isFocusActiveWhenFocused_ { false };
1052 
1053     FocusType focusType_ = FocusType::DISABLE;
1054     FocusStyleType focusStyleType_ = FocusStyleType::NONE;
1055     std::unique_ptr<FocusPaintParam> focusPaintParamsPtr_;
1056     std::function<void(RoundRect&)> getInnerFocusRectFunc_;
1057 
1058     RectF rectFromOrigin_;
1059     ScopeFocusAlgorithm focusAlgorithm_;
1060     BlurReason blurReason_ = BlurReason::FOCUS_SWITCH;
1061     FocusDependence focusDepend_ = FocusDependence::CHILD;
1062 };
1063 } // namespace OHOS::Ace::NG
1064 
1065 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HUB_H
1066