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_PATTERNS_LIST_LIST_EVENT_HUB_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LIST_LIST_EVENT_HUB_H
18 
19 #include <stdint.h>
20 
21 #include "core/components/hyperlink/hyperlink_resources.h"
22 #include "core/components_ng/base/ui_node.h"
23 #include "core/components_ng/pattern/scrollable/scrollable_event_hub.h"
24 #include "core/components_v2/list/list_component.h"
25 
26 namespace OHOS::Ace::NG {
27 constexpr int32_t INVALID_IDX = -1;
28 class ListEventHub : public ScrollableEventHub {
29     DECLARE_ACE_TYPE(ListEventHub, ScrollableEventHub)
30 
31 public:
32     ListEventHub() = default;
33     ~ListEventHub() override = default;
34 
SetOnScrollBegin(OnScrollBeginEvent && onScrollBegin)35     void SetOnScrollBegin(OnScrollBeginEvent&& onScrollBegin)
36     {
37         onScrollBeginEvent_ = std::move(onScrollBegin);
38     }
39 
GetOnScrollBegin()40     const OnScrollBeginEvent& GetOnScrollBegin() const
41     {
42         return onScrollBeginEvent_;
43     }
44 
SetOnScrollIndex(OnScrollIndexEvent && onScrollIndex)45     void SetOnScrollIndex(OnScrollIndexEvent&& onScrollIndex)
46     {
47         onScrollIndexEvent_ = std::move(onScrollIndex);
48     }
49 
GetOnScrollIndex()50     const OnScrollIndexEvent& GetOnScrollIndex() const
51     {
52         return onScrollIndexEvent_;
53     }
54 
SetOnScrollVisibleContentChange(OnScrollVisibleContentChangeEvent && onScrollVisibleContentChange)55     void SetOnScrollVisibleContentChange(OnScrollVisibleContentChangeEvent&& onScrollVisibleContentChange)
56     {
57         OnScrollVisibleContentChangeEvent_ = std::move(onScrollVisibleContentChange);
58     }
59 
GetOnScrollVisibleContentChange()60     const OnScrollVisibleContentChangeEvent& GetOnScrollVisibleContentChange() const
61     {
62         return OnScrollVisibleContentChangeEvent_;
63     }
64 
SetOnItemMove(OnItemMoveEvent && onItemMove)65     void SetOnItemMove(OnItemMoveEvent&& onItemMove)
66     {
67         onItemMoveEvent_ = std::move(onItemMove);
68     }
69 
GetOnItemMove()70     const OnItemMoveEvent& GetOnItemMove() const
71     {
72         return onItemMoveEvent_;
73     }
74 
SetOnItemDragStart(OnItemDragStartFunc && onItemDragStart)75     void SetOnItemDragStart(OnItemDragStartFunc&& onItemDragStart)
76     {
77         onItemDragStartEvent_ = std::move(onItemDragStart);
78     }
79 
GetOnItemDragStart()80     const OnItemDragStartFunc& GetOnItemDragStart() const
81     {
82         return onItemDragStartEvent_;
83     }
84 
SetOnItemDragEnter(OnItemDragEnterFunc && onItemDragEnter)85     void SetOnItemDragEnter(OnItemDragEnterFunc&& onItemDragEnter)
86     {
87         onItemDragEnterEvent_ = std::move(onItemDragEnter);
88     }
89 
GetOnItemDragEnter()90     const OnItemDragEnterFunc& GetOnItemDragEnter() const
91     {
92         return onItemDragEnterEvent_;
93     }
94 
SetOnItemDragLeave(OnItemDragLeaveFunc && onItemDragLeave)95     void SetOnItemDragLeave(OnItemDragLeaveFunc&& onItemDragLeave)
96     {
97         onItemDragLeaveEvent_ = std::move(onItemDragLeave);
98     }
99 
GetOnItemDragLeave()100     const OnItemDragLeaveFunc& GetOnItemDragLeave() const
101     {
102         return onItemDragLeaveEvent_;
103     }
104 
SetOnItemDragMove(OnItemDragMoveFunc && onItemDragMove)105     void SetOnItemDragMove(OnItemDragMoveFunc&& onItemDragMove)
106     {
107         onItemDragMoveEvent_ = std::move(onItemDragMove);
108     }
109 
GetOnItemDragMove()110     const OnItemDragMoveFunc& GetOnItemDragMove() const
111     {
112         return onItemDragMoveEvent_;
113     }
114 
SetOnItemDrop(OnItemDropFunc && onItemDrop)115     void SetOnItemDrop(OnItemDropFunc&& onItemDrop)
116     {
117         onItemDropEvent_ = std::move(onItemDrop);
118     }
119 
GetOnItemDrop()120     const OnItemDropFunc& GetOnItemDrop() const
121     {
122         return onItemDropEvent_;
123     }
124 
FireOnItemDragStart(const ItemDragInfo & dragInfo,int32_t itemIndex)125     RefPtr<UINode> FireOnItemDragStart(const ItemDragInfo& dragInfo, int32_t itemIndex) const
126     {
127         if (onItemDragStartEvent_) {
128             return AceType::DynamicCast<UINode>(onItemDragStartEvent_(dragInfo, itemIndex));
129         }
130         return nullptr;
131     }
132 
FireOnItemDragEnter(const ItemDragInfo & dragInfo)133     void FireOnItemDragEnter(const ItemDragInfo& dragInfo) const
134     {
135         if (onItemDragEnterEvent_) {
136             onItemDragEnterEvent_(dragInfo);
137         }
138     }
139 
FireOnItemDragMove(const ItemDragInfo & dragInfo,int32_t itemIndex,int32_t insertIndex)140     void FireOnItemDragMove(const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) const
141     {
142         if (onItemDragMoveEvent_) {
143             onItemDragMoveEvent_(dragInfo, itemIndex, insertIndex);
144         }
145     }
146 
FireOnItemDragLeave(const ItemDragInfo & dragInfo,int32_t itemIndex)147     void FireOnItemDragLeave(const ItemDragInfo& dragInfo, int32_t itemIndex) const
148     {
149         if (onItemDragLeaveEvent_) {
150             onItemDragLeaveEvent_(dragInfo, itemIndex);
151         }
152     }
153 
FireOnItemDrop(const ItemDragInfo & dragInfo,int32_t itemIndex,int32_t insertIndex,bool isSuccess)154     bool FireOnItemDrop(const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) const
155     {
156         if (onItemDropEvent_) {
157             if (onItemMoveEvent_ && itemIndex >= 0 && insertIndex >= 0) {
158                 isSuccess = onItemMoveEvent_(itemIndex, insertIndex);
159             }
160             onItemDropEvent_(dragInfo, itemIndex, insertIndex, isSuccess);
161             return true;
162         }
163         return false;
164     }
165 
GetDragExtraParams(const std::string & extraInfo,const Point & point,DragEventType drag)166     std::string GetDragExtraParams(const std::string& extraInfo, const Point& point, DragEventType drag) override
167     {
168         auto json = JsonUtil::Create(true);
169         if (drag == DragEventType::DROP || drag == DragEventType::MOVE) {
170             int32_t index = GetListItemIndexByPosition(point.GetX(), point.GetY());
171             json->Put("insertIndex", index);
172         }
173         if (!extraInfo.empty()) {
174             json->Put("extraInfo", extraInfo.c_str());
175         }
176         return json->ToString();
177     }
178 
HasOnItemDragMove()179     bool HasOnItemDragMove() override
180     {
181         return static_cast<bool>(onItemDragMoveEvent_);
182     }
183 
HasOnItemDrop()184     bool HasOnItemDrop() override
185     {
186         return static_cast<bool>(onItemDropEvent_);
187     }
188 
189     void InitItemDragEvent(const RefPtr<GestureEventHub>& gestureHub);
190     void HandleOnItemDragStart(const GestureEvent& info);
191     void OnItemDragStart(const GestureEvent& info, const DragDropInfo& dragDropInfo);
192     void HandleOnItemDragUpdate(const GestureEvent& info);
193     void HandleOnItemDragEnd(const GestureEvent& info);
194     void HandleOnItemDragCancel();
195     int32_t GetListItemIndexByPosition(float x, float y, bool strict = false);
196 private:
197     Axis GetDirection() const;
198 
199     OnScrollBeginEvent onScrollBeginEvent_;
200     OnScrollIndexEvent onScrollIndexEvent_;
201     OnScrollVisibleContentChangeEvent OnScrollVisibleContentChangeEvent_;
202     OnItemMoveEvent onItemMoveEvent_;
203     OnItemDragStartFunc onItemDragStartEvent_;
204     OnItemDragEnterFunc onItemDragEnterEvent_;
205     OnItemDragLeaveFunc onItemDragLeaveEvent_;
206     OnItemDragMoveFunc onItemDragMoveEvent_;
207     OnItemDropFunc onItemDropEvent_;
208 
209     RefPtr<DragDropProxy> dragDropProxy_;
210     int32_t draggedIndex_ = 0;
211 };
212 
213 } // namespace OHOS::Ace::NG
214 
215 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_LIST_LIST_EVENT_HUB_H