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