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