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