• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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_HANDLER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HANDLER_H
18 
19 #include "focus_state.h"
20 #include "core/event/focus_axis_event.h"
21 #include "core/event/crown_event.h"
22 #include "core/event/key_event.h"
23 #include "core/gestures/gesture_event.h"
24 namespace OHOS::Ace::NG {
25 #define ACE_DEFINE_FOCUS_EVENT(func, type, name)                               \
26 public:                                                                        \
27     void Set##func(type&& (name))                                              \
28     {                                                                          \
29         if (!focusCallbackEvents_) {                                           \
30             focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>();          \
31         }                                                                      \
32         focusCallbackEvents_->name##_ = std::move(name);                       \
33     }                                                                          \
34     void Clear##func()                                                         \
35     {                                                                          \
36         if (focusCallbackEvents_ && focusCallbackEvents_->name##_) {           \
37             focusCallbackEvents_->name##_ = nullptr;                           \
38         }                                                                      \
39     }                                                                          \
40     type Get##func()                                                           \
41     {                                                                          \
42         return focusCallbackEvents_ ? focusCallbackEvents_->name##_ : nullptr; \
43     }
44 
45 enum class FocusIntension : int32_t {
46     NONE = 0,
47     LEFT,
48     UP,
49     RIGHT,
50     DOWN,
51     TAB,
52     SHIFT_TAB,
53     HOME,
54     END,
55     SELECT,
56     SPACE,
57     ESC,
58 };
59 
60 struct FocusEvent {
FocusEventFocusEvent61     explicit FocusEvent(const NonPointerEvent& nonPointerEvent)
62         : intension(GetFocusIntension(nonPointerEvent)), event(nonPointerEvent)
63     {}
64 
65     FocusIntension intension;
66     const NonPointerEvent& event;
67     static FocusIntension GetFocusIntension(const NonPointerEvent& event);
68     static FocusIntension GetFocusIntensionFromKey(KeyIntention keyIntention);
69 };
70 
71 class ACE_EXPORT FocusCallbackEvents : public virtual AceType {
72     DECLARE_ACE_TYPE(FocusCallbackEvents, AceType);
73 public:
74     FocusCallbackEvents() = default;
75     ~FocusCallbackEvents() override = default;
76 
77     OnFocusFunc onFocusCallback_;
78     OnFocusFunc onJSFrameNodeFocusCallback_;
79     OnBlurFunc onBlurCallback_;
80     OnBlurFunc onJSFrameNodeBlurCallback_;
81     OnKeyConsumeFunc onKeyEventCallback_;
82     OnKeyCallbackFunc onJSFrameNodeKeyEventCallback_;
83     OnKeyConsumeFunc onKeyPreImeCallback_;
84     GestureEventFunc onClickEventCallback_;
85     GestureEventFunc onSpanLongPressEventCallback_; // used only for span
86     OnFocusAxisEventFunc onFocusAxisEventCallback_;
87     OnKeyEventDispatchFunc onKeyEventDispatchCallback_;
88     OnCrownCallbackFunc onCrownEventCallback_;
89     OnCrownEventFunc onCrownEventsInternal_;
90 
91     WeakPtr<FocusHub> defaultFocusNode_;
92     bool isDefaultFocus_ = { false };
93     bool isDefaultHasFocused_ = { false };
94     bool isDefaultGroupFocus_ = { false };
95     bool isDefaultGroupHasFocused_ { false };
96     std::optional<bool> isFocusOnTouch_;
97 
98     int32_t tabIndex_ = 0;
99 };
100 
101 enum class OnKeyEventType : int32_t {
102     DEFAULT = 0,
103     CONTEXT_MENU = 1,
104 };
105 
106 class FocusEventHandler : public virtual FocusState {
107     DECLARE_ACE_TYPE(FocusEventHandler, FocusState);
108 public:
109     FocusEventHandler() = default;
110     ~FocusEventHandler() override = default;
111 
112     void SetOnKeyEventInternal(OnKeyEventFunc&& onKeyEvent, OnKeyEventType type = OnKeyEventType::DEFAULT)
113     {
114         onKeyEventsInternal_[type] = std::move(onKeyEvent);
115     }
FindContextMenuOnKeyEvent(OnKeyEventType type)116     bool FindContextMenuOnKeyEvent(OnKeyEventType type)
117     {
118         return (onKeyEventsInternal_.find(type) != onKeyEventsInternal_.end());
119     }
120     bool OnClick(const KeyEvent& event);
121 
122     bool ProcessOnCrownEventInternal(const CrownEvent& event);
123 
124 protected:
125     bool OnCrownEvent(const CrownEvent& CrownEvent);
126     bool OnFocusEvent(const FocusEvent& event);
127     virtual bool HandleFocusTravel(const FocusEvent& event) = 0; // bad design which need to be deleted
128     int32_t GetKeyProcessingMode();
129 
130     ACE_DEFINE_FOCUS_EVENT(OnFocusCallback, OnFocusFunc, onFocusCallback)
131     ACE_DEFINE_FOCUS_EVENT(OnBlurCallback, OnBlurFunc, onBlurCallback)
132     ACE_DEFINE_FOCUS_EVENT(JSFrameNodeOnFocusCallback, OnFocusFunc, onJSFrameNodeFocusCallback)
133     ACE_DEFINE_FOCUS_EVENT(JSFrameNodeOnBlurCallback, OnBlurFunc, onJSFrameNodeBlurCallback)
134     ACE_DEFINE_FOCUS_EVENT(JSFrameNodeOnKeyCallback, OnKeyCallbackFunc, onJSFrameNodeKeyEventCallback)
135     ACE_DEFINE_FOCUS_EVENT(OnKeyCallback, OnKeyConsumeFunc, onKeyEventCallback)
136     ACE_DEFINE_FOCUS_EVENT(OnKeyPreIme, OnKeyConsumeFunc, onKeyPreImeCallback)
137     ACE_DEFINE_FOCUS_EVENT(OnClickCallback, GestureEventFunc, onClickEventCallback)
138     ACE_DEFINE_FOCUS_EVENT(OnLongPressCallback, GestureEventFunc, onSpanLongPressEventCallback)
139     ACE_DEFINE_FOCUS_EVENT(OnFocusAxisCallback, OnFocusAxisEventFunc, onFocusAxisEventCallback)
140     ACE_DEFINE_FOCUS_EVENT(OnKeyEventDispatchCallback, OnKeyEventDispatchFunc, onKeyEventDispatchCallback)
141     ACE_DEFINE_FOCUS_EVENT(OnCrownCallback, OnCrownCallbackFunc, onCrownEventCallback)
142     ACE_DEFINE_FOCUS_EVENT(OnCrownEventInternal, OnCrownEventFunc, onCrownEventsInternal)
143     std::unordered_map<OnKeyEventType, OnKeyEventFunc> onKeyEventsInternal_;
144     bool isNodeNeedKey_ { false }; // extension use only
145     RefPtr<FocusCallbackEvents> focusCallbackEvents_;
146 
147 private:
148     bool OnFocusEventScope(const FocusEvent& event);
149     bool OnFocusEventNode(const FocusEvent& focusEvent);
150 
151     bool HandleKeyEvent(const KeyEvent& event, FocusIntension intension);
152     bool OnKeyPreIme(KeyEventInfo& info, const KeyEvent& keyEvent);
153     bool OnKeyEventNodeInternal(const KeyEvent& keyEvent);
154     bool OnKeyEventNodeUser(KeyEventInfo& info, const KeyEvent& keyEvent);
155     bool ProcessOnKeyEventInternal(const KeyEvent& event);
156     bool HandleFocusAxisEvent(const FocusAxisEvent& event);
157     bool HasCustomKeyEventDispatch(const FocusEvent& event);
158     bool HandleCustomEventDispatch(const FocusEvent& event);
159     bool HandleCrownEvent(const CrownEvent& CrownEvent);
160 
161     void PrintOnKeyEventUserInfo(const KeyEvent& keyEvent, bool retCallback);
162 };
163 } // namespace OHOS::Ace::NG
164 #endif