1 /* 2 * Copyright (c) 2022-2023 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_TEXT_TEXT_MODEL_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TEXT_TEXT_MODEL_H 18 19 #include <functional> 20 #include <memory> 21 #include <mutex> 22 #include <optional> 23 #include <string> 24 25 #include "base/geometry/dimension.h" 26 #include "base/memory/ace_type.h" 27 #include "base/utils/macros.h" 28 #include "base/utils/noncopyable.h" 29 #include "core/components/box/drag_drop_event.h" 30 #include "core/components/common/properties/color.h" 31 #include "core/components/hyperlink/hyperlink_theme.h" 32 #include "core/components_ng/event/gesture_event_hub.h" 33 #include "core/components_ng/pattern/text/layout_info_interface.h" 34 #include "core/components_ng/pattern/text/text_menu_extension.h" 35 #include "core/components_ng/pattern/text/text_styles.h" 36 #include "core/components_ng/pattern/text_field/text_field_model.h" 37 #include "core/components_ng/pattern/text_field/text_selector.h" 38 39 namespace OHOS::Ace { 40 struct TextDetectConfig { 41 std::string types; 42 std::function<void(const std::string&)> onResult; 43 Color entityColor; 44 TextDecoration entityDecorationType = TextDecoration::UNDERLINE; 45 Color entityDecorationColor; 46 TextDecorationStyle entityDecorationStyle = TextDecorationStyle::SOLID; 47 TextDetectConfigTextDetectConfig48 TextDetectConfig() 49 { 50 auto pipeline = PipelineContext::GetCurrentContextSafely(); 51 CHECK_NULL_VOID(pipeline); 52 auto hyperlinkTheme = pipeline->GetTheme<HyperlinkTheme>(); 53 CHECK_NULL_VOID(hyperlinkTheme); 54 entityColor = hyperlinkTheme->GetTextColor(); 55 entityDecorationType = TextDecoration::UNDERLINE; 56 entityDecorationColor = entityColor; 57 entityDecorationStyle = TextDecorationStyle::SOLID; 58 } ToStringTextDetectConfig59 std::string ToString() const 60 { 61 auto jsonValue = JsonUtil::Create(true); 62 jsonValue->Put("types", types.c_str()); 63 jsonValue->Put("color", entityColor.ToString().c_str()); 64 auto decorationJson = JsonUtil::Create(true); 65 decorationJson->Put("type", static_cast<int64_t>(entityDecorationType)); 66 decorationJson->Put("color", entityDecorationColor.ToString().c_str()); 67 decorationJson->Put("style", static_cast<int64_t>(entityDecorationStyle)); 68 jsonValue->Put("decoration", decorationJson); 69 return jsonValue->ToString(); 70 } 71 }; 72 73 class ACE_EXPORT SpanStringBase : public AceType { 74 DECLARE_ACE_TYPE(SpanStringBase, AceType); 75 }; 76 class ACE_EXPORT TextControllerBase : public AceType { 77 DECLARE_ACE_TYPE(TextControllerBase, AceType); 78 79 public: 80 virtual void CloseSelectionMenu() = 0; 81 virtual void SetStyledString(const RefPtr<SpanStringBase>& value) = 0; 82 virtual WeakPtr<NG::LayoutInfoInterface> GetLayoutInfoInterface() = 0; 83 }; 84 85 class ACE_FORCE_EXPORT TextModel { 86 public: 87 static TextModel* GetInstance(); 88 virtual ~TextModel() = default; 89 90 virtual void Create(const std::string& content) = 0; 91 virtual void Create(const RefPtr<SpanStringBase>& spanString) = 0; 92 virtual void SetFont(const Font& value) = 0; 93 virtual void SetFontSize(const Dimension& value) = 0; 94 virtual void SetTextColor(const Color& value) = 0; 95 virtual void SetTextShadow(const std::vector<Shadow>& value) = 0; 96 virtual void SetItalicFontStyle(Ace::FontStyle value) = 0; 97 virtual void SetFontWeight(FontWeight value) = 0; 98 virtual void SetVariableFontWeight(int32_t value) = 0; 99 virtual void SetEnableVariableFontWeight(bool value) = 0; 100 virtual void SetMinFontScale(const float value) = 0; 101 virtual void SetMaxFontScale(const float value) = 0; 102 virtual void SetFontFamily(const std::vector<std::string>& value) = 0; 103 virtual void SetWordBreak(WordBreak wordBreak) = 0; 104 virtual void SetLineBreakStrategy(LineBreakStrategy lineBreakStrategy) = 0; 105 virtual void SetTextAlign(TextAlign value) = 0; 106 virtual void SetTextOverflow(TextOverflow value) = 0; 107 virtual void SetMaxLines(uint32_t value) = 0; 108 virtual void SetTextIndent(const Dimension& value) = 0; 109 virtual void SetLineHeight(const Dimension& value) = 0; 110 virtual void SetLineSpacing(const Dimension& value) = 0; 111 virtual void SetTextDecoration(TextDecoration value) = 0; 112 virtual void SetTextDecorationColor(const Color& value) = 0; 113 virtual void SetTextDecorationStyle(TextDecorationStyle value) = 0; 114 virtual void SetBaselineOffset(const Dimension& value) = 0; 115 virtual void SetTextCase(TextCase value) = 0; 116 virtual void SetLetterSpacing(const Dimension& value) = 0; 117 virtual void SetAdaptMinFontSize(const Dimension& value) = 0; 118 virtual void SetAdaptMaxFontSize(const Dimension& value) = 0; 119 virtual void SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value) = 0; 120 virtual void SetTextDetectEnable(bool value) = 0; 121 virtual void SetTextDetectConfig(const TextDetectConfig& textDetectConfig) = 0; OnSetWidth()122 virtual void OnSetWidth() {}; OnSetHeight()123 virtual void OnSetHeight() {}; OnSetAlign()124 virtual void OnSetAlign() {}; 125 virtual void SetOnClick(std::function<void(BaseEventInfo* info)>&& click) = 0; 126 virtual void ClearOnClick() = 0; 127 virtual void SetRemoteMessage(std::function<void()>&& click) = 0; 128 virtual void SetCopyOption(CopyOptions copyOption) = 0; 129 virtual void SetOnCopy(std::function<void(const std::string&)>&& func) = 0; 130 virtual void SetEllipsisMode(EllipsisMode modal) = 0; 131 132 virtual void SetOnDragStart(NG::OnDragStartFunc&& onDragStart) = 0; 133 virtual void SetOnDragEnter(NG::OnDragDropFunc&& onDragEnter) = 0; 134 virtual void SetOnDragMove(NG::OnDragDropFunc&& onDragMove) = 0; 135 virtual void SetOnDragLeave(NG::OnDragDropFunc&& onDragLeave) = 0; 136 virtual void SetOnDrop(NG::OnDragDropFunc&& onDrop) = 0; 137 138 virtual void SetTextSelection(int32_t startIndex, int32_t endIndex) = 0; 139 virtual void SetTextSelectableMode(TextSelectableMode textSelectable) = 0; 140 virtual void SetTextCaretColor(const Color& value) = 0; 141 virtual void SetSelectedBackgroundColor(const Color& value) = 0; BindSelectionMenu(NG::TextSpanType & spanType,NG::TextResponseType & responseType,std::function<void ()> & buildFunc,NG::SelectMenuParam & menuParam)142 virtual void BindSelectionMenu(NG::TextSpanType& spanType, NG::TextResponseType& responseType, 143 std::function<void()>& buildFunc, NG::SelectMenuParam& menuParam) {}; SetOnTextSelectionChange(std::function<void (int32_t,int32_t)> && func)144 virtual void SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func) {}; GetTextController()145 virtual RefPtr<TextControllerBase> GetTextController() 146 { 147 return nullptr; 148 }; 149 virtual void SetClipEdge(bool clip) = 0; 150 virtual void SetFontFeature(const std::list<std::pair<std::string, int32_t>>& value) = 0; SetSelectionMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick)151 virtual void SetSelectionMenuOptions( 152 const NG::OnCreateMenuCallback&& onCreateMenuCallback, const NG::OnMenuItemClickCallback&& onMenuItemClick) {}; SetResponseRegion(bool isUserSetResponseRegion)153 virtual void SetResponseRegion(bool isUserSetResponseRegion) {}; 154 virtual void SetHalfLeading(bool halfLeading) = 0; 155 virtual void SetEnableHapticFeedback(bool state) = 0; 156 157 private: 158 static std::unique_ptr<TextModel> instance_; 159 static std::mutex mutex_; 160 }; 161 } // namespace OHOS::Ace 162 163 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TEXT_TEXT_MODEL_H 164