• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_MANAGER_DRAG_DROP_DRAG_DROP_MANAGER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_MANAGER_DRAG_DROP_DRAG_DROP_MANAGER_H
18 
19 #include <cstdint>
20 #include <string>
21 
22 #include "base/memory/ace_type.h"
23 #include "base/utils/noncopyable.h"
24 #include "base/window/drag_window.h"
25 #include "core/components_ng/base/frame_node.h"
26 #include "core/components_ng/manager/drag_drop/drag_drop_proxy.h"
27 #include "core/gestures/velocity_tracker.h"
28 
29 namespace OHOS::Ace::NG {
30 
31 class ACE_EXPORT DragDropManager : public virtual AceType {
32     DECLARE_ACE_TYPE(DragDropManager, AceType);
33 
34 public:
35     DragDropManager() = default;
36     ~DragDropManager() override = default;
37 
38     RefPtr<DragDropProxy> CreateAndShowDragWindow(const RefPtr<PixelMap>& pixelMap, const GestureEvent& info);
39     RefPtr<DragDropProxy> CreateAndShowDragWindow(const RefPtr<UINode>& customNode, const GestureEvent& info);
40     RefPtr<DragDropProxy> CreateTextDragDropProxy();
41 
AddDragFrameNode(int32_t id,const WeakPtr<FrameNode> & dragFrameNode)42     void AddDragFrameNode(int32_t id, const WeakPtr<FrameNode>& dragFrameNode)
43     {
44         dragFrameNodes_.try_emplace(id, dragFrameNode);
45     }
46 
RemoveDragFrameNode(int32_t id)47     void RemoveDragFrameNode(int32_t id)
48     {
49         dragFrameNodes_.erase(id);
50         gridDragFrameNodes_.erase(id);
51         listDragFrameNodes_.erase(id);
52         textFieldDragFrameNodes_.erase(id);
53     }
54 
AddGridDragFrameNode(int32_t id,const WeakPtr<FrameNode> & dragFrameNode)55     void AddGridDragFrameNode(int32_t id, const WeakPtr<FrameNode>& dragFrameNode)
56     {
57         gridDragFrameNodes_.try_emplace(id, dragFrameNode);
58     }
59 
AddListDragFrameNode(int32_t id,const WeakPtr<FrameNode> & dragFrameNode)60     void AddListDragFrameNode(int32_t id, const WeakPtr<FrameNode>& dragFrameNode)
61     {
62         listDragFrameNodes_.try_emplace(id, dragFrameNode);
63     }
64 
AddTextFieldDragFrameNode(int32_t id,const WeakPtr<FrameNode> & dragFrameNode)65     void AddTextFieldDragFrameNode(int32_t id, const WeakPtr<FrameNode>& dragFrameNode)
66     {
67         textFieldDragFrameNodes_.try_emplace(id, dragFrameNode);
68     }
69 
70     void UpdateDragWindowPosition(int32_t globalX, int32_t globalY);
71     void OnDragStart(const Point& point, const RefPtr<FrameNode>& frameNode);
72     void OnDragMove(const Point& point, const std::string& extraInfo);
73     void OnDragEnd(const Point& point, const std::string& extraInfo);
74     void OnTextDragEnd(float globalX, float globalY, const std::string& extraInfo);
75     void onDragCancel();
76     void OnItemDragStart(float globalX, float globalY, const RefPtr<FrameNode>& frameNode);
77     void OnItemDragMove(float globalX, float globalY, int32_t draggedIndex, DragType dragType);
78     void OnItemDragEnd(float globalX, float globalY, int32_t draggedIndex, DragType dragType);
79     void onItemDragCancel();
80     void AddDataToClipboard(const std::string& extraInfo);
81     void GetExtraInfoFromClipboard(std::string& extraInfo);
82     void RestoreClipboardData();
83     void DestroyDragWindow();
84 #ifdef ENABLE_DRAG_FRAMEWORK
85     void UpdateDragAllowDrop(const RefPtr<FrameNode>& dragFrameNode, const bool isCopy);
86     void RequireSummary();
87     void ClearSummary();
SetSummaryMap(const std::map<std::string,int64_t> & summaryMap)88     void SetSummaryMap(const std::map<std::string, int64_t>& summaryMap)
89     {
90         summaryMap_ = summaryMap;
91     }
92     RefPtr<DragDropProxy> CreateFrameworkDragDropProxy();
93     void UpdatePixelMapPosition(int32_t globalX, int32_t globalY);
94     std::string GetExtraInfo();
95     void SetExtraInfo(const std::string& extraInfo);
96     void ClearExtraInfo();
97 #endif // ENABLE_DRAG_FRAMEWORK
98     void UpdateDragEvent(RefPtr<OHOS::Ace::DragEvent>& event, const Point& point);
99     bool CheckDragDropProxy(int64_t id) const;
100 
IsWindowConsumed()101     bool IsWindowConsumed()
102     {
103         return isWindowConsumed_;
104     }
105 
SetIsWindowConsumed(bool consumed)106     void SetIsWindowConsumed(bool consumed)
107     {
108         isWindowConsumed_ = consumed;
109     }
110 
IsDragged()111     bool IsDragged() const
112     {
113         return isDragged_;
114     }
115 
SetIsDragged(bool isDragged)116     void SetIsDragged(bool isDragged)
117     {
118         if (isDragged && isDragged_ != isDragged && notifyInDraggedCallback_) {
119             notifyInDraggedCallback_();
120         }
121         isDragged_ = isDragged;
122     }
123 
SetIsDragCancel(bool isDragCancel)124     void SetIsDragCancel(bool isDragCancel)
125     {
126         isDragCancel_ = isDragCancel;
127     }
128 
SetIsMouseDrag(bool isMouseDragged)129     void SetIsMouseDrag(bool isMouseDragged)
130     {
131         isMouseDragged_ = isMouseDragged;
132     }
133 
SetIsDragWindowShow(bool isDragWindowShow)134     void SetIsDragWindowShow(bool isDragWindowShow)
135     {
136         isDragWindowShow_ = isDragWindowShow;
137     }
138 
IsDragWindowShow()139     bool IsDragWindowShow()
140     {
141         return isDragWindowShow_;
142     }
143 
144     RefPtr<FrameNode> FindTargetInChildNodes(const RefPtr<UINode> parentNode,
145         std::vector<RefPtr<FrameNode>> hitFrameNodes, bool findDrop);
146 
SetNotifyInDraggedCallback(const std::function<void (void)> & callback)147     void SetNotifyInDraggedCallback(const std::function<void(void)>& callback)
148     {
149         notifyInDraggedCallback_ = callback;
150     }
151 
152 private:
153     RefPtr<FrameNode> FindDragFrameNodeByPosition(float globalX, float globalY, DragType dragType, bool findDrop);
154     void FireOnDragEvent(
155         const RefPtr<FrameNode>& frameNode, const Point& point, DragEventType type, const std::string& extraInfo);
156     void FireOnItemDragEvent(const RefPtr<FrameNode>& frameNode, DragType dragType,
157         const ItemDragInfo& itemDragInfo, DragEventType type, int32_t draggedIndex, int32_t insertIndex = 0);
158     bool FireOnItemDropEvent(const RefPtr<FrameNode>& frameNode, DragType dragType,
159         const ItemDragInfo& itemDragInfo, int32_t draggedIndex, int32_t insertIndex, bool isSuccess);
160     int32_t GetItemIndex(const RefPtr<FrameNode>& frameNode, DragType dragType, float globalX, float globalY);
161     void CreateDragWindow(const GestureEvent& info, uint32_t width, uint32_t height);
162     RefPtr<FrameNode> CreateDragRootNode(const RefPtr<UINode>& customNode);
163     void ClearVelocityInfo();
164     void UpdateVelocityTrackerPoint(const Point& point, bool isEnd = false);
165     void PrintDragFrameNode(const Point& point, const RefPtr<FrameNode>& dragFrameNode);
166 
167     std::map<int32_t, WeakPtr<FrameNode>> dragFrameNodes_;
168     std::map<int32_t, WeakPtr<FrameNode>> gridDragFrameNodes_;
169     std::map<int32_t, WeakPtr<FrameNode>> listDragFrameNodes_;
170     std::map<int32_t, WeakPtr<FrameNode>> textFieldDragFrameNodes_;
171     RefPtr<DragWindow> dragWindow_;
172     RefPtr<FrameNode> draggedFrameNode_;
173     RefPtr<FrameNode> preTargetFrameNode_;
174     RefPtr<FrameNode> draggedGridFrameNode_;
175     RefPtr<FrameNode> preGridTargetFrameNode_;
176     RefPtr<FrameNode> dragWindowRootNode_;
177     RefPtr<Clipboard> clipboard_;
178     std::function<void(const std::string&)> addDataCallback_ = nullptr;
179     std::function<void(const std::string&)> getDataCallback_ = nullptr;
180     std::function<void(const std::string&)> deleteDataCallback_ = nullptr;
181     std::string extraInfo_;
182     std::unique_ptr<JsonValue> newData_ = nullptr;
183     bool isDragCancel_ = false;
184 #ifdef ENABLE_DRAG_FRAMEWORK
185     std::map<std::string, int64_t> summaryMap_;
186 #endif // ENABLE_DRAG_FRAMEWORK
187     int64_t currentId_ = -1;
188 
189     std::function<void(void)> notifyInDraggedCallback_ = nullptr;
190     bool isDragged_ = false;
191     bool isMouseDragged_ = false;
192     bool isWindowConsumed_ = false;
193     bool isDragWindowShow_ = false;
194     VelocityTracker velocityTracker_;
195 
196     ACE_DISALLOW_COPY_AND_MOVE(DragDropManager);
197 };
198 } // namespace OHOS::Ace::NG
199 
200 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_MANAGER_DRAG_DROP_DRAG_DROP_MANAGER_H
201