1 /*
2  * Copyright (c) 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_INPUT_EVENT_HUB_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_INPUT_EVENT_HUB_H
18 
19 #include <list>
20 
21 #include "base/memory/ace_type.h"
22 #include "core/components/common/layout/constants.h"
23 #include "core/components_ng/event/input_event.h"
24 #include "core/pipeline_ng/ui_task_scheduler.h"
25 
26 namespace OHOS::Ace::NG {
27 
28 class EventHub;
29 
30 // The gesture event hub is mainly used to handle common gesture events.
31 class ACE_EXPORT InputEventHub : public virtual AceType {
32     DECLARE_ACE_TYPE(InputEventHub, AceType)
33 public:
34     explicit InputEventHub(const WeakPtr<EventHub>& eventHub);
35     ~InputEventHub() override = default;
36 
37     // Set by user define, which will replace old one.
SetMouseEvent(OnMouseEventFunc && onMouseEventFunc)38     void SetMouseEvent(OnMouseEventFunc&& onMouseEventFunc)
39     {
40         if (!mouseEventActuator_) {
41             mouseEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
42         }
43         mouseEventActuator_->ReplaceInputEvent(std::move(onMouseEventFunc));
44     }
SetJSFrameNodeOnMouseEvent(OnMouseEventFunc && onMouseEventFunc)45     void SetJSFrameNodeOnMouseEvent(OnMouseEventFunc&& onMouseEventFunc)
46     {
47         if (!mouseEventActuator_) {
48             mouseEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
49         }
50         mouseEventActuator_->ReplaceJSFrameNodeInputEvent(std::move(onMouseEventFunc));
51     }
52 
AddOnMouseEvent(const RefPtr<InputEvent> & onMouseEvent)53     void AddOnMouseEvent(const RefPtr<InputEvent>& onMouseEvent)
54     {
55         if (!mouseEventActuator_) {
56             mouseEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
57         }
58         mouseEventActuator_->AddInputEvent(onMouseEvent);
59     }
60 
RemoveOnMouseEvent(const RefPtr<InputEvent> & onMouseEvent)61     void RemoveOnMouseEvent(const RefPtr<InputEvent>& onMouseEvent)
62     {
63         if (!mouseEventActuator_) {
64             return;
65         }
66         mouseEventActuator_->RemoveInputEvent(onMouseEvent);
67     }
68 
69     void SetHoverEffect(HoverEffectType type);
70 
GetHoverEffect()71     HoverEffectType GetHoverEffect()
72     {
73         return hoverEffectType_;
74     }
75     std::string GetHoverEffectStr() const;
76 
SetHoverEffectAuto(HoverEffectType type)77     void SetHoverEffectAuto(HoverEffectType type)
78     {
79         if (!hoverEffectActuator_) {
80             hoverEffectActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
81         }
82         hoverEffectAuto_ = type;
83     }
84 
GetHoverEffectAuto()85     HoverEffectType GetHoverEffectAuto()
86     {
87         return hoverEffectAuto_;
88     }
89 
90     // Set by user define, which will replace old one.
SetHoverEvent(OnHoverFunc && onHoverEventFunc)91     void SetHoverEvent(OnHoverFunc&& onHoverEventFunc)
92     {
93         if (!hoverEventActuator_) {
94             hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
95         }
96         hoverEventActuator_->ReplaceInputEvent(std::move(onHoverEventFunc));
97     }
98 
SetAccessibilityHoverEvent(OnAccessibilityHoverFunc && onAccessibilityHoverEventFunc)99     void SetAccessibilityHoverEvent(OnAccessibilityHoverFunc&& onAccessibilityHoverEventFunc)
100     {
101         if (!accessibilityHoverEventActuator_) {
102             accessibilityHoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
103         }
104         accessibilityHoverEventActuator_->ReplaceInputEvent(std::move(onAccessibilityHoverEventFunc));
105     }
106 
SetJSFrameNodeOnHoverEvent(OnHoverFunc && onHoverEventFunc)107     void SetJSFrameNodeOnHoverEvent(OnHoverFunc&& onHoverEventFunc)
108     {
109         if (!hoverEventActuator_) {
110             hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
111         }
112         hoverEventActuator_->ReplaceJSFrameNodeInputEvent(std::move(onHoverEventFunc));
113     }
114 
AddOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)115     void AddOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent)
116     {
117         if (!hoverEventActuator_) {
118             hoverEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
119         }
120         hoverEventActuator_->AddInputEvent(onHoverEvent);
121     }
122 
RemoveOnHoverEvent(const RefPtr<InputEvent> & onHoverEvent)123     void RemoveOnHoverEvent(const RefPtr<InputEvent>& onHoverEvent)
124     {
125         if (!hoverEventActuator_) {
126             return;
127         }
128         hoverEventActuator_->RemoveInputEvent(onHoverEvent);
129     }
130 
AddOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)131     void AddOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent)
132     {
133         if (!axisEventActuator_) {
134             axisEventActuator_ = MakeRefPtr<InputEventActuator>(WeakClaim(this));
135         }
136         axisEventActuator_->AddInputEvent(onAxisEvent);
137     }
138 
RemoveOnAxisEvent(const RefPtr<InputEvent> & onAxisEvent)139     void RemoveOnAxisEvent(const RefPtr<InputEvent>& onAxisEvent)
140     {
141         if (!axisEventActuator_) {
142             return;
143         }
144         axisEventActuator_->RemoveInputEvent(onAxisEvent);
145     }
146 
147     // the return value means prevents event bubbling.
148     bool ProcessMouseTestHit(const OffsetF& coordinateOffset, TouchTestResult& result);
149 
150     bool ProcessPenHoverTestHit(const OffsetF& coordinateOffset, TouchTestResult& result);
151 
152     bool ProcessAxisTestHit(const OffsetF& coordinateOffset, AxisTestResult& onAxisResult);
153 
154     RefPtr<FrameNode> GetFrameNode() const;
155 
OnContextAttached()156     void OnContextAttached() {}
157 
158     // register showMenu callback (always replace)
159     void BindContextMenu(OnMouseEventFunc&& showMenu);
160 
ClearUserOnHover()161     void ClearUserOnHover()
162     {
163         if (hoverEventActuator_) {
164             hoverEventActuator_->ClearUserCallback();
165         }
166     }
167 
ClearUserOnAccessibilityHover()168     void ClearUserOnAccessibilityHover()
169     {
170         if (accessibilityHoverEventActuator_) {
171             accessibilityHoverEventActuator_->ClearUserCallback();
172         }
173     }
174 
ClearJSFrameNodeOnHover()175     void ClearJSFrameNodeOnHover()
176     {
177         if (hoverEventActuator_) {
178             hoverEventActuator_->ClearJSFrameNodeCallback();
179         }
180     }
181 
ClearUserOnMouse()182     void ClearUserOnMouse()
183     {
184         if (mouseEventActuator_) {
185             mouseEventActuator_->ClearUserCallback();
186         }
187     }
188 
ClearJSFrameNodeOnMouse()189     void ClearJSFrameNodeOnMouse()
190     {
191         if (mouseEventActuator_) {
192             mouseEventActuator_->ClearJSFrameNodeCallback();
193         }
194     }
195 
196 private:
197     WeakPtr<EventHub> eventHub_;
198     RefPtr<InputEventActuator> mouseEventActuator_;
199     RefPtr<InputEventActuator> hoverEventActuator_;
200     RefPtr<InputEventActuator> hoverEffectActuator_;
201     RefPtr<InputEventActuator> axisEventActuator_;
202     RefPtr<InputEventActuator> accessibilityHoverEventActuator_;
203 
204     RefPtr<InputEvent> showMenu_;
205 
206     HoverEffectType hoverEffectType_ = HoverEffectType::UNKNOWN;
207     HoverEffectType hoverEffectAuto_ = HoverEffectType::UNKNOWN;
208 };
209 
210 } // namespace OHOS::Ace::NG
211 
212 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_INPUT_EVENT_HUB_H
213