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_MANAGER_SELECT_CONTENT_OVERLAY_SELECT_OVERLAY_CALLBACK_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_MANAGER_SELECT_CONTENT_OVERLAY_SELECT_OVERLAY_CALLBACK_H
18 
19 #include "base/memory/ace_type.h"
20 #include "base/utils/utils.h"
21 #include "core/components_ng/event/gesture_info.h"
22 #include "core/components_ng/pattern/select_overlay/select_overlay_property.h"
23 #include "core/event/ace_events.h"
24 #include "core/event/touch_event.h"
25 
26 namespace OHOS::Ace::NG {
27 
28 struct TouchPointInfo {
29     std::optional<PointF> point;
30     int32_t id = -1;
31     Offset offset;
32 
ResetTouchPointInfo33     void Reset()
34     {
35         point.reset();
36         id = -1;
37         offset.Reset();
38     }
39 
40     operator bool() const
41     {
42         return point.has_value();
43     }
44 
IsAwayFromPointTouchPointInfo45     bool IsAwayFromPoint(const TouchEvent& point)
46     {
47         CHECK_NULL_RETURN(id == point.id, false);
48         auto deltaOffset = point.GetOffset() - offset;
49         auto deltaDistance = deltaOffset.GetDistance();
50         return GreatNotEqual(deltaDistance, Dimension(5.0f, DimensionUnit::VP).ConvertToPx());
51     }
52 };
53 
54 struct OverlayInfo : public virtual AceType {
55     DECLARE_ACE_TYPE(OverlayInfo, AceType);
56 
57 public:
58     bool isSingleHandle = false;
59     bool isShowMenu = false;
60     bool isHiddenHandle = false;
61 
CanBackPressedOverlayInfo62     bool CanBackPressed()
63     {
64         return isSingleHandle && !isShowMenu && isHiddenHandle;
65     }
66 };
67 
68 class ACE_EXPORT SelectOverlayCallback : public virtual AceType {
69     DECLARE_ACE_TYPE(SelectOverlayCallback, AceType);
70 
71 public:
72     SelectOverlayCallback() = default;
73     ~SelectOverlayCallback() override = default;
OnAfterSelectOverlayShow(bool isCreate)74     virtual void OnAfterSelectOverlayShow(bool isCreate) {}
OnMenuItemAction(OptionMenuActionId id,OptionMenuType type)75     virtual void OnMenuItemAction(OptionMenuActionId id, OptionMenuType type) {}
76 
OnOverlayTouchDown(const TouchEventInfo & event)77     virtual void OnOverlayTouchDown(const TouchEventInfo& event) {}
OnOverlayTouchUp(const TouchEventInfo & event)78     virtual void OnOverlayTouchUp(const TouchEventInfo& event) {}
OnOverlayTouchMove(const TouchEventInfo & event)79     virtual void OnOverlayTouchMove(const TouchEventInfo& event) {}
OnOverlayClick(const GestureEvent & event,bool isClickCaret)80     virtual void OnOverlayClick(const GestureEvent& event, bool isClickCaret) {}
OnHandleMouseEvent(const MouseInfo & event)81     virtual void OnHandleMouseEvent(const MouseInfo& event) {}
IsRegisterTouchCallback()82     virtual bool IsRegisterTouchCallback()
83     {
84         return false;
85     }
86 
OnHandleMoveStart(const GestureEvent & event,bool isFirst)87     virtual void OnHandleMoveStart(const GestureEvent& event, bool isFirst) {}
OnHandleMove(const RectF & rect,bool isFirst)88     virtual void OnHandleMove(const RectF& rect, bool isFirst) {}
OnHandleMoveDone(const RectF & rect,bool isFirst)89     virtual void OnHandleMoveDone(const RectF& rect, bool isFirst) {}
OnHandleReverse(bool isReverse)90     virtual void OnHandleReverse(bool isReverse) {}
IsRegisterHandleCallback()91     virtual bool IsRegisterHandleCallback()
92     {
93         return true;
94     }
95     virtual void OnCloseOverlay(OptionMenuType menuType, CloseReason reason, RefPtr<OverlayInfo> info = nullptr) {}
96     virtual bool CheckTouchInHostNode(const PointF& touchPoint) = 0;
97     virtual void OnHandleGlobalTouchEvent(SourceType sourceType, TouchType touchType, bool touchInside = true) {};
OnHandleGlobalEvent(const PointF & touchPoint,const PointF & localPoint,const TouchEvent & event)98     virtual void OnHandleGlobalEvent(const PointF& touchPoint, const PointF& localPoint, const TouchEvent& event)
99     {
100         bool touchInside = CheckTouchInHostNode(localPoint);
101         if (event.type == TouchType::DOWN) {
102             isIntercept_ = event.sourceType != SourceType::MOUSE && touchInside;
103         }
104         CHECK_NULL_VOID(!isIntercept_);
105         if (event.type == TouchType::UP) {
106             isIntercept_ = false;
107         }
108         if (event.sourceType == SourceType::MOUSE && event.type == TouchType::DOWN) {
109             OnHandleGlobalTouchEvent(SourceType::MOUSE, TouchType::DOWN, touchInside);
110             return;
111         }
112         if (event.sourceType == SourceType::TOUCH || event.sourceType == SourceType::TOUCH_PAD) {
113             if (event.type == TouchType::DOWN) {
114                 downPointInfo_ = { touchPoint, event.id, event.GetOffset() };
115                 return;
116             }
117             if (event.type == TouchType::MOVE && downPointInfo_ &&
118                 downPointInfo_.IsAwayFromPoint(event)) {
119                 downPointInfo_.Reset();
120                 return;
121             }
122             if (event.type == TouchType::UP && downPointInfo_) {
123                 OnHandleGlobalTouchEvent(event.sourceType, TouchType::UP);
124                 downPointInfo_.Reset();
125             }
126         }
127     }
128 
OnUnbind()129     void OnUnbind()
130     {
131         downPointInfo_.Reset();
132         isIntercept_ = false;
133     }
134 
OnHandleLevelModeChanged(HandleLevelMode mode)135     virtual void OnHandleLevelModeChanged(HandleLevelMode mode) {}
CheckSwitchToMode(HandleLevelMode mode)136     virtual bool CheckSwitchToMode(HandleLevelMode mode) {
137         return true;
138     }
OnHandleIsHidden()139     virtual void OnHandleIsHidden() {}
140 
141 private:
142     bool isIntercept_ = false;
143     TouchPointInfo downPointInfo_;
144     ACE_DISALLOW_COPY_AND_MOVE(SelectOverlayCallback);
145 };
146 } // namespace OHOS::Ace::NG
147 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_MANAGER_SELECT_CONTENT_OVERLAY_SELECT_OVERLAY_CALLBACK_H
148