• 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_info.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 class ACE_EXPORT FocusPaintParam : public virtual AceType {
81     DECLARE_ACE_TYPE(FocusPaintParam, AceType)
82 
83 public:
84     FocusPaintParam() = default;
85     ~FocusPaintParam() override = default;
86 
HasPaintRect()87     bool HasPaintRect() const
88     {
89         return paintRect.has_value();
90     }
GetPaintRect()91     const RoundRect& GetPaintRect() const
92     {
93         return paintRect.value();
94     }
95 
HasPaintColor()96     bool HasPaintColor() const
97     {
98         return paintColor.has_value();
99     }
GetPaintColor()100     const Color& GetPaintColor() const
101     {
102         return paintColor.value();
103     }
104 
HasPaintWidth()105     bool HasPaintWidth() const
106     {
107         return paintWidth.has_value();
108     }
GetPaintWidth()109     const Dimension& GetPaintWidth() const
110     {
111         return paintWidth.value();
112     }
113 
HasFocusPadding()114     bool HasFocusPadding() const
115     {
116         return focusPadding.has_value();
117     }
GetFocusPadding()118     const Dimension& GetFocusPadding() const
119     {
120         return focusPadding.value();
121     }
SetPaintRect(const RoundRect & rect)122     void SetPaintRect(const RoundRect& rect)
123     {
124         paintRect = rect;
125     }
SetPaintColor(const Color & color)126     void SetPaintColor(const Color& color)
127     {
128         paintColor = color;
129     }
SetPaintWidth(const Dimension & width)130     void SetPaintWidth(const Dimension& width)
131     {
132         paintWidth = width;
133     }
SetFocusPadding(const Dimension & padding)134     void SetFocusPadding(const Dimension& padding)
135     {
136         focusPadding = padding;
137     }
138 
139 private:
140     std::optional<RoundRect> paintRect;
141     std::optional<Color> paintColor;
142     std::optional<Dimension> paintWidth;
143     std::optional<Dimension> focusPadding;
144 };
145 
146 class ACE_EXPORT FocusPattern : public virtual AceType {
147     DECLARE_ACE_TYPE(FocusPattern, AceType)
148 
149 public:
150     FocusPattern() = default;
FocusPattern(FocusType focusType,bool focusable)151     FocusPattern(FocusType focusType, bool focusable) : focusType_(focusType), focusable_(focusable) {}
FocusPattern(FocusType focusType,bool focusable,FocusStyleType styleType)152     FocusPattern(FocusType focusType, bool focusable, FocusStyleType styleType)
153         : focusType_(focusType), focusable_(focusable), styleType_(styleType)
154     {}
FocusPattern(FocusType focusType,bool focusable,FocusStyleType styleType,const FocusPaintParam & paintParams)155     FocusPattern(FocusType focusType, bool focusable, FocusStyleType styleType, const FocusPaintParam& paintParams)
156         : focusType_(focusType), focusable_(focusable), styleType_(styleType)
157     {
158         if (!paintParams_) {
159             paintParams_ = std::make_unique<FocusPaintParam>();
160         }
161         if (paintParams.HasPaintRect()) {
162             paintParams_->SetPaintRect(paintParams.GetPaintRect());
163         }
164         if (paintParams.HasPaintColor()) {
165             paintParams_->SetPaintColor(paintParams.GetPaintColor());
166         }
167         if (paintParams.HasPaintWidth()) {
168             paintParams_->SetPaintWidth(paintParams.GetPaintWidth());
169         }
170         if (paintParams.HasFocusPadding()) {
171             paintParams_->SetFocusPadding(paintParams.GetFocusPadding());
172         }
173     }
174     ~FocusPattern() override = default;
175 
GetFocusType()176     FocusType GetFocusType() const
177     {
178         return focusType_;
179     }
SetFocusType(FocusType type)180     void SetFocusType(FocusType type)
181     {
182         focusType_ = type;
183     }
184 
GetFocusable()185     bool GetFocusable() const
186     {
187         return focusable_;
188     }
SetFocusable(bool focusable)189     void SetFocusable(bool focusable)
190     {
191         focusable_ = focusable;
192     }
193 
GetStyleType()194     FocusStyleType GetStyleType() const
195     {
196         return styleType_;
197     }
SetStyleType(FocusStyleType styleType)198     void SetStyleType(FocusStyleType styleType)
199     {
200         styleType_ = styleType;
201     }
202 
GetFocusPaintParams()203     const std::unique_ptr<FocusPaintParam>& GetFocusPaintParams() const
204     {
205         return paintParams_;
206     }
SetFocusPaintParams(const FocusPaintParam & paintParams)207     void SetFocusPaintParams(const FocusPaintParam& paintParams)
208     {
209         if (!paintParams_) {
210             paintParams_ = std::make_unique<FocusPaintParam>();
211         }
212         if (paintParams.HasPaintRect()) {
213             paintParams_->SetPaintRect(paintParams.GetPaintRect());
214         }
215         if (paintParams.HasPaintColor()) {
216             paintParams_->SetPaintColor(paintParams.GetPaintColor());
217         }
218         if (paintParams.HasPaintWidth()) {
219             paintParams_->SetPaintWidth(paintParams.GetPaintWidth());
220         }
221         if (paintParams.HasFocusPadding()) {
222             paintParams_->SetFocusPadding(paintParams.GetFocusPadding());
223         }
224     }
225 
226 private:
227     FocusType focusType_ = FocusType::DISABLE;
228     bool focusable_ = false;
229     FocusStyleType styleType_ = FocusStyleType::NONE;
230     std::unique_ptr<FocusPaintParam> paintParams_ = nullptr;
231 };
232 
233 struct ScopeFocusAlgorithm final {
234     ScopeFocusAlgorithm() = default;
ScopeFocusAlgorithmfinal235     ScopeFocusAlgorithm(bool isVertical, bool isLeftToRight, ScopeType scopeType)
236         : isVertical(isVertical), isLeftToRight(isLeftToRight), scopeType(scopeType)
237     {}
ScopeFocusAlgorithmfinal238     ScopeFocusAlgorithm(bool isVertical, bool isLeftToRight, ScopeType scopeType, GetNextFocusNodeFunc&& function)
239         : isVertical(isVertical), isLeftToRight(isLeftToRight), scopeType(scopeType),
240           getNextFocusNode(std::move(function))
241     {}
242     ~ScopeFocusAlgorithm() = default;
243 
244     bool isVertical { true };
245     bool isLeftToRight { true };
246     ScopeType scopeType { ScopeType::OTHERS };
247     GetNextFocusNodeFunc getNextFocusNode;
248 };
249 
250 class ACE_EXPORT FocusCallbackEvents : public virtual AceType {
251     DECLARE_ACE_TYPE(FocusCallbackEvents, AceType)
252 public:
253     FocusCallbackEvents() = default;
254     ~FocusCallbackEvents() override = default;
255 
ClearOnFocusCallback()256     void ClearOnFocusCallback()
257     {
258         if (onFocusCallback_) {
259             onFocusCallback_ = nullptr;
260         }
261     }
262 
SetOnFocusCallback(OnFocusFunc && onFocusCallback)263     void SetOnFocusCallback(OnFocusFunc&& onFocusCallback)
264     {
265         onFocusCallback_ = std::move(onFocusCallback);
266     }
267 
GetOnFocusCallback()268     const OnFocusFunc& GetOnFocusCallback()
269     {
270         return onFocusCallback_;
271     }
272 
ClearOnBlurCallback()273     void ClearOnBlurCallback()
274     {
275         if (onBlurCallback_) {
276             onBlurCallback_ = nullptr;
277         }
278     }
279 
SetOnBlurCallback(OnBlurFunc && onBlurCallback)280     void SetOnBlurCallback(OnBlurFunc&& onBlurCallback)
281     {
282         onBlurCallback_ = std::move(onBlurCallback);
283     }
284 
GetOnBlurCallback()285     const OnBlurFunc& GetOnBlurCallback()
286     {
287         return onBlurCallback_;
288     }
289 
SetOnKeyEventCallback(OnKeyCallbackFunc && onKeyEventCallback)290     void SetOnKeyEventCallback(OnKeyCallbackFunc&& onKeyEventCallback)
291     {
292         onKeyEventCallback_ = std::move(onKeyEventCallback);
293     }
294 
ClearOnKeyEventCallback()295     void ClearOnKeyEventCallback()
296     {
297         if (onKeyEventCallback_) {
298             onKeyEventCallback_ = nullptr;
299         }
300     }
301 
GetOnKeyEventCallback()302     const OnKeyCallbackFunc& GetOnKeyEventCallback()
303     {
304         return onKeyEventCallback_;
305     }
306 
SetOnClickCallback(GestureEventFunc && onClickEventCallback)307     void SetOnClickCallback(GestureEventFunc&& onClickEventCallback)
308     {
309         onClickEventCallback_ = std::move(onClickEventCallback);
310     }
311 
GetOnClickCallback()312     const GestureEventFunc& GetOnClickCallback()
313     {
314         return onClickEventCallback_;
315     }
316 
GetTabIndex()317     int32_t GetTabIndex() const
318     {
319         return tabIndex_;
320     }
321 
SetTabIndex(int32_t tabIndex)322     void SetTabIndex(int32_t tabIndex)
323     {
324         tabIndex_ = tabIndex;
325     }
326 
IsDefaultFocus()327     bool IsDefaultFocus() const
328     {
329         return isDefaultFocus_;
330     }
331 
SetIsDefaultFocus(bool isDefaultFocus)332     void SetIsDefaultFocus(bool isDefaultFocus)
333     {
334         isDefaultFocus_ = isDefaultFocus;
335     }
336 
IsDefaultGroupFocus()337     bool IsDefaultGroupFocus() const
338     {
339         return isDefaultGroupFocus_;
340     }
341 
SetIsDefaultGroupFocus(bool isDefaultGroupFocus)342     void SetIsDefaultGroupFocus(bool isDefaultGroupFocus)
343     {
344         isDefaultGroupFocus_ = isDefaultGroupFocus;
345     }
346 
GetDefaultFocusNode()347     WeakPtr<FocusHub> GetDefaultFocusNode() const
348     {
349         return defaultFocusNode_;
350     }
351 
SetDefaultFocusNode(const WeakPtr<FocusHub> & node)352     void SetDefaultFocusNode(const WeakPtr<FocusHub>& node)
353     {
354         defaultFocusNode_ = node;
355     }
356 
IsFocusOnTouch()357     std::optional<bool> IsFocusOnTouch() const
358     {
359         return isFocusOnTouch_;
360     }
361 
SetIsFocusOnTouch(bool isFocusOnTouch)362     void SetIsFocusOnTouch(bool isFocusOnTouch)
363     {
364         isFocusOnTouch_ = isFocusOnTouch;
365     }
366 
SetIsDefaultHasFocused(bool isDefaultHasFocused)367     void SetIsDefaultHasFocused(bool isDefaultHasFocused)
368     {
369         isDefaultHasFocused_ = isDefaultHasFocused;
370     }
371 
IsDefaultHasFocused()372     bool IsDefaultHasFocused() const
373     {
374         return isDefaultHasFocused_;
375     }
376 
SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)377     void SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)
378     {
379         isDefaultGroupHasFocused_ = isDefaultGroupHasFocused;
380     }
381 
IsDefaultGroupHasFocused()382     bool IsDefaultGroupHasFocused() const
383     {
384         return isDefaultGroupHasFocused_;
385     }
386 
387 private:
388     OnFocusFunc onFocusCallback_;
389     OnBlurFunc onBlurCallback_;
390     OnKeyCallbackFunc onKeyEventCallback_;
391     GestureEventFunc onClickEventCallback_;
392 
393     WeakPtr<FocusHub> defaultFocusNode_;
394 
395     std::optional<bool> isFocusOnTouch_;
396     bool isDefaultFocus_ = { false };
397     bool isDefaultHasFocused_ = { false };
398     bool isDefaultGroupFocus_ = { false };
399     bool isDefaultGroupHasFocused_ { false };
400 
401     int32_t tabIndex_ = 0;
402 };
403 
404 class ACE_EXPORT FocusHub : public virtual AceType {
DECLARE_ACE_TYPE(FocusHub,AceType)405     DECLARE_ACE_TYPE(FocusHub, AceType)
406 public:
407     explicit FocusHub(const WeakPtr<EventHub>& eventHub, FocusType type = FocusType::DISABLE, bool focusable = false)
408         : eventHub_(eventHub), focusable_(focusable), focusType_(type)
409     {
410         MarkRootFocusNeedUpdate();
411     }
412     ~FocusHub() override = default;
413 
SetFocusStyleType(FocusStyleType type)414     void SetFocusStyleType(FocusStyleType type)
415     {
416         focusStyleType_ = type;
417     }
SetFocusPaintParamsPtr(const std::unique_ptr<FocusPaintParam> & paramsPtr)418     void SetFocusPaintParamsPtr(const std::unique_ptr<FocusPaintParam>& paramsPtr)
419     {
420         CHECK_NULL_VOID(paramsPtr);
421         if (!focusPaintParamsPtr_) {
422             focusPaintParamsPtr_ = std::make_unique<FocusPaintParam>();
423         }
424         if (paramsPtr->HasPaintRect()) {
425             focusPaintParamsPtr_->SetPaintRect(paramsPtr->GetPaintRect());
426         }
427         if (paramsPtr->HasPaintColor()) {
428             focusPaintParamsPtr_->SetPaintColor(paramsPtr->GetPaintColor());
429         }
430         if (paramsPtr->HasPaintWidth()) {
431             focusPaintParamsPtr_->SetPaintWidth(paramsPtr->GetPaintWidth());
432         }
433         if (paramsPtr->HasFocusPadding()) {
434             focusPaintParamsPtr_->SetFocusPadding(paramsPtr->GetFocusPadding());
435         }
436     }
437 
HasPaintRect()438     bool HasPaintRect() const
439     {
440         return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintRect() : false;
441     }
GetPaintRect()442     RoundRect GetPaintRect() const
443     {
444         CHECK_NULL_RETURN(focusPaintParamsPtr_, RoundRect());
445         return focusPaintParamsPtr_->GetPaintRect();
446     }
447 
HasPaintColor()448     bool HasPaintColor() const
449     {
450         return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintColor() : false;
451     }
GetPaintColor()452     const Color& GetPaintColor() const
453     {
454         CHECK_NULL_RETURN(focusPaintParamsPtr_, Color::TRANSPARENT);
455         return focusPaintParamsPtr_->GetPaintColor();
456     }
457 
HasPaintWidth()458     bool HasPaintWidth() const
459     {
460         return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintWidth() : false;
461     }
GetPaintWidth()462     Dimension GetPaintWidth() const
463     {
464         CHECK_NULL_RETURN(focusPaintParamsPtr_, Dimension());
465         return focusPaintParamsPtr_->GetPaintWidth();
466     }
467 
HasFocusPadding()468     bool HasFocusPadding() const
469     {
470         return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasFocusPadding() : false;
471     }
GetFocusPadding()472     Dimension GetFocusPadding() const
473     {
474         CHECK_NULL_RETURN(focusPaintParamsPtr_, Dimension());
475         return focusPaintParamsPtr_->GetFocusPadding();
476     }
SetPaintRect(const RoundRect & rect)477     void SetPaintRect(const RoundRect& rect)
478     {
479         if (!focusPaintParamsPtr_) {
480             focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>();
481         }
482         focusPaintParamsPtr_->SetPaintRect(rect);
483     }
SetPaintColor(const Color & color)484     void SetPaintColor(const Color& color)
485     {
486         if (!focusPaintParamsPtr_) {
487             focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>();
488         }
489         focusPaintParamsPtr_->SetPaintColor(color);
490     }
SetPaintWidth(const Dimension & width)491     void SetPaintWidth(const Dimension& width)
492     {
493         if (!focusPaintParamsPtr_) {
494             focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>();
495         }
496         focusPaintParamsPtr_->SetPaintWidth(width);
497     }
SetFocusPadding(const Dimension & padding)498     void SetFocusPadding(const Dimension& padding)
499     {
500         if (!focusPaintParamsPtr_) {
501             focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>();
502         }
503         focusPaintParamsPtr_->SetFocusPadding(padding);
504     }
505 
506     RefPtr<FrameNode> GetFrameNode() const;
507     RefPtr<GeometryNode> GetGeometryNode() const;
508     RefPtr<FocusHub> GetParentFocusHub() const;
509     std::string GetFrameName() const;
510     int32_t GetFrameId() const;
511 
512     bool HandleKeyEvent(const KeyEvent& keyEvent);
513     bool RequestFocusImmediately(bool isWholePathFocusable = false);
514     void RequestFocus() const;
515     void RequestFocusWithDefaultFocusFirstly() const;
516     void UpdateAccessibilityFocusInfo();
517     void SwitchFocus(const RefPtr<FocusHub>& focusNode);
518 
519     void LostFocus(BlurReason reason = BlurReason::FOCUS_SWITCH);
520     void LostSelfFocus();
521     void RemoveSelf();
522     void RemoveChild(const RefPtr<FocusHub>& focusNode);
523     bool GoToNextFocusLinear(FocusStep step, const RectF& rect = RectF());
524     bool TryRequestFocus(const RefPtr<FocusHub>& focusNode, const RectF& rect, FocusStep step = FocusStep::NONE);
525 
526     void CollectTabIndexNodes(TabIndexNodeList& tabIndexNodes);
527     bool GoToFocusByTabNodeIdx(TabIndexNodeList& tabIndexNodes, int32_t tabNodeIdx);
528     bool HandleFocusByTabIndex(const KeyEvent& event, const RefPtr<FocusHub>& mainFocusHub);
529     RefPtr<FocusHub> GetChildFocusNodeByType(FocusNodeType nodeType = FocusNodeType::DEFAULT);
530     RefPtr<FocusHub> GetChildFocusNodeById(const std::string& id);
531     void HandleParentScroll() const;
532     int32_t GetFocusingTabNodeIdx(TabIndexNodeList& tabIndexNodes);
533     bool RequestFocusImmediatelyById(const std::string& id);
534 
535     bool IsFocusableByTab();
536     bool IsFocusableNodeByTab();
537     bool IsFocusableScopeByTab();
538 
539     bool IsFocusableWholePath();
540 
541     bool IsFocusable();
542     bool IsFocusableNode();
543     bool IsFocusableScope();
544 
IsParentFocusable()545     bool IsParentFocusable() const
546     {
547         return parentFocusable_;
548     }
SetParentFocusable(bool parentFocusable)549     void SetParentFocusable(bool parentFocusable)
550     {
551         LOGD("Set node: %{public}s/%{public}d parentFocusable from %{public}d to %{public}d", GetFrameName().c_str(),
552             GetFrameId(), parentFocusable_, parentFocusable);
553         parentFocusable_ = parentFocusable;
554     }
555 
556     void RefreshParentFocusable(bool focusable);
557 
558     void RefreshFocus();
559 
560     void SetFocusable(bool focusable);
561     void SetShow(bool show);
562     void SetShowNode(bool show);
563     void SetShowScope(bool show);
564     void SetEnabled(bool enabled);
565     void SetEnabledNode(bool enabled);
566     void SetEnabledScope(bool enabled);
567 
568     bool IsShow() const;
569 
570     bool IsEnabled() const;
571 
IsCurrentFocus()572     bool IsCurrentFocus() const
573     {
574         return currentFocus_;
575     }
576     bool IsCurrentFocusWholePath();
577 
578     void MarkRootFocusNeedUpdate();
579 
ClearUserOnFocus()580     void ClearUserOnFocus()
581     {
582         if (focusCallbackEvents_) {
583             focusCallbackEvents_->ClearOnFocusCallback();
584         }
585     }
586 
SetOnFocusCallback(OnFocusFunc && onFocusCallback)587     void SetOnFocusCallback(OnFocusFunc&& onFocusCallback)
588     {
589         if (!focusCallbackEvents_) {
590             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
591         }
592         focusCallbackEvents_->SetOnFocusCallback(std::move(onFocusCallback));
593     }
GetOnFocusCallback()594     OnFocusFunc GetOnFocusCallback()
595     {
596         return focusCallbackEvents_ ? focusCallbackEvents_->GetOnFocusCallback() : nullptr;
597     }
598 
ClearUserOnBlur()599     void ClearUserOnBlur()
600     {
601         if (focusCallbackEvents_) {
602             focusCallbackEvents_->ClearOnBlurCallback();
603         }
604     }
605 
SetOnBlurCallback(OnBlurFunc && onBlurCallback)606     void SetOnBlurCallback(OnBlurFunc&& onBlurCallback)
607     {
608         if (!focusCallbackEvents_) {
609             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
610         }
611         focusCallbackEvents_->SetOnBlurCallback(std::move(onBlurCallback));
612     }
613 
GetOnBlurCallback()614     OnBlurFunc GetOnBlurCallback()
615     {
616         return focusCallbackEvents_ ? focusCallbackEvents_->GetOnBlurCallback() : nullptr;
617     }
618 
SetOnKeyCallback(OnKeyCallbackFunc && onKeyCallback)619     void SetOnKeyCallback(OnKeyCallbackFunc&& onKeyCallback)
620     {
621         if (!focusCallbackEvents_) {
622             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
623         }
624         focusCallbackEvents_->SetOnKeyEventCallback(std::move(onKeyCallback));
625     }
626 
ClearUserOnKey()627     void ClearUserOnKey()
628     {
629         if (focusCallbackEvents_) {
630             focusCallbackEvents_->ClearOnKeyEventCallback();
631         }
632     }
633 
GetOnKeyCallback()634     OnKeyCallbackFunc GetOnKeyCallback()
635     {
636         return focusCallbackEvents_ ? focusCallbackEvents_->GetOnKeyEventCallback() : nullptr;
637     }
638 
SetOnClickCallback(GestureEventFunc && onClickCallback)639     void SetOnClickCallback(GestureEventFunc&& onClickCallback)
640     {
641         if (!focusCallbackEvents_) {
642             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
643         }
644         focusCallbackEvents_->SetOnClickCallback(std::move(onClickCallback));
645     }
GetOnClickCallback()646     GestureEventFunc GetOnClickCallback()
647     {
648         return focusCallbackEvents_ ? focusCallbackEvents_->GetOnClickCallback() : nullptr;
649     }
650 
SetOnFocusInternal(OnFocusFunc && onFocusInternal)651     void SetOnFocusInternal(OnFocusFunc&& onFocusInternal)
652     {
653         onFocusInternal_ = std::move(onFocusInternal);
654     }
SetOnBlurInternal(OnBlurFunc && onBlurInternal)655     void SetOnBlurInternal(OnBlurFunc&& onBlurInternal)
656     {
657         onBlurInternal_ = std::move(onBlurInternal);
658     }
SetOnBlurReasonInternal(OnBlurReasonFunc && onBlurReasonInternal)659     void SetOnBlurReasonInternal(OnBlurReasonFunc&& onBlurReasonInternal)
660     {
661         onBlurReasonInternal_ = std::move(onBlurReasonInternal);
662     }
SetOnPreFocusCallback(OnPreFocusFunc && onPreFocusCallback)663     void SetOnPreFocusCallback(OnPreFocusFunc&& onPreFocusCallback)
664     {
665         onPreFocusCallback_ = std::move(onPreFocusCallback);
666     }
667 
SetOnClearFocusStateInternal(OnClearFocusStateFunc && onClearFocusCallback)668     void SetOnClearFocusStateInternal(OnClearFocusStateFunc&& onClearFocusCallback)
669     {
670         onClearFocusStateCallback_ = std::move(onClearFocusCallback);
671     }
672 
SetOnPaintFocusStateInternal(OnPaintFocusStateFunc && onPaintFocusCallback)673     void SetOnPaintFocusStateInternal(OnPaintFocusStateFunc&& onPaintFocusCallback)
674     {
675         onPaintFocusStateCallback_ = std::move(onPaintFocusCallback);
676     }
677 
678     void SetOnKeyEventInternal(OnKeyEventFunc&& onKeyEvent, OnKeyEventType type = OnKeyEventType::DEFAULT)
679     {
680         onKeyEventsInternal_[type] = std::move(onKeyEvent);
681     }
ProcessOnKeyEventInternal(const KeyEvent & event)682     bool ProcessOnKeyEventInternal(const KeyEvent& event)
683     {
684         bool result = false;
685         for (const auto& onKeyEvent : onKeyEventsInternal_) {
686             auto callback = onKeyEvent.second;
687             if (callback && callback(event)) {
688                 result = true;
689             }
690         }
691         return result;
692     }
693 
694     std::list<RefPtr<FocusHub>>::iterator FlushChildrenFocusHub(std::list<RefPtr<FocusHub>>& focusNodes);
695 
GetChildren()696     std::list<RefPtr<FocusHub>> GetChildren()
697     {
698         std::list<RefPtr<FocusHub>> focusNodes;
699         FlushChildrenFocusHub(focusNodes);
700         return focusNodes;
701     }
702 
IsChild()703     bool IsChild() const
704     {
705         return focusType_ == FocusType::NODE;
706     }
707 
SetRect(const RectF & rect)708     void SetRect(const RectF& rect)
709     {
710         rectFromOrigin_ = rect;
711     }
GetRect()712     const RectF& GetRect() const
713     {
714         return rectFromOrigin_;
715     }
716 
717     void DumpFocusTree(int32_t depth);
718     void DumpFocusNodeTree(int32_t depth);
719     void DumpFocusScopeTree(int32_t depth);
720 
721     bool OnClick(const KeyEvent& event);
722 
SetFocusType(FocusType type)723     void SetFocusType(FocusType type)
724     {
725         focusType_ = type;
726     }
GetFocusType()727     FocusType GetFocusType() const
728     {
729         return focusType_;
730     }
731 
GetTabIndex()732     int32_t GetTabIndex() const
733     {
734         return focusCallbackEvents_ ? focusCallbackEvents_->GetTabIndex() : 0;
735     }
SetTabIndex(int32_t tabIndex)736     void SetTabIndex(int32_t tabIndex)
737     {
738         if (!focusCallbackEvents_) {
739             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
740         }
741         focusCallbackEvents_->SetTabIndex(tabIndex);
742     }
743 
IsDefaultFocus()744     bool IsDefaultFocus() const
745     {
746         return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultFocus() : false;
747     }
748     void SetIsDefaultFocus(bool isDefaultFocus);
749 
IsDefaultGroupFocus()750     bool IsDefaultGroupFocus() const
751     {
752         return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultGroupFocus() : false;
753     }
754     void SetIsDefaultGroupFocus(bool isDefaultGroupFocus);
755 
GetDefaultFocusNode()756     WeakPtr<FocusHub> GetDefaultFocusNode() const
757     {
758         return focusCallbackEvents_ ? focusCallbackEvents_->GetDefaultFocusNode() : nullptr;
759     }
SetDefaultFocusNode(const WeakPtr<FocusHub> & node)760     void SetDefaultFocusNode(const WeakPtr<FocusHub>& node)
761     {
762         if (!focusCallbackEvents_) {
763             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
764         }
765         focusCallbackEvents_->SetDefaultFocusNode(node);
766     }
767 
IsFocusOnTouch()768     std::optional<bool> IsFocusOnTouch() const
769     {
770         return focusCallbackEvents_ ? focusCallbackEvents_->IsFocusOnTouch() : std::nullopt;
771     }
772     void SetIsFocusOnTouch(bool isFocusOnTouch);
773 
SetIsDefaultHasFocused(bool isDefaultHasFocused)774     void SetIsDefaultHasFocused(bool isDefaultHasFocused)
775     {
776         if (!focusCallbackEvents_) {
777             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
778         }
779         focusCallbackEvents_->SetIsDefaultHasFocused(isDefaultHasFocused);
780     }
IsDefaultHasFocused()781     bool IsDefaultHasFocused() const
782     {
783         return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultHasFocused() : false;
784     }
785 
SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)786     void SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)
787     {
788         if (!focusCallbackEvents_) {
789             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();
790         }
791         focusCallbackEvents_->SetIsDefaultGroupHasFocused(isDefaultGroupHasFocused);
792     }
IsDefaultGroupHasFocused()793     bool IsDefaultGroupHasFocused() const
794     {
795         return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultGroupHasFocused() : false;
796     }
797 
798     std::optional<std::string> GetInspectorKey() const;
799 
800     bool PaintFocusState(bool isNeedStateStyles = true);
801     bool PaintAllFocusState();
802     bool PaintInnerFocusState(const RoundRect& paintRect);
803     void ClearFocusState(bool isNeedStateStyles = true);
804     void ClearAllFocusState();
805 
SetInnerFocusPaintRectCallback(const std::function<void (RoundRect &)> & callback)806     void SetInnerFocusPaintRectCallback(const std::function<void(RoundRect&)>& callback)
807     {
808         getInnerFocusRectFunc_ = callback;
809     }
810 
SetLastWeakFocusNode(const WeakPtr<FocusHub> & focusHub)811     void SetLastWeakFocusNode(const WeakPtr<FocusHub>& focusHub)
812     {
813         lastWeakFocusNode_ = focusHub;
814     }
GetLastWeakFocusNode()815     WeakPtr<FocusHub> GetLastWeakFocusNode() const
816     {
817         return lastWeakFocusNode_;
818     }
819 
SetIsFocusUnit(bool isFocusUnit)820     void SetIsFocusUnit(bool isFocusUnit)
821     {
822         isFocusUnit_ = isFocusUnit;
823     }
824 
IsFocusStepVertical(FocusStep step)825     static inline bool IsFocusStepVertical(FocusStep step)
826     {
827         return (static_cast<uint32_t>(step) & 0x1) == 0;
828     }
829 
IsFocusStepForward(FocusStep step)830     static inline bool IsFocusStepForward(FocusStep step)
831     {
832         return (static_cast<uint32_t>(step) & MASK_FOCUS_STEP_FORWARD) != 0;
833     }
834 
IsFocusStepTab(FocusStep step)835     static inline bool IsFocusStepTab(FocusStep step)
836     {
837         return (static_cast<uint32_t>(step) & MASK_FOCUS_STEP_TAB) == MASK_FOCUS_STEP_TAB;
838     }
839 
840     static double GetProjectAreaOnRect(const RectF& rect, const RectF& projectRect, FocusStep step);
841 
842 protected:
843     bool OnKeyEvent(const KeyEvent& keyEvent);
844     bool OnKeyEventNode(const KeyEvent& keyEvent);
845     bool OnKeyEventScope(const KeyEvent& keyEvent);
846 
847     bool AcceptFocusOfSpecifyChild(FocusStep step);
848     bool AcceptFocusOfLastFocus();
849     bool AcceptFocusByRectOfLastFocus(const RectF& rect);
850     bool AcceptFocusByRectOfLastFocusNode(const RectF& rect);
851     bool AcceptFocusByRectOfLastFocusScope(const RectF& rect);
852     bool AcceptFocusByRectOfLastFocusFlex(const RectF& rect);
853 
854     bool CalculateRect(const RefPtr<FocusHub>& childNode, RectF& rect) const;
855     bool RequestNextFocus(FocusStep moveStep, const RectF& rect);
856     bool FocusToHeadOrTailChild(bool isHead);
857 
858     void OnFocus();
859     void OnFocusNode();
860     void OnFocusScope();
861     void OnBlur();
862     void OnBlurNode();
863     void OnBlurScope();
864 
HandleFocus()865     void HandleFocus()
866     {
867         // Need update: void RenderNode::MoveWhenOutOfViewPort(bool hasEffect)
868         OnFocus();
869     }
870 
871 private:
872     bool CalculatePosition();
873 
874     void SetScopeFocusAlgorithm();
875 
876     void SetLastFocusNodeIndex(const RefPtr<FocusHub>& focusNode);
877 
878     void ScrollToLastFocusIndex() const;
879 
880     void CheckFocusStateStyle(bool onFocus);
881     bool HasFocusStateStyle();
882 
883     bool IsNeedPaintFocusState();
884 
885     RefPtr<FocusHub> GetNearestNodeByProjectArea(const std::list<RefPtr<FocusHub>>& allNodes, FocusStep step);
886 
887     OnFocusFunc onFocusInternal_;
888     OnBlurFunc onBlurInternal_;
889     OnBlurReasonFunc onBlurReasonInternal_;
890     std::unordered_map<OnKeyEventType, OnKeyEventFunc> onKeyEventsInternal_;
891     OnPreFocusFunc onPreFocusCallback_;
892     OnClearFocusStateFunc onClearFocusStateCallback_;
893     OnPaintFocusStateFunc onPaintFocusStateCallback_;
894 
895     RefPtr<FocusCallbackEvents> focusCallbackEvents_;
896 
897     RefPtr<TouchEventImpl> focusOnTouchListener_;
898 
899     WeakPtr<EventHub> eventHub_;
900 
901     WeakPtr<FocusHub> lastWeakFocusNode_ { nullptr };
902     int32_t lastFocusNodeIndex_ { -1 };
903 
904     bool focusable_ { true };
905     bool parentFocusable_ { true };
906     bool currentFocus_ { false };
907     bool isFirstFocusInPage_ { true };
908     bool isFocusUnit_ { false };
909 
910     FocusType focusType_ = FocusType::DISABLE;
911     FocusStyleType focusStyleType_ = FocusStyleType::NONE;
912     std::unique_ptr<FocusPaintParam> focusPaintParamsPtr_;
913     std::function<void(RoundRect&)> getInnerFocusRectFunc_;
914 
915     RectF rectFromOrigin_;
916     ScopeFocusAlgorithm focusAlgorithm_;
917     BlurReason blurReason_ = BlurReason::FOCUS_SWITCH;
918 };
919 } // namespace OHOS::Ace::NG
920 
921 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HUB_H
922