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