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