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_PATTERNS_RICH_EDITOR_ONE_STEP_DRAG_CONTROLLER_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_RICH_EDITOR_ONE_STEP_DRAG_CONTROLLER_H 18 19 #include "core/components_ng/pattern/rich_editor/rich_editor_pattern.h" 20 21 namespace OHOS::Ace::NG { 22 namespace { 23 using TagFilter = std::function<bool(const std::string&)>; 24 using Builder = std::function<void()>; 25 const TagFilter DEFAULT_FILTER = [](const std::string&) { return false; }; 26 const TagFilter IMAGE_TAG_FILTER = [](const std::string& tag) { return tag == V2::IMAGE_ETS_TAG; }; 27 const TagFilter PLACEHOLDER_TAG_FILTER = [](const std::string& tag) { return tag == V2::PLACEHOLDER_SPAN_ETS_TAG; }; 28 } 29 30 class OneStepDragParam { 31 public: 32 OneStepDragParam(const Builder& builder, const SelectMenuParam& selectMenuParam, 33 TextSpanType spanType, TagFilter tagFilter); 34 virtual ~OneStepDragParam() = default; 35 virtual MenuParam GetMenuParam(const RefPtr<FrameNode>& frameNode) const = 0; 36 virtual void EnableOneStepDrag(const RefPtr<FrameNode>& frameNode) = 0; 37 virtual void EnableDrag(const RefPtr<FrameNode>& frameNode) const; 38 void BindContextMenu(const RefPtr<FrameNode>& frameNode); 39 void FillJsonValue(const std::unique_ptr<JsonValue>& jsonValue) const; 40 void HandleDirtyNodes(); 41 inline void MarkDirtyNode(const WeakPtr<FrameNode>& dirtyFrameNode); 42 template<typename T> 43 void SetEnableEventResponse(int32_t start, int32_t end, std::list<WeakPtr<T>>& nodes); 44 45 const TextSpanType spanType_; 46 const std::function<bool(const std::string&)> tagFilter_; 47 48 protected: 49 Builder menuBuilder = nullptr; 50 Builder previewBuilder = nullptr; 51 std::function<void(int32_t, int32_t)> onAppear = nullptr; 52 std::function<void(int32_t, int32_t)> onDisappear = nullptr; 53 MenuParam menuParam; 54 std::queue<WeakPtr<FrameNode>> dirtyFrameNodes; 55 }; 56 57 class ImageOneStepDragParam : public OneStepDragParam { 58 public: ImageOneStepDragParam(const Builder & builder,const SelectMenuParam & selectMenuParam)59 ImageOneStepDragParam(const Builder& builder, const SelectMenuParam& selectMenuParam) 60 : OneStepDragParam(builder, selectMenuParam, TextSpanType::IMAGE, IMAGE_TAG_FILTER) {} 61 MenuParam GetMenuParam(const RefPtr<FrameNode>& frameNode) const override; 62 void EnableOneStepDrag(const RefPtr<FrameNode>& frameNode) override; 63 64 private: 65 float CalcImageScale(const RefPtr<ImageSpanNode>& imageNode) const; 66 }; 67 68 class PlaceholderOneStepDragParam : public OneStepDragParam { 69 public: PlaceholderOneStepDragParam(const Builder & builder,const SelectMenuParam & selectMenuParam)70 PlaceholderOneStepDragParam(const Builder& builder, const SelectMenuParam& selectMenuParam) 71 : OneStepDragParam(builder, selectMenuParam, TextSpanType::BUILDER, PLACEHOLDER_TAG_FILTER) {} 72 MenuParam GetMenuParam(const RefPtr<FrameNode>& frameNode) const override; 73 void EnableDrag(const RefPtr<FrameNode>& frameNode) const override; 74 void EnableOneStepDrag(const RefPtr<FrameNode>& frameNode) override; 75 }; 76 77 class OneStepDragController { 78 public: OneStepDragController(const WeakPtr<RichEditorPattern> & pattern)79 OneStepDragController(const WeakPtr<RichEditorPattern>& pattern) : pattern_(pattern) {} 80 static std::string GetJsonRange(TextSpanType spanType, const RefPtr<FrameNode>& frameNode); 81 bool SetMenuParam(TextSpanType spanType, const Builder& builder, const SelectMenuParam& menuParam); 82 void EnableOneStepDrag(TextSpanType spanType, const RefPtr<FrameNode>& frameNode); 83 void CopyDragCallback(TextSpanType spanType, const RefPtr<FrameNode>& frameNode); 84 void SetEnableEventResponse(const TextSelector& selector, 85 std::list<WeakPtr<ImageSpanNode>>& imageNodes, 86 std::list<WeakPtr<PlaceholderSpanNode>>& builderNodes); 87 void FillJsonValue(const std::unique_ptr<JsonValue>& jsonValue); 88 void MarkDirtyNode(const WeakPtr<ImageSpanNode>& dirtyFrameNode); 89 void HandleDirtyNodes(); 90 91 private: 92 const std::unique_ptr<OneStepDragParam>& GetDragParam(TextSpanType spanType) const; 93 const std::unique_ptr<OneStepDragParam>& CreateDragParam(TextSpanType spanType, const Builder& builder, 94 const SelectMenuParam& menuParam); 95 96 private: 97 const std::unique_ptr<OneStepDragParam> invalidParam = nullptr; 98 WeakPtr<RichEditorPattern> pattern_; 99 std::unique_ptr<OneStepDragParam> imageDragParam_ = nullptr; 100 std::unique_ptr<OneStepDragParam> placeholderDragParam_ = nullptr; 101 }; 102 103 } // namespace OHOS::Ace::NG 104 105 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_RICH_EDITOR_ONE_STEP_DRAG_CONTROLLER_H