• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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_EVENT_HUB_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_EVENT_HUB_H
18 
19 #include <list>
20 #include <utility>
21 
22 #include "base/memory/ace_type.h"
23 #include "base/memory/referenced.h"
24 #include "base/utils/noncopyable.h"
25 #include "core/components_ng/event/focus_hub.h"
26 #include "core/components_ng/event/gesture_event_hub.h"
27 #include "core/components_ng/event/input_event_hub.h"
28 #include "core/components_ng/event/state_style_manager.h"
29 
30 namespace OHOS::Ace::NG {
31 
32 class FrameNode;
33 using OnAreaChangedFunc =
34     std::function<void(const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin)>;
35 
36 struct KeyboardShortcut {
37     std::string value;
38     uint8_t keys = 0;
39     std::function<void()> onKeyboardShortcutAction = nullptr;
40 };
41 
42 enum class DragFuncType {
43     DRAG_ENTER,
44     DRAG_LEAVE,
45     DRAG_MOVE,
46     DRAG_DROP,
47     DRAG_END,
48 };
49 
50 // The event hub is mainly used to handle common collections of events, such as gesture events, mouse events, etc.
51 class EventHub : public virtual AceType {
52     DECLARE_ACE_TYPE(EventHub, AceType)
53 
54 public:
55     EventHub() = default;
~EventHub()56     ~EventHub() override
57     {
58         keyboardShortcut_.clear();
59     };
60 
GetOrCreateGestureEventHub()61     const RefPtr<GestureEventHub>& GetOrCreateGestureEventHub()
62     {
63         if (!gestureEventHub_) {
64             gestureEventHub_ = CreateGestureEventHub();
65         }
66         return gestureEventHub_;
67     }
68 
CreateGestureEventHub()69     virtual RefPtr<GestureEventHub> CreateGestureEventHub()
70     {
71         return MakeRefPtr<GestureEventHub>(WeakClaim(this));
72     }
73 
GetGestureEventHub()74     const RefPtr<GestureEventHub>& GetGestureEventHub() const
75     {
76         return gestureEventHub_;
77     }
78 
SetGestureEventHub(const RefPtr<GestureEventHub> & gestureEventHub)79     void SetGestureEventHub(const RefPtr<GestureEventHub>& gestureEventHub)
80     {
81         gestureEventHub_ = gestureEventHub;
82     }
83 
GetOrCreateInputEventHub()84     const RefPtr<InputEventHub>& GetOrCreateInputEventHub()
85     {
86         if (!inputEventHub_) {
87             inputEventHub_ = MakeRefPtr<InputEventHub>(WeakClaim(this));
88         }
89         return inputEventHub_;
90     }
91 
GetInputEventHub()92     const RefPtr<InputEventHub>& GetInputEventHub() const
93     {
94         return inputEventHub_;
95     }
96 
97     const RefPtr<FocusHub>& GetOrCreateFocusHub(FocusType type = FocusType::DISABLE, bool focusable = false,
98         FocusStyleType focusStyleType = FocusStyleType::NONE,
99         const std::unique_ptr<FocusPaintParam>& paintParamsPtr = nullptr)
100     {
101         if (!focusHub_) {
102             focusHub_ = MakeRefPtr<FocusHub>(WeakClaim(this), type, focusable);
103             focusHub_->SetFocusStyleType(focusStyleType);
104             if (paintParamsPtr) {
105                 focusHub_->SetFocusPaintParamsPtr(paintParamsPtr);
106             }
107         }
108         return focusHub_;
109     }
110 
GetOrCreateFocusHub(const FocusPattern & focusPattern)111     const RefPtr<FocusHub>& GetOrCreateFocusHub(const FocusPattern& focusPattern)
112     {
113         if (!focusHub_) {
114             focusHub_ = MakeRefPtr<FocusHub>(WeakClaim(this), focusPattern);
115         }
116         return focusHub_;
117     }
118 
GetFocusHub()119     const RefPtr<FocusHub>& GetFocusHub() const
120     {
121         return focusHub_;
122     }
123 
124     void AttachHost(const WeakPtr<FrameNode>& host);
125 
126     RefPtr<FrameNode> GetFrameNode() const;
127 
128     GetEventTargetImpl CreateGetEventTargetImpl() const;
129 
OnContextAttached()130     void OnContextAttached()
131     {
132         if (gestureEventHub_) {
133             gestureEventHub_->OnContextAttached();
134         }
135     }
136 
ClearUserOnAppear()137     void ClearUserOnAppear()
138     {
139         if (onAppear_) {
140             onAppear_ = nullptr;
141         }
142     }
143 
SetOnAppear(std::function<void ()> && onAppear)144     void SetOnAppear(std::function<void()>&& onAppear)
145     {
146         onAppear_ = std::move(onAppear);
147     }
148 
FireOnAppear()149     void FireOnAppear()
150     {
151         if (onAppear_) {
152             auto pipeline = PipelineBase::GetCurrentContext();
153             CHECK_NULL_VOID(pipeline);
154             auto taskScheduler = pipeline->GetTaskExecutor();
155             CHECK_NULL_VOID(taskScheduler);
156             taskScheduler->PostTask(
157                 [weak = WeakClaim(this)]() {
158                     auto eventHub = weak.Upgrade();
159                     CHECK_NULL_VOID(eventHub);
160                     if (eventHub->onAppear_) {
161                         // callback may be overwritten in its invoke so we copy it first
162                         auto onAppear = eventHub->onAppear_;
163                         onAppear();
164                     }
165                 },
166                 TaskExecutor::TaskType::UI);
167         }
168     }
169 
ClearUserOnDisAppear()170     void ClearUserOnDisAppear()
171     {
172         if (onDisappear_) {
173             onDisappear_ = nullptr;
174         }
175     }
176 
SetOnDisappear(std::function<void ()> && onDisappear)177     void SetOnDisappear(std::function<void()>&& onDisappear)
178     {
179         onDisappear_ = std::move(onDisappear);
180     }
181 
FireOnDisappear()182     virtual void FireOnDisappear()
183     {
184         if (onDisappear_) {
185             // callback may be overwritten in its invoke so we copy it first
186             auto onDisappear = onDisappear_;
187             onDisappear();
188         }
189     }
190 
ClearUserOnAreaChanged()191     void ClearUserOnAreaChanged()
192     {
193         if (onAreaChanged_) {
194             onAreaChanged_ = nullptr;
195         }
196     }
197 
SetOnAreaChanged(OnAreaChangedFunc && onAreaChanged)198     void SetOnAreaChanged(OnAreaChangedFunc&& onAreaChanged)
199     {
200         onAreaChanged_ = std::move(onAreaChanged);
201     }
202 
FireOnAreaChanged(const RectF & oldRect,const OffsetF & oldOrigin,const RectF & rect,const OffsetF & origin)203     void FireOnAreaChanged(const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin)
204     {
205         if (onAreaChanged_) {
206             // callback may be overwritten in its invoke so we copy it first
207             auto onAreaChanged = onAreaChanged_;
208             onAreaChanged(oldRect, oldOrigin, rect, origin);
209         }
210     }
211 
FireInnerOnAreaChanged(const RectF & oldRect,const OffsetF & oldOrigin,const RectF & rect,const OffsetF & origin)212     void FireInnerOnAreaChanged(
213         const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin)
214     {
215         for (auto& innerCallbackInfo : onAreaChangedInnerCallbacks_) {
216             if (innerCallbackInfo.second) {
217                 auto innerOnAreaCallback = innerCallbackInfo.second;
218                 innerOnAreaCallback(oldRect, oldOrigin, rect, origin);
219             }
220         }
221     }
222 
HasOnAreaChanged()223     bool HasOnAreaChanged() const
224     {
225         return static_cast<bool>(onAreaChanged_);
226     }
227 
HasInnerOnAreaChanged()228     bool HasInnerOnAreaChanged() const
229     {
230         return !onAreaChangedInnerCallbacks_.empty();
231     }
232 
233     using OnDragFunc = std::function<void(const RefPtr<OHOS::Ace::DragEvent>&, const std::string&)>;
234     using OnNewDragFunc = std::function<void(const RefPtr<OHOS::Ace::DragEvent>&)>;
235     using OnDragStartFunc = std::function<DragDropInfo(const RefPtr<OHOS::Ace::DragEvent>&, const std::string&)>;
SetOnDragStart(OnDragStartFunc && onDragStart)236     void SetOnDragStart(OnDragStartFunc&& onDragStart)
237     {
238         onDragStart_ = std::move(onDragStart);
239     }
240 
GetOnDragStart()241     const OnDragStartFunc& GetOnDragStart() const
242     {
243         return onDragStart_;
244     }
245 
HasOnDragStart()246     bool HasOnDragStart() const
247     {
248         return static_cast<bool>(onDragStart_);
249     }
250 
SetOnDragEnter(OnDragFunc && onDragEnter)251     void SetOnDragEnter(OnDragFunc&& onDragEnter)
252     {
253         onDragEnter_ = std::move(onDragEnter);
254     }
255 
FireOnDragEnter(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)256     void FireOnDragEnter(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
257     {
258         if (SystemProperties::GetDebugEnabled()) {
259             LOGI("DragDropManager fire onDragEnter");
260         }
261         if (onDragEnter_) {
262             // callback may be overwritten in its invoke so we copy it first
263             auto onDragEnter = onDragEnter_;
264             onDragEnter(info, extraParams);
265         }
266     }
267 
SetOnDragLeave(OnDragFunc && onDragLeave)268     void SetOnDragLeave(OnDragFunc&& onDragLeave)
269     {
270         onDragLeave_ = std::move(onDragLeave);
271     }
272 
FireOnDragLeave(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)273     void FireOnDragLeave(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
274     {
275         if (SystemProperties::GetDebugEnabled()) {
276             LOGI("DragDropManager fire onDragLeave");
277         }
278         if (onDragLeave_) {
279             // callback may be overwritten in its invoke so we copy it first
280             auto onDragLeave = onDragLeave_;
281             onDragLeave(info, extraParams);
282         }
283     }
284 
SetOnDragMove(OnDragFunc && onDragMove)285     void SetOnDragMove(OnDragFunc&& onDragMove)
286     {
287         onDragMove_ = std::move(onDragMove);
288     }
289 
FireOnDragMove(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)290     void FireOnDragMove(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
291     {
292         if (SystemProperties::GetDebugEnabled()) {
293             LOGI("DragDropManager fire onDragMove");
294         }
295         if (onDragMove_) {
296             // callback may be overwritten in its invoke so we copy it first
297             auto onDragMove = onDragMove_;
298             onDragMove(info, extraParams);
299         }
300     }
301 
HasOnDragMove()302     bool HasOnDragMove() const
303     {
304         return static_cast<bool>(onDragMove_);
305     }
306 
SetOnDrop(OnDragFunc && onDrop)307     void SetOnDrop(OnDragFunc&& onDrop)
308     {
309         onDrop_ = std::move(onDrop);
310     }
311 
SetOnDragEnd(OnNewDragFunc && onDragEnd)312     void SetOnDragEnd(OnNewDragFunc&& onDragEnd)
313     {
314         onDragEnd_ = std::move(onDragEnd);
315     }
316 
GetOnDragEnd()317     const OnNewDragFunc& GetOnDragEnd() const
318     {
319         return onDragEnd_;
320     }
321 
HasOnDragEnd()322     bool HasOnDragEnd() const
323     {
324         return static_cast<bool>(onDragEnd_);
325     }
326 
HasOnItemDragMove()327     virtual bool HasOnItemDragMove()
328     {
329         return false;
330     }
331 
HasOnItemDrop()332     virtual bool HasOnItemDrop()
333     {
334         return false;
335     }
336 
FireOnDrop(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)337     void FireOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
338     {
339         if (SystemProperties::GetDebugEnabled()) {
340             LOGI("DragDropManager fire onDrop");
341         }
342         if (onDrop_) {
343             // callback may be overwritten in its invoke so we copy it first
344             auto onDrop = onDrop_;
345             onDrop(info, extraParams);
346         }
347     }
348 
HasOnDrop()349     bool HasOnDrop() const
350     {
351         return onDrop_ != nullptr;
352     }
353 
HasCustomerOnDrop()354     bool HasCustomerOnDrop() const
355     {
356         return customerOnDrop_ != nullptr;
357     }
358 
GetDragExtraParams(const std::string & extraInfo,const Point & point,DragEventType isStart)359     virtual std::string GetDragExtraParams(const std::string& extraInfo, const Point& point, DragEventType isStart)
360     {
361         auto json = JsonUtil::Create(true);
362         if (!extraInfo.empty()) {
363             json->Put("extraInfo", extraInfo.c_str());
364         }
365         return json->ToString();
366     }
367 
IsEnabled()368     bool IsEnabled() const
369     {
370         return enabled_;
371     }
372 
IsDeveloperEnabled()373     bool IsDeveloperEnabled() const
374     {
375         return developerEnabled_;
376     }
377 
SetEnabled(bool enabled)378     void SetEnabled(bool enabled)
379     {
380         enabled_ = enabled;
381         developerEnabled_ = enabled;
382     }
383 
SetEnabledInternal(bool enabled)384     void SetEnabledInternal(bool enabled)
385     {
386         enabled_ = enabled;
387     }
388 
389     // restore enabled value to what developer sets
RestoreEnabled()390     void RestoreEnabled()
391     {
392         enabled_ = developerEnabled_;
393     }
394 
395     // get XTS inspector value
ToJsonValue(std::unique_ptr<JsonValue> & json)396     virtual void ToJsonValue(std::unique_ptr<JsonValue>& json) const {}
397 
FromJson(const std::unique_ptr<JsonValue> & json)398     virtual void FromJson(const std::unique_ptr<JsonValue>& json) {}
399 
400     void MarkModifyDone();
401 
402     void SetCurrentUIState(UIState state, bool flag);
403 
UpdateCurrentUIState(UIState state)404     void UpdateCurrentUIState(UIState state)
405     {
406         if (stateStyleMgr_) {
407             stateStyleMgr_->UpdateCurrentUIState(state);
408         }
409     }
410 
ResetCurrentUIState(UIState state)411     void ResetCurrentUIState(UIState state)
412     {
413         if (stateStyleMgr_) {
414             stateStyleMgr_->ResetCurrentUIState(state);
415         }
416     }
417 
GetCurrentUIState()418     UIState GetCurrentUIState() const
419     {
420         return stateStyleMgr_ ? stateStyleMgr_->GetCurrentUIState() : UI_STATE_NORMAL;
421     }
422 
HasStateStyle(UIState state)423     bool HasStateStyle(UIState state) const
424     {
425         if (stateStyleMgr_) {
426             return stateStyleMgr_->HasStateStyle(state);
427         }
428         return false;
429     }
430 
431     void AddSupportedState(UIState state);
432 
433     void SetSupportedStates(UIState state);
434 
435     bool IsCurrentStateOn(UIState state);
436 
SetKeyboardShortcut(const std::string & value,uint8_t keys,const std::function<void ()> & onKeyboardShortcutAction)437     void SetKeyboardShortcut(
438         const std::string& value, uint8_t keys, const std::function<void()>& onKeyboardShortcutAction)
439     {
440         if (value.empty() && keys == 0) {
441             if (keyboardShortcut_.size() == 1) {
442                 keyboardShortcut_.clear();
443             }
444             return;
445         }
446         KeyboardShortcut keyboardShortcut;
447         for (auto&& ch : value) {
448             keyboardShortcut.value.push_back(static_cast<char>(std::toupper(ch)));
449         }
450         keyboardShortcut.keys = keys;
451         keyboardShortcut.onKeyboardShortcutAction = onKeyboardShortcutAction;
452         keyboardShortcut_.emplace_back(keyboardShortcut);
453     }
454 
GetKeyboardShortcut()455     std::vector<KeyboardShortcut>& GetKeyboardShortcut()
456     {
457         return keyboardShortcut_;
458     }
459 
460     void SetCustomerOnDragFunc(DragFuncType dragFuncType, OnDragFunc&& onDragFunc);
461 
462     void SetCustomerOnDragFunc(DragFuncType dragFuncType, OnNewDragFunc&& onDragEnd);
463 
GetCustomerOnDragFunc(DragFuncType dragFuncType)464     const OnDragFunc GetCustomerOnDragFunc(DragFuncType dragFuncType) const
465     {
466         OnDragFunc dragFunc;
467         switch (dragFuncType) {
468             case DragFuncType::DRAG_ENTER:
469                 dragFunc = customerOnDragEnter_;
470                 break;
471             case DragFuncType::DRAG_LEAVE:
472                 dragFunc = customerOnDragLeave_;
473                 break;
474             case DragFuncType::DRAG_MOVE:
475                 dragFunc = customerOnDragMove_;
476                 break;
477             case DragFuncType::DRAG_DROP:
478                 dragFunc = customerOnDrop_;
479                 break;
480             default:
481                 LOGW("unsuport dragFuncType");
482                 break;
483         }
484         return dragFunc;
485     }
486 
GetCustomerOnDragEndFunc()487     const OnNewDragFunc& GetCustomerOnDragEndFunc() const
488     {
489         return customerOnDragEnd_;
490     }
491 
ClearCustomerOnDragFunc()492     void ClearCustomerOnDragFunc()
493     {
494         onDragStart_ = nullptr;
495         customerOnDragEnter_ = nullptr;
496         customerOnDragLeave_ = nullptr;
497         customerOnDragMove_ = nullptr;
498         customerOnDrop_ = nullptr;
499         customerOnDragEnd_ = nullptr;
500     }
501 
502     void FireCustomerOnDragFunc(DragFuncType dragFuncType, const RefPtr<OHOS::Ace::DragEvent>& info,
503         const std::string& extraParams = "");
504 
505     bool IsFireOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info);
506 
507     void HandleInternalOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams);
508 
509     void PostEnabledTask();
510 
511     void AddInnerOnAreaChangedCallback(int32_t id, OnAreaChangedFunc&& callback);
512 
ClearOnAreaChangedInnerCallbacks()513     void ClearOnAreaChangedInnerCallbacks()
514     {
515         onAreaChangedInnerCallbacks_.clear();
516     }
517 
518 protected:
OnModifyDone()519     virtual void OnModifyDone() {}
520 
521 private:
522     WeakPtr<FrameNode> host_;
523     RefPtr<GestureEventHub> gestureEventHub_;
524     RefPtr<InputEventHub> inputEventHub_;
525     RefPtr<FocusHub> focusHub_;
526     RefPtr<StateStyleManager> stateStyleMgr_;
527 
528     std::function<void()> onAppear_;
529     std::function<void()> onDisappear_;
530     OnAreaChangedFunc onAreaChanged_;
531     std::unordered_map<int32_t, OnAreaChangedFunc> onAreaChangedInnerCallbacks_;
532 
533     OnDragStartFunc onDragStart_;
534     OnDragFunc onDragEnter_;
535     OnDragFunc onDragLeave_;
536     OnDragFunc onDragMove_;
537     OnDragFunc onDrop_;
538     OnNewDragFunc onDragEnd_;
539 
540     OnDragFunc customerOnDragEnter_;
541     OnDragFunc customerOnDragLeave_;
542     OnDragFunc customerOnDragMove_;
543     OnDragFunc customerOnDrop_;
544     OnNewDragFunc customerOnDragEnd_;
545 
546     bool enabled_ { true };
547     bool developerEnabled_ { true };
548     std::vector<KeyboardShortcut> keyboardShortcut_;
549 
550     ACE_DISALLOW_COPY_AND_MOVE(EventHub);
551 };
552 
553 class TextCommonEvent : public BaseEventInfo {
DECLARE_RELATIONSHIP_OF_CLASSES(TextCommonEvent,BaseEventInfo)554     DECLARE_RELATIONSHIP_OF_CLASSES(TextCommonEvent, BaseEventInfo)
555 public:
556     TextCommonEvent() : BaseEventInfo("TextCommonEvent") {}
557     ~TextCommonEvent() override = default;
558 };
559 
560 } // namespace OHOS::Ace::NG
561 
562 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_EVENT_HUB_H
563