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 #include "core/interfaces/native/node/node_text_modifier.h"
16 
17 #include "base/utils/utils.h"
18 #include "bridge/common/utils/utils.h"
19 #include "core/components/common/layout/constants.h"
20 #include "core/components/common/properties/text_style.h"
21 #include "core/components_ng/base/frame_node.h"
22 #include "core/components_ng/base/view_abstract.h"
23 #include "core/interfaces/arkoala/arkoala_api.h"
24 #include "core/pipeline/base/element_register.h"
25 #include "frameworks/core/components/common/layout/constants.h"
26 #include "frameworks/core/components/common/properties/text_style.h"
27 #include "frameworks/core/components_ng/pattern/text/text_model_ng.h"
28 #include "core/components/common/properties/text_style_parser.h"
29 
30 namespace OHOS::Ace::NG {
31 constexpr int DEFAULT_SELECTION = -1;
32 constexpr Dimension DEFAULT_LINE_HEIGHT = Dimension(0.0, DimensionUnit::PX);
33 constexpr Dimension DEFAULT_LINE_SPACING = Dimension(0.0, DimensionUnit::PX);
34 constexpr TextDecoration DEFAULT_TEXT_DECORATION = TextDecoration::NONE;
35 constexpr Color DEFAULT_DECORATION_COLOR = Color(0xff000000);
36 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
37 constexpr TextCase DEFAULT_TEXT_CASE = TextCase::NORMAL;
38 constexpr uint32_t DEFAULT_MAX_LINE = Infinity<uint32_t>();
39 constexpr bool DEFAULT_TEXT_DRAGGABLE = false;
40 constexpr bool DEFAULT_TEXT_SENSITIVE = false;
41 constexpr Dimension DEFAULT_MAX_FONT_SIZE;
42 constexpr Dimension DEFAULT_MIN_FONT_SIZE;
43 constexpr float DEFAULT_MIN_FONT_SCALE = 0.0f;
44 constexpr float DEFAULT_MAX_FONT_SCALE = static_cast<float>(INT32_MAX);
45 constexpr CopyOptions DEFAULT_COPY_OPTION = CopyOptions::None;
46 constexpr Dimension DEFAULT_BASELINE_OFFSET = 0.0_fp;
47 constexpr Dimension DEFAULT_FONT_SIZE = 16.0_fp;
48 constexpr FontWeight DEFAULT_FONT_WEIGHT = FontWeight::NORMAL;
49 constexpr int32_t DEFAULT_VARIABLE_FONT_WEIGHT = 400;
50 constexpr Ace::FontStyle DEFAULT_FONT_STYLE = Ace::FontStyle::NORMAL;
51 const std::string DEFAULT_FAMILY = "HarmonyOS Sans";
52 const std::string EMPTY_STRING = "";
53 const std::vector<OHOS::Ace::FontStyle> FONT_STYLES = { OHOS::Ace::FontStyle::NORMAL, OHOS::Ace::FontStyle::ITALIC };
54 const std::vector<OHOS::Ace::TextAlign> TEXT_ALIGNS = { OHOS::Ace::TextAlign::START, OHOS::Ace::TextAlign::CENTER,
55     OHOS::Ace::TextAlign::END, OHOS::Ace::TextAlign::JUSTIFY, OHOS::Ace::TextAlign::LEFT, OHOS::Ace::TextAlign::RIGHT };
56 const std::vector<TextHeightAdaptivePolicy> HEIGHT_ADAPTIVE_POLICY = { TextHeightAdaptivePolicy::MAX_LINES_FIRST,
57     TextHeightAdaptivePolicy::MIN_FONT_SIZE_FIRST, TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST };
58 const std::vector<EllipsisMode> ELLIPSIS_MODALS = { EllipsisMode::HEAD, EllipsisMode::MIDDLE, EllipsisMode::TAIL };
59 const std::vector<TextSelectableMode> TEXT_SELECTABLE_MODE = { TextSelectableMode::SELECTABLE_UNFOCUSABLE,
60     TextSelectableMode::SELECTABLE_FOCUSABLE, TextSelectableMode::UNSELECTABLE };
61 constexpr bool DEFAULT_ENABLE_TEXT_DETECTOR = false;
62 const std::vector<std::string> TEXT_DETECT_TYPES = { "phoneNum", "url", "email", "location", "datetime" };
63 constexpr int NUM_0 = 0;
64 constexpr int NUM_1 = 1;
65 constexpr int NUM_2 = 2;
66 constexpr int NUM_3 = 3;
67 constexpr int NUM_4 = 4;
68 
69 std::map<TextHeightAdaptivePolicy, int> TEXT_HEIGHT_ADAPTIVE_POLICY_MAP = {
70     { TextHeightAdaptivePolicy::MAX_LINES_FIRST, 0 },
71     { TextHeightAdaptivePolicy::MIN_FONT_SIZE_FIRST, 1 },
72     { TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST, 2 } };
73 
74 const float ERROR_FLOAT_CODE = -1.0f;
75 const int32_t ERROR_INT_CODE = -1;
76 
ConvertStrToFontWeight(ArkUI_CharPtr weight,FontWeight defaultFontWeight=FontWeight::NORMAL)77 FontWeight ConvertStrToFontWeight(ArkUI_CharPtr weight, FontWeight defaultFontWeight = FontWeight::NORMAL)
78 {
79     std::string weightStr(weight);
80     return StringUtils::StringToFontWeight(weightStr, defaultFontWeight);
81 }
82 namespace {
83 
84 std::string g_strValue;
85 
SetTextContent(ArkUINodeHandle node,ArkUI_CharPtr value)86 void SetTextContent(ArkUINodeHandle node, ArkUI_CharPtr value)
87 {
88     auto* frameNode = reinterpret_cast<FrameNode*>(node);
89     CHECK_NULL_VOID(frameNode);
90     std::string content(value);
91     TextModelNG::InitText(frameNode, content);
92 }
93 
GetTextContent(ArkUINodeHandle node)94 const char* GetTextContent(ArkUINodeHandle node)
95 {
96     auto* frameNode = reinterpret_cast<FrameNode*>(node);
97     CHECK_NULL_RETURN(frameNode, nullptr);
98     g_strValue = TextModelNG::GetContent(frameNode);
99     return g_strValue.c_str();
100 }
101 
SetFontWeightStr(ArkUINodeHandle node,ArkUI_CharPtr weight)102 void SetFontWeightStr(ArkUINodeHandle node, ArkUI_CharPtr weight)
103 {
104     auto* frameNode = reinterpret_cast<FrameNode*>(node);
105     CHECK_NULL_VOID(frameNode);
106     TextModelNG::SetFontWeight(frameNode, ConvertStrToFontWeight(weight));
107 }
108 
SetFontWeightWithOption(ArkUINodeHandle node,const struct ArkUIFontWeightWithOptionsStruct * weightInfo)109 void SetFontWeightWithOption(ArkUINodeHandle node, const struct ArkUIFontWeightWithOptionsStruct* weightInfo)
110 {
111     auto* frameNode = reinterpret_cast<FrameNode*>(node);
112     CHECK_NULL_VOID(frameNode);
113     TextModelNG::SetFontWeight(frameNode, ConvertStrToFontWeight(weightInfo->weight));
114     TextModelNG::SetVariableFontWeight(frameNode, weightInfo->variableFontWeight);
115     TextModelNG::SetEnableVariableFontWeight(frameNode, weightInfo->enableVariableFontWeight);
116 }
117 
SetFontWeight(ArkUINodeHandle node,ArkUI_Int32 weight)118 void SetFontWeight(ArkUINodeHandle node, ArkUI_Int32 weight)
119 {
120     auto* frameNode = reinterpret_cast<FrameNode*>(node);
121     CHECK_NULL_VOID(frameNode);
122     TextModelNG::SetFontWeight(frameNode, static_cast<FontWeight>(weight));
123 }
124 
SetOnClick(ArkUINodeHandle node,void * callback)125 void SetOnClick(ArkUINodeHandle node, void* callback)
126 {
127     auto *frameNode = reinterpret_cast<FrameNode *>(node);
128     CHECK_NULL_VOID(frameNode);
129     GestureEventFunc* click = nullptr;
130     if (callback) {
131         click = reinterpret_cast<GestureEventFunc*>(callback);
132         TextModelNG::SetOnClick(frameNode, std::move(*click));
133     } else {
134         TextModelNG::SetOnClick(frameNode, nullptr);
135     }
136 }
137 
ResetOnClick(ArkUINodeHandle node)138 void ResetOnClick(ArkUINodeHandle node)
139 {
140     auto *frameNode = reinterpret_cast<FrameNode *>(node);
141     CHECK_NULL_VOID(frameNode);
142     TextModelNG::ClearOnClick(frameNode);
143 }
144 
SetResponseRegion(ArkUINodeHandle node,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)145 void SetResponseRegion(ArkUINodeHandle node, const ArkUI_Float32* values, const ArkUI_Int32* units, ArkUI_Int32 length)
146 {
147     auto* frameNode = reinterpret_cast<FrameNode*>(node);
148     CHECK_NULL_VOID(frameNode);
149     std::vector<DimensionRect> region;
150     for (int32_t i = 0; i < length / NUM_4; i++) {
151         CalcDimension xDimen =
152             CalcDimension(values[i * NUM_4 + NUM_0], static_cast<DimensionUnit>(units[i * NUM_4 + NUM_0]));
153         CalcDimension yDimen =
154             CalcDimension(values[i * NUM_4 + NUM_1], static_cast<DimensionUnit>(units[i * NUM_4 + NUM_1]));
155         CalcDimension widthDimen =
156             CalcDimension(values[i * NUM_4 + NUM_2], static_cast<DimensionUnit>(units[i * NUM_4 + NUM_2]));
157         CalcDimension heightDimen =
158             CalcDimension(values[i * NUM_4 + NUM_3], static_cast<DimensionUnit>(units[i * NUM_4 + NUM_3]));
159         DimensionOffset offsetDimen(xDimen, yDimen);
160         DimensionRect dimenRect(widthDimen, heightDimen, offsetDimen);
161         region.emplace_back(dimenRect);
162     }
163     TextModelNG::SetResponseRegion(frameNode, region);
164 }
165 
ResetResponseRegion(ArkUINodeHandle node)166 void ResetResponseRegion(ArkUINodeHandle node)
167 {
168     auto *frameNode = reinterpret_cast<FrameNode *>(node);
169     CHECK_NULL_VOID(frameNode);
170     TextModelNG::ClearResponseRegion(frameNode);
171 }
ResetFontWeight(ArkUINodeHandle node)172 void ResetFontWeight(ArkUINodeHandle node)
173 {
174     auto* frameNode = reinterpret_cast<FrameNode*>(node);
175     CHECK_NULL_VOID(frameNode);
176     TextModelNG::SetFontWeight(frameNode, Ace::FontWeight::NORMAL);
177     TextModelNG::SetVariableFontWeight(frameNode, DEFAULT_VARIABLE_FONT_WEIGHT);
178     TextModelNG::SetEnableVariableFontWeight(frameNode, false);
179 }
180 
SetFontStyle(ArkUINodeHandle node,ArkUI_Uint32 fontStyle)181 void SetFontStyle(ArkUINodeHandle node, ArkUI_Uint32 fontStyle)
182 {
183     auto* frameNode = reinterpret_cast<FrameNode*>(node);
184     CHECK_NULL_VOID(frameNode);
185     if (fontStyle < 0 || fontStyle >= FONT_STYLES.size()) {
186         return;
187     }
188     TextModelNG::SetItalicFontStyle(frameNode, FONT_STYLES[fontStyle]);
189 }
190 
ResetFontStyle(ArkUINodeHandle node)191 void ResetFontStyle(ArkUINodeHandle node)
192 {
193     auto* frameNode = reinterpret_cast<FrameNode*>(node);
194     CHECK_NULL_VOID(frameNode);
195     TextModelNG::SetItalicFontStyle(frameNode, OHOS::Ace::FontStyle::NORMAL);
196 }
197 
SetTextAlign(ArkUINodeHandle node,ArkUI_Uint32 testAlign)198 void SetTextAlign(ArkUINodeHandle node, ArkUI_Uint32 testAlign)
199 {
200     auto* frameNode = reinterpret_cast<FrameNode*>(node);
201     CHECK_NULL_VOID(frameNode);
202     if (testAlign < 0 || testAlign >= TEXT_ALIGNS.size()) {
203         return;
204     }
205     TextModelNG::SetTextAlign(frameNode, TEXT_ALIGNS[testAlign]);
206 }
207 
GetTextAlign(ArkUINodeHandle node)208 int32_t GetTextAlign(ArkUINodeHandle node)
209 {
210     auto defaultTextAlign = static_cast<int32_t>(OHOS::Ace::TextAlign::START);
211     auto* frameNode = reinterpret_cast<FrameNode*>(node);
212     CHECK_NULL_RETURN(frameNode, defaultTextAlign);
213     return static_cast<int32_t>(TextModelNG::GetTextAlign(frameNode));
214 }
215 
ResetTextAlign(ArkUINodeHandle node)216 void ResetTextAlign(ArkUINodeHandle node)
217 {
218     auto* frameNode = reinterpret_cast<FrameNode*>(node);
219     CHECK_NULL_VOID(frameNode);
220     TextModelNG::SetTextAlign(frameNode, OHOS::Ace::TextAlign::START);
221 }
222 
SetFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)223 void SetFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
224 {
225     auto* frameNode = reinterpret_cast<FrameNode*>(node);
226     CHECK_NULL_VOID(frameNode);
227     TextModelNG::SetTextColor(frameNode, Color(color));
228 }
229 
ResetFontColor(ArkUINodeHandle node)230 void ResetFontColor(ArkUINodeHandle node)
231 {
232     auto* frameNode = reinterpret_cast<FrameNode*>(node);
233     CHECK_NULL_VOID(frameNode);
234     Color textColor;
235     auto theme = GetTheme<TextTheme>();
236     CHECK_NULL_VOID(theme);
237     textColor = theme->GetTextStyle().GetTextColor();
238     TextModelNG::SetTextColor(frameNode, textColor);
239 }
240 
GetFontColor(ArkUINodeHandle node)241 uint32_t GetFontColor(ArkUINodeHandle node)
242 {
243     auto* frameNode = reinterpret_cast<FrameNode*>(node);
244     CHECK_NULL_RETURN(frameNode, Color::BLACK.GetValue());
245     return TextModelNG::GetFontColor(frameNode).GetValue();
246 }
247 
SetTextForegroundColor(ArkUINodeHandle node,ArkUI_Bool isColor,uint32_t color)248 void SetTextForegroundColor(ArkUINodeHandle node, ArkUI_Bool isColor, uint32_t color)
249 {
250     auto* frameNode = reinterpret_cast<FrameNode*>(node);
251     CHECK_NULL_VOID(frameNode);
252     if (isColor) {
253         TextModelNG::SetTextColor(frameNode, Color(color));
254     } else {
255         TextModelNG::SetTextColor(frameNode, Color::FOREGROUND);
256         auto strategy = static_cast<ForegroundColorStrategy>(color);
257         ViewAbstract::SetForegroundColorStrategy(frameNode, strategy);
258     }
259 }
260 
ResetTextForegroundColor(ArkUINodeHandle node)261 void ResetTextForegroundColor(ArkUINodeHandle node)
262 {
263     ResetFontColor(node);
264 }
265 
SetFontSize(ArkUINodeHandle node,ArkUI_Float32 fontSize,ArkUI_Int32 unit)266 void SetFontSize(ArkUINodeHandle node, ArkUI_Float32 fontSize, ArkUI_Int32 unit)
267 {
268     auto* frameNode = reinterpret_cast<FrameNode*>(node);
269     CHECK_NULL_VOID(frameNode);
270     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
271 
272     if (fontSize < 0 || unitEnum < OHOS::Ace::DimensionUnit::PX || unitEnum > OHOS::Ace::DimensionUnit::CALC ||
273         unitEnum == OHOS::Ace::DimensionUnit::PERCENT) {
274         auto theme = GetTheme<TextTheme>();
275         CHECK_NULL_VOID(theme);
276         CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
277         TextModelNG::SetFontSize(frameNode, fontSize);
278     } else {
279         TextModelNG::SetFontSize(frameNode, Dimension(fontSize, static_cast<OHOS::Ace::DimensionUnit>(unit)));
280     }
281 }
282 
ResetFontSize(ArkUINodeHandle node)283 void ResetFontSize(ArkUINodeHandle node)
284 {
285     auto* frameNode = reinterpret_cast<FrameNode*>(node);
286     CHECK_NULL_VOID(frameNode);
287     auto theme = GetTheme<TextTheme>();
288     CHECK_NULL_VOID(theme);
289     CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
290     TextModelNG::SetFontSize(frameNode, fontSize);
291 }
292 
SetTextLineHeight(ArkUINodeHandle node,ArkUI_Float32 number,ArkUI_Int32 unit)293 void SetTextLineHeight(ArkUINodeHandle node, ArkUI_Float32 number, ArkUI_Int32 unit)
294 {
295     auto* frameNode = reinterpret_cast<FrameNode*>(node);
296     CHECK_NULL_VOID(frameNode);
297     TextModelNG::SetLineHeight(frameNode, Dimension(number, static_cast<DimensionUnit>(unit)));
298 }
299 
GetTextLineHeight(ArkUINodeHandle node)300 float GetTextLineHeight(ArkUINodeHandle node)
301 {
302     auto* frameNode = reinterpret_cast<FrameNode*>(node);
303     CHECK_NULL_RETURN(frameNode, 0.0f);
304     return TextModelNG::GetLineHeight(frameNode);
305 }
306 
ResetTextLineHeight(ArkUINodeHandle node)307 void ResetTextLineHeight(ArkUINodeHandle node)
308 {
309     auto* frameNode = reinterpret_cast<FrameNode*>(node);
310     CHECK_NULL_VOID(frameNode);
311     TextModelNG::SetLineHeight(frameNode, DEFAULT_LINE_HEIGHT);
312 }
313 
SetTextTextOverflow(ArkUINodeHandle node,ArkUI_Int32 value)314 void SetTextTextOverflow(ArkUINodeHandle node, ArkUI_Int32 value)
315 {
316     auto* frameNode = reinterpret_cast<FrameNode*>(node);
317     CHECK_NULL_VOID(frameNode);
318     TextOverflow valueTextOverflow = static_cast<TextOverflow>(value);
319     TextModelNG::SetTextOverflow(frameNode, valueTextOverflow);
320 }
321 
GetTextTextOverflow(ArkUINodeHandle node)322 int32_t GetTextTextOverflow(ArkUINodeHandle node)
323 {
324     int defaultTextOverflow = static_cast<int32_t>(TextOverflow::NONE);
325     auto* frameNode = reinterpret_cast<FrameNode*>(node);
326     CHECK_NULL_RETURN(frameNode, defaultTextOverflow);
327     return static_cast<int32_t>(TextModelNG::GetTextOverflow(frameNode));
328 }
329 
ResetTextTextOverflow(ArkUINodeHandle node)330 void ResetTextTextOverflow(ArkUINodeHandle node)
331 {
332     auto* frameNode = reinterpret_cast<FrameNode*>(node);
333     CHECK_NULL_VOID(frameNode);
334     TextModelNG::SetTextOverflow(frameNode, TextOverflow::NONE);
335 }
336 
SetTextDecoration(ArkUINodeHandle node,ArkUI_Int32 decoration,ArkUI_Uint32 color,ArkUI_Int32 style)337 void SetTextDecoration(ArkUINodeHandle node, ArkUI_Int32 decoration, ArkUI_Uint32 color, ArkUI_Int32 style)
338 {
339     auto* frameNode = reinterpret_cast<FrameNode*>(node);
340     CHECK_NULL_VOID(frameNode);
341     TextModelNG::SetTextDecoration(frameNode, static_cast<TextDecoration>(decoration));
342     TextModelNG::SetTextDecorationColor(frameNode, Color(color));
343     TextModelNG::SetTextDecorationStyle(frameNode, static_cast<TextDecorationStyle>(style));
344 }
345 
GetTextDecoration(ArkUINodeHandle node,ArkUITextDecorationType * decoration)346 void GetTextDecoration(ArkUINodeHandle node, ArkUITextDecorationType* decoration)
347 {
348     CHECK_NULL_VOID(decoration);
349     auto* frameNode = reinterpret_cast<FrameNode*>(node);
350     CHECK_NULL_VOID(frameNode);
351     decoration->decorationType = static_cast<int32_t>(TextModelNG::GetDecoration(frameNode));
352     decoration->color = TextModelNG::GetTextDecorationColor(frameNode).GetValue();
353     decoration->style = static_cast<int32_t>(TextModelNG::GetTextDecorationStyle(frameNode));
354 }
355 
ResetTextDecoration(ArkUINodeHandle node)356 void ResetTextDecoration(ArkUINodeHandle node)
357 {
358     auto* frameNode = reinterpret_cast<FrameNode*>(node);
359     CHECK_NULL_VOID(frameNode);
360     TextModelNG::SetTextDecoration(frameNode, DEFAULT_TEXT_DECORATION);
361     TextModelNG::SetTextDecorationColor(frameNode, DEFAULT_DECORATION_COLOR);
362     TextModelNG::SetTextDecorationStyle(frameNode, DEFAULT_DECORATION_STYLE);
363 }
364 
SetTextTextCase(ArkUINodeHandle node,ArkUI_Int32 value)365 void SetTextTextCase(ArkUINodeHandle node, ArkUI_Int32 value)
366 {
367     auto* frameNode = reinterpret_cast<FrameNode*>(node);
368     CHECK_NULL_VOID(frameNode);
369     TextModelNG::SetTextCase(frameNode, static_cast<TextCase>(value));
370 }
371 
GetTextTextCase(ArkUINodeHandle node)372 int32_t GetTextTextCase(ArkUINodeHandle node)
373 {
374     int32_t defaultTextCase = static_cast<int32_t>(DEFAULT_TEXT_CASE);
375     auto* frameNode = reinterpret_cast<FrameNode*>(node);
376     CHECK_NULL_RETURN(frameNode, defaultTextCase);
377     return static_cast<int32_t>(TextModelNG::GetTextCase(frameNode));
378 }
379 
ResetTextTextCase(ArkUINodeHandle node)380 void ResetTextTextCase(ArkUINodeHandle node)
381 {
382     auto* frameNode = reinterpret_cast<FrameNode*>(node);
383     CHECK_NULL_VOID(frameNode);
384     TextModelNG::SetTextCase(frameNode, DEFAULT_TEXT_CASE);
385 }
386 
SetTextMaxLines(ArkUINodeHandle node,ArkUI_Uint32 maxLine)387 void SetTextMaxLines(ArkUINodeHandle node, ArkUI_Uint32 maxLine)
388 {
389     auto* frameNode = reinterpret_cast<FrameNode*>(node);
390     CHECK_NULL_VOID(frameNode);
391     TextModelNG::SetMaxLines(frameNode, maxLine);
392 }
393 
GetTextMaxLines(ArkUINodeHandle node)394 int32_t GetTextMaxLines(ArkUINodeHandle node)
395 {
396     auto* frameNode = reinterpret_cast<FrameNode*>(node);
397     CHECK_NULL_RETURN(frameNode, DEFAULT_MAX_LINE);
398     return TextModelNG::GetMaxLines(frameNode);
399 }
400 
ResetTextMaxLines(ArkUINodeHandle node)401 void ResetTextMaxLines(ArkUINodeHandle node)
402 {
403     auto* frameNode = reinterpret_cast<FrameNode*>(node);
404     CHECK_NULL_VOID(frameNode);
405     TextModelNG::SetMaxLines(frameNode, DEFAULT_MAX_LINE);
406 }
407 
SetTextMinFontSize(ArkUINodeHandle node,ArkUI_Float32 number,const ArkUI_Int32 unit)408 void SetTextMinFontSize(ArkUINodeHandle node, ArkUI_Float32 number, const ArkUI_Int32 unit)
409 {
410     auto* frameNode = reinterpret_cast<FrameNode*>(node);
411     CHECK_NULL_VOID(frameNode);
412     TextModelNG::SetAdaptMinFontSize(frameNode, Dimension(number, static_cast<DimensionUnit>(unit)));
413 }
414 
ResetTextMinFontSize(ArkUINodeHandle node)415 void ResetTextMinFontSize(ArkUINodeHandle node)
416 {
417     auto* frameNode = reinterpret_cast<FrameNode*>(node);
418     CHECK_NULL_VOID(frameNode);
419     TextModelNG::SetAdaptMinFontSize(frameNode, DEFAULT_MIN_FONT_SIZE);
420 }
421 
SetTextDraggable(ArkUINodeHandle node,ArkUI_Uint32 draggable)422 void SetTextDraggable(ArkUINodeHandle node, ArkUI_Uint32 draggable)
423 {
424     auto* frameNode = reinterpret_cast<FrameNode*>(node);
425     CHECK_NULL_VOID(frameNode);
426     ViewAbstract::SetDraggable(frameNode, static_cast<bool>(draggable));
427 }
428 
ResetTextDraggable(ArkUINodeHandle node)429 void ResetTextDraggable(ArkUINodeHandle node)
430 {
431     auto* frameNode = reinterpret_cast<FrameNode*>(node);
432     CHECK_NULL_VOID(frameNode);
433     ViewAbstract::SetDraggable(frameNode, DEFAULT_TEXT_DRAGGABLE);
434 }
435 
SetTextPrivacySensitve(ArkUINodeHandle node,ArkUI_Uint32 sensitive)436 void SetTextPrivacySensitve(ArkUINodeHandle node, ArkUI_Uint32 sensitive)
437 {
438     auto* frameNode = reinterpret_cast<FrameNode*>(node);
439     CHECK_NULL_VOID(frameNode);
440     frameNode->SetPrivacySensitive(static_cast<bool>(sensitive));
441     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
442 }
443 
ResetTextPrivacySensitve(ArkUINodeHandle node)444 void ResetTextPrivacySensitve(ArkUINodeHandle node)
445 {
446     auto* frameNode = reinterpret_cast<FrameNode*>(node);
447     CHECK_NULL_VOID(frameNode);
448     frameNode->SetPrivacySensitive(DEFAULT_TEXT_SENSITIVE);
449     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
450 }
451 
SetTextMaxFontSize(ArkUINodeHandle node,ArkUI_Float32 number,ArkUI_Int32 unit)452 void SetTextMaxFontSize(ArkUINodeHandle node, ArkUI_Float32 number, ArkUI_Int32 unit)
453 {
454     auto* frameNode = reinterpret_cast<FrameNode*>(node);
455     CHECK_NULL_VOID(frameNode);
456     TextModelNG::SetAdaptMaxFontSize(frameNode, Dimension(number, static_cast<DimensionUnit>(unit)));
457 }
458 
ResetTextMaxFontSize(ArkUINodeHandle node)459 void ResetTextMaxFontSize(ArkUINodeHandle node)
460 {
461     auto* frameNode = reinterpret_cast<FrameNode*>(node);
462     CHECK_NULL_VOID(frameNode);
463     TextModelNG::SetAdaptMaxFontSize(frameNode, DEFAULT_MAX_FONT_SIZE);
464 }
465 
SetTextMinFontScale(ArkUINodeHandle node,ArkUI_Float32 number)466 void SetTextMinFontScale(ArkUINodeHandle node, ArkUI_Float32 number)
467 {
468     auto* frameNode = reinterpret_cast<FrameNode*>(node);
469     CHECK_NULL_VOID(frameNode);
470     TextModelNG::SetMinFontScale(frameNode, number);
471 }
472 
ResetTextMinFontScale(ArkUINodeHandle node)473 void ResetTextMinFontScale(ArkUINodeHandle node)
474 {
475     auto* frameNode = reinterpret_cast<FrameNode*>(node);
476     CHECK_NULL_VOID(frameNode);
477     TextModelNG::SetMinFontScale(frameNode, DEFAULT_MIN_FONT_SCALE);
478 }
479 
SetTextMaxFontScale(ArkUINodeHandle node,ArkUI_Float32 number)480 void SetTextMaxFontScale(ArkUINodeHandle node, ArkUI_Float32 number)
481 {
482     auto* frameNode = reinterpret_cast<FrameNode*>(node);
483     CHECK_NULL_VOID(frameNode);
484     TextModelNG::SetMaxFontScale(frameNode, number);
485 }
486 
ResetTextMaxFontScale(ArkUINodeHandle node)487 void ResetTextMaxFontScale(ArkUINodeHandle node)
488 {
489     auto* frameNode = reinterpret_cast<FrameNode*>(node);
490     CHECK_NULL_VOID(frameNode);
491     TextModelNG::SetMaxFontScale(frameNode, DEFAULT_MAX_FONT_SCALE);
492 }
493 
SetTextFontFamily(ArkUINodeHandle node,const char ** fontFamilies,ArkUI_Uint32 length)494 void SetTextFontFamily(ArkUINodeHandle node, const char** fontFamilies, ArkUI_Uint32 length)
495 {
496     CHECK_NULL_VOID(fontFamilies);
497     if (length <= 0) {
498         return;
499     }
500     auto* frameNode = reinterpret_cast<FrameNode*>(node);
501     CHECK_NULL_VOID(frameNode);
502     std::vector<std::string> families;
503     for (uint32_t i = 0; i < length; i++) {
504         const char* family = *(fontFamilies + i);
505         if (family != nullptr) {
506             families.emplace_back(std::string(family));
507         }
508     }
509     TextModelNG::SetFontFamily(frameNode, families);
510 }
511 
ResetTextFontFamily(ArkUINodeHandle node)512 void ResetTextFontFamily(ArkUINodeHandle node)
513 {
514     auto* frameNode = reinterpret_cast<FrameNode*>(node);
515     CHECK_NULL_VOID(frameNode);
516     std::vector<std::string> families;
517     families.emplace_back(DEFAULT_FAMILY);
518     TextModelNG::SetFontFamily(frameNode, families);
519 }
520 
SetTextCopyOption(ArkUINodeHandle node,ArkUI_Int32 copyOption)521 void SetTextCopyOption(ArkUINodeHandle node, ArkUI_Int32 copyOption)
522 {
523     auto* frameNode = reinterpret_cast<FrameNode*>(node);
524     CHECK_NULL_VOID(frameNode);
525     TextModelNG::SetCopyOption(frameNode, static_cast<CopyOptions>(copyOption));
526 }
527 
ResetTextCopyOption(ArkUINodeHandle node)528 void ResetTextCopyOption(ArkUINodeHandle node)
529 {
530     auto* frameNode = reinterpret_cast<FrameNode*>(node);
531     CHECK_NULL_VOID(frameNode);
532     TextModelNG::SetCopyOption(frameNode, DEFAULT_COPY_OPTION);
533 }
534 
SetTextTextShadow(ArkUINodeHandle node,struct ArkUITextShadowStruct * shadows,ArkUI_Uint32 length)535 void SetTextTextShadow(ArkUINodeHandle node, struct ArkUITextShadowStruct* shadows, ArkUI_Uint32 length)
536 {
537     CHECK_NULL_VOID(shadows);
538     auto* frameNode = reinterpret_cast<FrameNode*>(node);
539     CHECK_NULL_VOID(frameNode);
540     std::vector<Shadow> shadowList(length);
541     for (uint32_t i = 0; i < length; i++) {
542         Shadow shadow;
543         ArkUITextShadowStruct* shadowStruct = shadows + i;
544         shadow.SetBlurRadius(shadowStruct->radius);
545         shadow.SetShadowType(static_cast<ShadowType>(shadowStruct->type));
546         shadow.SetColor(Color(shadowStruct->color));
547         shadow.SetOffsetX(shadowStruct->offsetX);
548         shadow.SetOffsetY(shadowStruct->offsetY);
549         shadow.SetIsFilled(static_cast<bool>(shadowStruct->fill));
550         shadowList.at(i) = shadow;
551     }
552     TextModelNG::SetTextShadow(frameNode, shadowList);
553 }
554 
GetTextShadowCount(ArkUINodeHandle node)555 ArkUI_Uint32 GetTextShadowCount(ArkUINodeHandle node)
556 {
557     auto* frameNode = reinterpret_cast<FrameNode*>(node);
558     CHECK_NULL_RETURN(frameNode, 0);
559     return TextModelNG::GetTextShadow(frameNode).size();
560 }
561 
GetTextShadow(ArkUINodeHandle node,ArkUITextShadowStruct * shadow,uint32_t size)562 void GetTextShadow(ArkUINodeHandle node, ArkUITextShadowStruct* shadow, uint32_t size)
563 {
564     auto* frameNode = reinterpret_cast<FrameNode*>(node);
565     CHECK_NULL_VOID(frameNode);
566     std::vector<ArkUITextShadowStruct> shadowArray;
567     auto textShadowVector = TextModelNG::GetTextShadow(frameNode);
568     for (uint32_t i = 0; i < size; i++) {
569         if (i < textShadowVector.size()) {
570             *(shadow + i) = { static_cast<float>(textShadowVector[i].GetBlurRadius()),
571                 static_cast<int32_t>(textShadowVector[i].GetShadowType()), textShadowVector[i].GetColor().GetValue(),
572                 textShadowVector[i].GetOffset().GetX(), textShadowVector[i].GetOffset().GetY(),
573                 textShadowVector[i].GetIsFilled()};
574         } else {
575             *(shadow + i) = { 0.0f, static_cast<int32_t>(ShadowType::COLOR),
576                 Color::TRANSPARENT.GetValue(), 0.0f, 0.0f, 0 };
577         }
578     }
579 }
580 
ResetTextTextShadow(ArkUINodeHandle node)581 void ResetTextTextShadow(ArkUINodeHandle node)
582 {
583     auto* frameNode = reinterpret_cast<FrameNode*>(node);
584     CHECK_NULL_VOID(frameNode);
585     Shadow shadow;
586     shadow.SetOffsetX(0.0);
587     shadow.SetOffsetY(0.0);
588     TextModelNG::SetTextShadow(frameNode, std::vector<Shadow> { shadow });
589 }
590 
SetTextHeightAdaptivePolicy(ArkUINodeHandle node,ArkUI_Int32 value)591 void SetTextHeightAdaptivePolicy(ArkUINodeHandle node, ArkUI_Int32 value)
592 {
593     auto* frameNode = reinterpret_cast<FrameNode*>(node);
594     CHECK_NULL_VOID(frameNode);
595     TextModelNG::SetHeightAdaptivePolicy(frameNode, HEIGHT_ADAPTIVE_POLICY[value]);
596 }
597 
ResetTextHeightAdaptivePolicy(ArkUINodeHandle node)598 void ResetTextHeightAdaptivePolicy(ArkUINodeHandle node)
599 {
600     auto* frameNode = reinterpret_cast<FrameNode*>(node);
601     CHECK_NULL_VOID(frameNode);
602     TextModelNG::SetHeightAdaptivePolicy(frameNode, TextHeightAdaptivePolicy::MAX_LINES_FIRST);
603 }
604 
SetTextTextIndent(ArkUINodeHandle node,ArkUI_Float32 number,ArkUI_Int32 unit)605 void SetTextTextIndent(ArkUINodeHandle node, ArkUI_Float32 number, ArkUI_Int32 unit)
606 {
607     auto* frameNode = reinterpret_cast<FrameNode*>(node);
608     CHECK_NULL_VOID(frameNode);
609     TextModelNG::SetTextIndent(frameNode, Dimension(number, static_cast<DimensionUnit>(unit)));
610 }
611 
GetTextTextIndent(ArkUINodeHandle node)612 float GetTextTextIndent(ArkUINodeHandle node)
613 {
614     auto* frameNode = reinterpret_cast<FrameNode*>(node);
615     CHECK_NULL_RETURN(frameNode, 0.0f);
616     return TextModelNG::GetTextIndent(frameNode).ConvertToVp();
617 }
618 
ResetTextTextIndent(ArkUINodeHandle node)619 void ResetTextTextIndent(ArkUINodeHandle node)
620 {
621     auto* frameNode = reinterpret_cast<FrameNode*>(node);
622     CHECK_NULL_VOID(frameNode);
623     TextModelNG::SetTextIndent(frameNode, CalcDimension(0, DimensionUnit::FP));
624 }
625 
SetTextBaselineOffset(ArkUINodeHandle node,ArkUI_Float32 number,ArkUI_Int32 unit)626 void SetTextBaselineOffset(ArkUINodeHandle node, ArkUI_Float32 number, ArkUI_Int32 unit)
627 {
628     auto* frameNode = reinterpret_cast<FrameNode*>(node);
629     CHECK_NULL_VOID(frameNode);
630     TextModelNG::SetBaselineOffset(frameNode, Dimension(number, static_cast<DimensionUnit>(unit)));
631 }
632 
ResetTextBaselineOffset(ArkUINodeHandle node)633 void ResetTextBaselineOffset(ArkUINodeHandle node)
634 {
635     auto* frameNode = reinterpret_cast<FrameNode*>(node);
636     CHECK_NULL_VOID(frameNode);
637     TextModelNG::SetBaselineOffset(frameNode, DEFAULT_BASELINE_OFFSET);
638 }
639 
GetTextBaselineOffset(ArkUINodeHandle node)640 ArkUI_Float32 GetTextBaselineOffset(ArkUINodeHandle node)
641 {
642     auto* frameNode = reinterpret_cast<FrameNode*>(node);
643     CHECK_NULL_RETURN(frameNode, 0.0f);
644     return TextModelNG::GetTextBaselineOffset(frameNode).ConvertToVp();
645 }
646 
SetTextLetterSpacing(ArkUINodeHandle node,ArkUI_Float32 number,ArkUI_Int32 unit)647 void SetTextLetterSpacing(ArkUINodeHandle node, ArkUI_Float32 number, ArkUI_Int32 unit)
648 {
649     auto* frameNode = reinterpret_cast<FrameNode*>(node);
650     CHECK_NULL_VOID(frameNode);
651     TextModelNG::SetLetterSpacing(frameNode, Dimension(number, static_cast<DimensionUnit>(unit)));
652 }
653 
GetTextLetterSpacing(ArkUINodeHandle node)654 ArkUI_Float32 GetTextLetterSpacing(ArkUINodeHandle node)
655 {
656     auto* frameNode = reinterpret_cast<FrameNode*>(node);
657     CHECK_NULL_RETURN(frameNode, 0.0f);
658     return TextModelNG::GetLetterSpacing(frameNode).ConvertToVp();
659 }
660 
ResetTextLetterSpacing(ArkUINodeHandle node)661 void ResetTextLetterSpacing(ArkUINodeHandle node)
662 {
663     auto* frameNode = reinterpret_cast<FrameNode*>(node);
664     CHECK_NULL_VOID(frameNode);
665     CalcDimension letterSpacing(0.0, DimensionUnit::FP);
666     TextModelNG::SetLetterSpacing(frameNode, letterSpacing);
667 }
668 
SetTextFont(ArkUINodeHandle node,const struct ArkUIFontWithOptionsStruct * fontInfo)669 void SetTextFont(ArkUINodeHandle node, const struct ArkUIFontWithOptionsStruct* fontInfo)
670 {
671     CHECK_NULL_VOID(fontInfo);
672     auto* frameNode = reinterpret_cast<FrameNode*>(node);
673     CHECK_NULL_VOID(frameNode);
674     Font font;
675     font.fontSize = Dimension(fontInfo->fontSizeNumber, static_cast<DimensionUnit>(fontInfo->fontSizeUnit));
676     font.fontStyle = static_cast<Ace::FontStyle>(fontInfo->fontStyle);
677     font.fontWeight = static_cast<FontWeight>(fontInfo->fontWeight);
678     std::vector<std::string> families;
679     if (fontInfo->fontFamilies && fontInfo->familyLength > 0) {
680         families.resize(fontInfo->familyLength);
681         for (uint32_t i = 0; i < fontInfo->familyLength; i++) {
682             families.at(i) = std::string(*(fontInfo->fontFamilies + i));
683         }
684     }
685     font.fontFamilies = families;
686     TextModelNG::SetFont(frameNode, font);
687     TextModelNG::SetVariableFontWeight(frameNode, fontInfo->variableFontWeight);
688     TextModelNG::SetEnableVariableFontWeight(frameNode, fontInfo->enableVariableFontWeight);
689 }
690 
ResetTextFont(ArkUINodeHandle node)691 void ResetTextFont(ArkUINodeHandle node)
692 {
693     auto* frameNode = reinterpret_cast<FrameNode*>(node);
694     CHECK_NULL_VOID(frameNode);
695     Font font;
696     font.fontSize = DEFAULT_FONT_SIZE;
697     font.fontWeight = DEFAULT_FONT_WEIGHT;
698     font.fontStyle = DEFAULT_FONT_STYLE;
699     std::vector<std::string> families;
700     families.emplace_back(DEFAULT_FAMILY);
701     font.fontFamilies = families;
702     TextModelNG::SetFont(frameNode, font);
703     TextModelNG::SetVariableFontWeight(frameNode, DEFAULT_VARIABLE_FONT_WEIGHT);
704     TextModelNG::SetEnableVariableFontWeight(frameNode, false);
705 }
706 
SetWordBreak(ArkUINodeHandle node,ArkUI_Uint32 wordBreak)707 void SetWordBreak(ArkUINodeHandle node, ArkUI_Uint32 wordBreak)
708 {
709     auto* frameNode = reinterpret_cast<FrameNode*>(node);
710     CHECK_NULL_VOID(frameNode);
711     if (wordBreak < 0 || wordBreak >= WORD_BREAK_TYPES.size()) {
712         wordBreak = 2; // 2 is the default value of WordBreak::BREAK_WORD
713     }
714     TextModelNG::SetWordBreak(frameNode, WORD_BREAK_TYPES[wordBreak]);
715 }
716 
ResetWordBreak(ArkUINodeHandle node)717 void ResetWordBreak(ArkUINodeHandle node)
718 {
719     auto* frameNode = reinterpret_cast<FrameNode*>(node);
720     CHECK_NULL_VOID(frameNode);
721     TextModelNG::SetWordBreak(frameNode, WORD_BREAK_TYPES[2]); // 2 is the default value of WordBreak::BREAK_WORD
722 }
723 
SetEllipsisMode(ArkUINodeHandle node,ArkUI_Uint32 ellipsisMode)724 void SetEllipsisMode(ArkUINodeHandle node, ArkUI_Uint32 ellipsisMode)
725 {
726     auto* frameNode = reinterpret_cast<FrameNode*>(node);
727     CHECK_NULL_VOID(frameNode);
728     if (ellipsisMode < 0 || ellipsisMode >= ELLIPSIS_MODALS.size()) {
729         ellipsisMode = 2; // 2 is the default value of EllipsisMode::TAIL
730     }
731     TextModelNG::SetEllipsisMode(frameNode, ELLIPSIS_MODALS[ellipsisMode]);
732 }
733 
ResetEllipsisMode(ArkUINodeHandle node)734 void ResetEllipsisMode(ArkUINodeHandle node)
735 {
736     auto* frameNode = reinterpret_cast<FrameNode*>(node);
737     CHECK_NULL_VOID(frameNode);
738     TextModelNG::SetEllipsisMode(frameNode, ELLIPSIS_MODALS[2]); // 2 is the default value of EllipsisMode::TAIL
739 }
740 
SetTextDetectEnable(ArkUINodeHandle node,ArkUI_Uint32 value)741 void SetTextDetectEnable(ArkUINodeHandle node, ArkUI_Uint32 value)
742 {
743     auto* frameNode = reinterpret_cast<FrameNode*>(node);
744     CHECK_NULL_VOID(frameNode);
745     TextModelNG::SetTextDetectEnable(frameNode, static_cast<bool>(value));
746 }
747 
GetTextDetectEnable(ArkUINodeHandle node)748 ArkUI_Int32 GetTextDetectEnable(ArkUINodeHandle node)
749 {
750     auto* frameNode = reinterpret_cast<FrameNode*>(node);
751     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
752     return static_cast<ArkUI_Int32>(TextModelNG::GetTextDetectEnable(frameNode));
753 }
754 
ResetTextDetectEnable(ArkUINodeHandle node)755 void ResetTextDetectEnable(ArkUINodeHandle node)
756 {
757     auto* frameNode = reinterpret_cast<FrameNode*>(node);
758     CHECK_NULL_VOID(frameNode);
759     TextModelNG::SetTextDetectEnable(frameNode, DEFAULT_ENABLE_TEXT_DETECTOR);
760 }
761 
GetFontFamily(ArkUINodeHandle node)762 ArkUI_CharPtr GetFontFamily(ArkUINodeHandle node)
763 {
764     auto* frameNode = reinterpret_cast<FrameNode*>(node);
765     CHECK_NULL_RETURN(frameNode, nullptr);
766     std::vector<std::string> fontFamilies = TextModelNG::GetFontFamily(frameNode);
767     std::string families;
768     //set index start
769     uint32_t index = 0;
770     for (auto& family : fontFamilies) {
771         families += family;
772         if (index != fontFamilies.size() - 1) {
773             families += ",";
774         }
775         index++;
776     }
777     g_strValue = families;
778     return g_strValue.c_str();
779 }
780 
GetCopyOption(ArkUINodeHandle node)781 ArkUI_Int32 GetCopyOption(ArkUINodeHandle node)
782 {
783     auto* frameNode = reinterpret_cast<FrameNode*>(node);
784     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
785     return static_cast<ArkUI_Int32>(TextModelNG::GetCopyOption(frameNode));
786 }
787 
GetHeightAdaptivePolicy(ArkUINodeHandle node)788 ArkUI_Int32 GetHeightAdaptivePolicy(ArkUINodeHandle node)
789 {
790     auto* frameNode = reinterpret_cast<FrameNode*>(node);
791     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
792     return TEXT_HEIGHT_ADAPTIVE_POLICY_MAP[TextModelNG::GetHeightAdaptivePolicy(frameNode)];
793 }
794 
GetTextMinFontSize(ArkUINodeHandle node)795 ArkUI_Float32 GetTextMinFontSize(ArkUINodeHandle node)
796 {
797     auto* frameNode = reinterpret_cast<FrameNode*>(node);
798     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
799     return static_cast<ArkUI_Float32>(TextModelNG::GetAdaptMinFontSize(frameNode).Value());
800 }
801 
GetTextMaxFontSize(ArkUINodeHandle node)802 ArkUI_Float32 GetTextMaxFontSize(ArkUINodeHandle node)
803 {
804     auto* frameNode = reinterpret_cast<FrameNode*>(node);
805     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
806     return static_cast<ArkUI_Float32>(TextModelNG::GetAdaptMaxFontSize(frameNode).Value());
807 }
808 
GetFont(ArkUINodeHandle node,ArkUITextFont * font)809 void GetFont(ArkUINodeHandle node, ArkUITextFont* font)
810 {
811     auto* frameNode = reinterpret_cast<FrameNode*>(node);
812     CHECK_NULL_VOID(frameNode);
813     Font value = TextModelNG::GetFont(frameNode);
814     if (value.fontSize.has_value()) {
815         font->fontSize = value.fontSize.value().GetNativeValue(static_cast<DimensionUnit>(font->fontSizeUnit));
816     }
817     if (value.fontWeight.has_value()) {
818         font->fontWeight = static_cast<ArkUI_Int32>(value.fontWeight.value());
819     }
820     if (!value.fontFamilies.empty()) {
821         std::string families;
822         //set index start
823         std::size_t index = 0;
824         for (auto& family : value.fontFamilies) {
825             families += family;
826             if (index != value.fontFamilies.size() - 1) {
827                 families += ",";
828             }
829             index++;
830         }
831         g_strValue = families;
832         font->fontFamilies = g_strValue.c_str();
833     } else {
834         font->fontFamilies = "HarmonyOS Sans";
835     }
836     if (value.fontStyle.has_value()) {
837         font->fontStyle = static_cast<ArkUI_Int32>(value.fontStyle.value());
838     }
839 }
840 
GetFontSize(ArkUINodeHandle node,ArkUI_Int32 unit)841 ArkUI_Float32 GetFontSize(ArkUINodeHandle node, ArkUI_Int32 unit)
842 {
843     auto* frameNode = reinterpret_cast<FrameNode*>(node);
844     CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
845     return static_cast<ArkUI_Float32>(
846         TextModelNG::GetFontSize(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit)));
847 }
848 
GetFontWeight(ArkUINodeHandle node)849 ArkUI_Int32 GetFontWeight(ArkUINodeHandle node)
850 {
851     auto* frameNode = reinterpret_cast<FrameNode*>(node);
852     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
853     return static_cast<ArkUI_Int32>(TextModelNG::GetFontWeight(frameNode));
854 }
855 
GetItalicFontStyle(ArkUINodeHandle node)856 ArkUI_Int32 GetItalicFontStyle(ArkUINodeHandle node)
857 {
858     auto* frameNode = reinterpret_cast<FrameNode*>(node);
859     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
860     return static_cast<ArkUI_Int32>(TextModelNG::GetItalicFontStyle(frameNode));
861 }
862 
GetTextWordBreak(ArkUINodeHandle node)863 ArkUI_Int32 GetTextWordBreak(ArkUINodeHandle node)
864 {
865     auto* frameNode = reinterpret_cast<FrameNode*>(node);
866     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
867     return static_cast<ArkUI_Int32>(TextModelNG::GetWordBreak(frameNode));
868 }
869 
GetTextEllipsisMode(ArkUINodeHandle node)870 ArkUI_Int32 GetTextEllipsisMode(ArkUINodeHandle node)
871 {
872     auto* frameNode = reinterpret_cast<FrameNode*>(node);
873     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
874     return static_cast<ArkUI_Int32>(TextModelNG::GetEllipsisMode(frameNode));
875 }
876 
SetTextFontFeature(ArkUINodeHandle node,ArkUI_CharPtr value)877 void SetTextFontFeature(ArkUINodeHandle node, ArkUI_CharPtr value)
878 {
879     auto* frameNode = reinterpret_cast<FrameNode*>(node);
880     CHECK_NULL_VOID(frameNode);
881     std::string strValue = value;
882     TextModelNG::SetFontFeature(frameNode, ParseFontFeatureSettings(strValue));
883 }
884 
ResetTextFontFeature(ArkUINodeHandle node)885 void ResetTextFontFeature(ArkUINodeHandle node)
886 {
887     auto* frameNode = reinterpret_cast<FrameNode*>(node);
888     CHECK_NULL_VOID(frameNode);
889     std::string strValue = "";
890     TextModelNG::SetFontFeature(frameNode, ParseFontFeatureSettings(strValue));
891 }
892 
SetTextDataDetectorConfig(ArkUINodeHandle node,ArkUI_Uint32 * values,ArkUI_Int32 size)893 void SetTextDataDetectorConfig(ArkUINodeHandle node, ArkUI_Uint32* values, ArkUI_Int32 size)
894 {
895     std::string textTypes;
896     for (int i = 0; i < size; i++) {
897         auto index = values[i];
898         if (index < 0 || index >= TEXT_DETECT_TYPES.size()) {
899             continue;
900         }
901         if (i != 0) {
902             textTypes.append(",");
903         }
904         textTypes.append(TEXT_DETECT_TYPES[index]);
905     }
906     auto* frameNode = reinterpret_cast<FrameNode*>(node);
907     CHECK_NULL_VOID(frameNode);
908     TextModelNG::SetTextDetectConfig(frameNode, textTypes);
909 }
910 
GetTextDataDetectorConfig(ArkUINodeHandle node,ArkUI_Int32 (* values)[32])911 ArkUI_Int32 GetTextDataDetectorConfig(ArkUINodeHandle node, ArkUI_Int32 (*values)[32])
912 {
913     auto* frameNode = reinterpret_cast<FrameNode*>(node);
914     CHECK_NULL_RETURN(frameNode, 0);
915     auto typeString = TextModelNG::GetTextDetectConfig(frameNode);
916     std::vector<std::string> types;
917     StringUtils::StringSplitter(typeString, ',', types);
918     for (uint32_t i = 0; i < types.size(); i++) {
919         auto ret = std::find(TEXT_DETECT_TYPES.begin(), TEXT_DETECT_TYPES.end(), types[i]);
920         (*values)[i] = ret != TEXT_DETECT_TYPES.end() ? ret - TEXT_DETECT_TYPES.begin() : -1;
921     }
922     return types.size();
923 }
924 
ResetTextDataDetectorConfig(ArkUINodeHandle node)925 void ResetTextDataDetectorConfig(ArkUINodeHandle node)
926 {
927     auto* frameNode = reinterpret_cast<FrameNode*>(node);
928     CHECK_NULL_VOID(frameNode);
929     TextModelNG::SetTextDetectConfig(frameNode, "");
930 }
931 
GetTextFontFeature(ArkUINodeHandle node)932 ArkUI_CharPtr GetTextFontFeature(ArkUINodeHandle node)
933 {
934     auto* frameNode = reinterpret_cast<FrameNode*>(node);
935     CHECK_NULL_RETURN(frameNode, nullptr);
936     g_strValue = UnParseFontFeatureSetting(TextModelNG::GetFontFeature(frameNode));
937     return g_strValue.c_str();
938 }
939 
SetTextLineSpacing(ArkUINodeHandle node,ArkUI_Float32 number,ArkUI_Int32 unit)940 void SetTextLineSpacing(ArkUINodeHandle node, ArkUI_Float32 number, ArkUI_Int32 unit)
941 {
942     auto* frameNode = reinterpret_cast<FrameNode*>(node);
943     CHECK_NULL_VOID(frameNode);
944     TextModelNG::SetLineSpacing(frameNode, Dimension(number, static_cast<DimensionUnit>(unit)));
945 }
946 
GetTextLineSpacing(ArkUINodeHandle node)947 float GetTextLineSpacing(ArkUINodeHandle node)
948 {
949     auto* frameNode = reinterpret_cast<FrameNode*>(node);
950     CHECK_NULL_RETURN(frameNode, 0.0f);
951     return TextModelNG::GetLineSpacing(frameNode);
952 }
953 
ResetTextLineSpacing(ArkUINodeHandle node)954 void ResetTextLineSpacing(ArkUINodeHandle node)
955 {
956     auto* frameNode = reinterpret_cast<FrameNode*>(node);
957     CHECK_NULL_VOID(frameNode);
958     TextModelNG::SetLineSpacing(frameNode, DEFAULT_LINE_SPACING);
959 }
960 
SetTextCaretColor(ArkUINodeHandle node,ArkUI_Uint32 color)961 void SetTextCaretColor(ArkUINodeHandle node, ArkUI_Uint32 color)
962 {
963     auto *frameNode = reinterpret_cast<FrameNode *>(node);
964     CHECK_NULL_VOID(frameNode);
965     TextModelNG::SetCaretColor(frameNode, Color(color));
966 }
967 
GetTextCaretColor(ArkUINodeHandle node)968 ArkUI_Uint32 GetTextCaretColor(ArkUINodeHandle node)
969 {
970     auto *frameNode = reinterpret_cast<FrameNode *>(node);
971     CHECK_NULL_RETURN(frameNode, Color::BLACK.GetValue());
972     return TextModelNG::GetCaretColor(frameNode).GetValue();
973 }
974 
ResetTextCaretColor(ArkUINodeHandle node)975 void ResetTextCaretColor(ArkUINodeHandle node)
976 {
977     auto *frameNode = reinterpret_cast<FrameNode *>(node);
978     CHECK_NULL_VOID(frameNode);
979     auto pipeline = frameNode->GetContext();
980     CHECK_NULL_VOID(pipeline);
981     auto theme = pipeline->GetThemeManager()->GetTheme<TextTheme>();
982     CHECK_NULL_VOID(theme);
983     auto caretColor = static_cast<int32_t>(theme->GetCaretColor().GetValue());
984     TextModelNG::SetCaretColor(frameNode, Color(caretColor));
985 }
986 
SetTextSelectedBackgroundColor(ArkUINodeHandle node,ArkUI_Uint32 color)987 void SetTextSelectedBackgroundColor(ArkUINodeHandle node, ArkUI_Uint32 color)
988 {
989     auto *frameNode = reinterpret_cast<FrameNode *>(node);
990     CHECK_NULL_VOID(frameNode);
991     TextModelNG::SetSelectedBackgroundColor(frameNode, Color(color));
992 }
993 
GetTextSelectedBackgroundColor(ArkUINodeHandle node)994 ArkUI_Uint32 GetTextSelectedBackgroundColor(ArkUINodeHandle node)
995 {
996     auto *frameNode = reinterpret_cast<FrameNode *>(node);
997     CHECK_NULL_RETURN(frameNode, Color::BLACK.GetValue());
998     return TextModelNG::GetSelectedBackgroundColor(frameNode).GetValue();
999 }
1000 
ResetTextSelectedBackgroundColor(ArkUINodeHandle node)1001 void ResetTextSelectedBackgroundColor(ArkUINodeHandle node)
1002 {
1003     auto *frameNode = reinterpret_cast<FrameNode *>(node);
1004     CHECK_NULL_VOID(frameNode);
1005     TextModelNG::ResetSelectedBackgroundColor(frameNode);
1006 }
1007 
SetLineBreakStrategy(ArkUINodeHandle node,ArkUI_Uint32 lineBreakStrategy)1008 void SetLineBreakStrategy(ArkUINodeHandle node, ArkUI_Uint32 lineBreakStrategy)
1009 {
1010     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1011     CHECK_NULL_VOID(frameNode);
1012     if (lineBreakStrategy < 0 || lineBreakStrategy >= LINE_BREAK_STRATEGY_TYPES.size()) {
1013         lineBreakStrategy = 0; // 0 is the default value of LineBreakStrategy::GREEDY
1014     }
1015     TextModelNG::SetLineBreakStrategy(frameNode, LINE_BREAK_STRATEGY_TYPES[lineBreakStrategy]);
1016 }
1017 
ResetLineBreakStrategy(ArkUINodeHandle node)1018 void ResetLineBreakStrategy(ArkUINodeHandle node)
1019 {
1020     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1021     CHECK_NULL_VOID(frameNode);
1022     // 0 is the default value of LineBreakStrategy::GREEDY
1023     TextModelNG::SetLineBreakStrategy(frameNode, LINE_BREAK_STRATEGY_TYPES[0]);
1024 }
1025 
GetTextLineBreakStrategy(ArkUINodeHandle node)1026 ArkUI_Int32 GetTextLineBreakStrategy(ArkUINodeHandle node)
1027 {
1028     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1029     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
1030     return static_cast<ArkUI_Int32>(TextModelNG::GetLineBreakStrategy(frameNode));
1031 }
1032 
SetTextContentWithStyledString(ArkUINodeHandle node,ArkUI_StyledString * styledString)1033 void SetTextContentWithStyledString(ArkUINodeHandle node, ArkUI_StyledString* styledString)
1034 {
1035     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1036     CHECK_NULL_VOID(frameNode);
1037     CHECK_NULL_VOID(styledString);
1038     TextModelNG::SetTextContentWithStyledString(frameNode, styledString);
1039 }
1040 
ResetTextContentWithStyledString(ArkUINodeHandle node)1041 void ResetTextContentWithStyledString(ArkUINodeHandle node)
1042 {
1043     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1044     CHECK_NULL_VOID(frameNode);
1045     TextModelNG::SetTextContentWithStyledString(frameNode, nullptr);
1046 }
1047 
SetTextSelection(ArkUINodeHandle node,int32_t startIndex,int32_t endIndex)1048 void SetTextSelection(ArkUINodeHandle node, int32_t startIndex, int32_t endIndex)
1049 {
1050     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1051     CHECK_NULL_VOID(frameNode);
1052     TextModelNG::SetTextSelection(frameNode, startIndex, endIndex);
1053 }
1054 
ResetTextSelection(ArkUINodeHandle node)1055 void ResetTextSelection(ArkUINodeHandle node)
1056 {
1057     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1058     CHECK_NULL_VOID(frameNode);
1059     TextModelNG::SetTextSelection(frameNode, DEFAULT_SELECTION, DEFAULT_SELECTION);
1060 }
1061 
SetTextSelectableMode(ArkUINodeHandle node,ArkUI_Uint32 textSelectableMode)1062 void SetTextSelectableMode(ArkUINodeHandle node, ArkUI_Uint32 textSelectableMode)
1063 {
1064     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1065     CHECK_NULL_VOID(frameNode);
1066     if (textSelectableMode < 0 || textSelectableMode >= TEXT_SELECTABLE_MODE.size()) {
1067         textSelectableMode = 0;
1068     }
1069     TextModelNG::SetTextSelectableMode(frameNode, TEXT_SELECTABLE_MODE[textSelectableMode]);
1070 }
1071 
ResetTextSelectableMode(ArkUINodeHandle node)1072 void ResetTextSelectableMode(ArkUINodeHandle node)
1073 {
1074     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1075     CHECK_NULL_VOID(frameNode);
1076     TextModelNG::SetTextSelectableMode(frameNode, TEXT_SELECTABLE_MODE[0]);
1077 }
1078 
SetTextDataDetectorConfigWithEvent(ArkUINodeHandle node,const struct ArkUITextDetectConfigStruct * arkUITextDetectConfig)1079 void SetTextDataDetectorConfigWithEvent(
1080     ArkUINodeHandle node, const struct ArkUITextDetectConfigStruct* arkUITextDetectConfig)
1081 {
1082     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1083     CHECK_NULL_VOID(frameNode);
1084     TextDetectConfig textDetectConfig;
1085     textDetectConfig.types = arkUITextDetectConfig->types;
1086     if (arkUITextDetectConfig->onResult) {
1087         textDetectConfig.onResult =
1088             std::move(*(reinterpret_cast<std::function<void(const std::string&)>*>(arkUITextDetectConfig->onResult)));
1089     }
1090     textDetectConfig.entityColor = Color(arkUITextDetectConfig->entityColor);
1091     textDetectConfig.entityDecorationType = TextDecoration(arkUITextDetectConfig->entityDecorationType);
1092     textDetectConfig.entityDecorationColor = Color(arkUITextDetectConfig->entityDecorationColor);
1093     textDetectConfig.entityDecorationStyle = TextDecorationStyle(arkUITextDetectConfig->entityDecorationStyle);
1094     TextModelNG::SetTextDetectConfig(frameNode, textDetectConfig);
1095 }
1096 
ResetTextDataDetectorConfigWithEvent(ArkUINodeHandle node)1097 void ResetTextDataDetectorConfigWithEvent(ArkUINodeHandle node)
1098 {
1099     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1100     CHECK_NULL_VOID(frameNode);
1101     TextDetectConfig textDetectConfig;
1102     TextModelNG::SetTextDetectConfig(frameNode, textDetectConfig);
1103 }
1104 
SetTextOnCopy(ArkUINodeHandle node,void * callback)1105 void SetTextOnCopy(ArkUINodeHandle node, void* callback)
1106 {
1107     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1108     CHECK_NULL_VOID(frameNode);
1109     if (callback) {
1110         auto onCopy = reinterpret_cast<std::function<void(const std::string&)>*>(callback);
1111         TextModelNG::SetOnCopy(frameNode, std::move(*onCopy));
1112     } else {
1113         TextModelNG::SetOnCopy(frameNode, nullptr);
1114     }
1115 }
1116 
ResetTextOnCopy(ArkUINodeHandle node)1117 void ResetTextOnCopy(ArkUINodeHandle node)
1118 {
1119     auto *frameNode = reinterpret_cast<FrameNode *>(node);
1120     CHECK_NULL_VOID(frameNode);
1121     TextModelNG::SetOnCopy(frameNode, nullptr);
1122 }
1123 
SetTextOnTextSelectionChange(ArkUINodeHandle node,void * callback)1124 void SetTextOnTextSelectionChange(ArkUINodeHandle node, void* callback)
1125 {
1126     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1127     CHECK_NULL_VOID(frameNode);
1128     if (callback) {
1129         auto onChange = reinterpret_cast<std::function<void(int32_t, int32_t)>*>(callback);
1130         TextModelNG::SetOnTextSelectionChange(frameNode, std::move(*onChange));
1131     } else {
1132         TextModelNG::SetOnTextSelectionChange(frameNode, nullptr);
1133     }
1134 }
1135 
ResetTextOnTextSelectionChange(ArkUINodeHandle node)1136 void ResetTextOnTextSelectionChange(ArkUINodeHandle node)
1137 {
1138     auto *frameNode = reinterpret_cast<FrameNode *>(node);
1139     CHECK_NULL_VOID(frameNode);
1140     TextModelNG::SetOnTextSelectionChange(frameNode, nullptr);
1141 }
1142 
SetTextSelectionMenuOptions(ArkUINodeHandle node,void * onCreateMenuCallback,void * onMenuItemClickCallback)1143 void SetTextSelectionMenuOptions(ArkUINodeHandle node, void* onCreateMenuCallback, void* onMenuItemClickCallback)
1144 {
1145     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1146     CHECK_NULL_VOID(frameNode);
1147     NG::OnCreateMenuCallback* onCreateMenu = nullptr;
1148     NG::OnMenuItemClickCallback* onMenuItemClick = nullptr;
1149     if (onCreateMenuCallback) {
1150         onCreateMenu = reinterpret_cast<NG::OnCreateMenuCallback*>(onCreateMenuCallback);
1151     }
1152     if (onMenuItemClickCallback) {
1153         onMenuItemClick = reinterpret_cast<NG::OnMenuItemClickCallback*>(onMenuItemClickCallback);
1154     }
1155     if (onCreateMenu != nullptr && onMenuItemClick != nullptr) {
1156         TextModelNG::SetSelectionMenuOptions(frameNode, std::move(*onCreateMenu), std::move(*onMenuItemClick));
1157     } else if (onCreateMenu != nullptr && onMenuItemClick == nullptr) {
1158         TextModelNG::SetSelectionMenuOptions(frameNode, std::move(*onCreateMenu), nullptr);
1159     } else if (onCreateMenu == nullptr && onMenuItemClick != nullptr) {
1160         TextModelNG::SetSelectionMenuOptions(frameNode, nullptr, std::move(*onMenuItemClick));
1161     } else {
1162         TextModelNG::SetSelectionMenuOptions(frameNode, nullptr, nullptr);
1163     }
1164 }
1165 
ResetTextSelectionMenuOptions(ArkUINodeHandle node)1166 void ResetTextSelectionMenuOptions(ArkUINodeHandle node)
1167 {
1168     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1169     CHECK_NULL_VOID(frameNode);
1170     NG::OnCreateMenuCallback onCreateMenuCallback;
1171     NG::OnMenuItemClickCallback onMenuItemClick;
1172     TextModelNG::SetSelectionMenuOptions(frameNode, std::move(onCreateMenuCallback), std::move(onMenuItemClick));
1173 }
1174 
SetTextHalfLeading(ArkUINodeHandle node,ArkUI_Bool value)1175 void SetTextHalfLeading(ArkUINodeHandle node, ArkUI_Bool value)
1176 {
1177     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1178     CHECK_NULL_VOID(frameNode);
1179     TextModelNG::SetHalfLeading(frameNode, value);
1180 }
1181 
ResetTextHalfLeading(ArkUINodeHandle node)1182 void ResetTextHalfLeading(ArkUINodeHandle node)
1183 {
1184     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1185     CHECK_NULL_VOID(frameNode);
1186     TextModelNG::SetHalfLeading(frameNode, false);
1187 }
1188 
GetTextHalfLeading(ArkUINodeHandle node)1189 ArkUI_Int32 GetTextHalfLeading(ArkUINodeHandle node)
1190 {
1191     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1192     CHECK_NULL_RETURN(frameNode, false);
1193     return static_cast<ArkUI_Int32>(TextModelNG::GetHalfLeading(frameNode));
1194 }
1195 } // namespace
1196 
1197 namespace NodeModifier {
GetTextModifier()1198 const ArkUITextModifier* GetTextModifier()
1199 {
1200     static const ArkUITextModifier modifier = { SetTextContent, SetFontWeight, ResetFontWeight, SetFontStyle,
1201         ResetFontStyle, SetTextAlign, ResetTextAlign, SetFontColor, ResetFontColor, SetTextForegroundColor,
1202         ResetTextForegroundColor, SetFontSize, ResetFontSize, SetTextLineHeight, ResetTextLineHeight,
1203         SetTextTextOverflow, ResetTextTextOverflow, SetTextDecoration, ResetTextDecoration, SetTextTextCase,
1204         ResetTextTextCase, SetTextMaxLines, ResetTextMaxLines, SetTextMinFontSize, ResetTextMinFontSize,
1205         SetTextDraggable, ResetTextDraggable, SetTextPrivacySensitve, ResetTextPrivacySensitve, SetTextMaxFontSize,
1206         ResetTextMaxFontSize, SetTextFontFamily, ResetTextFontFamily, SetTextCopyOption, ResetTextCopyOption,
1207         SetTextTextShadow, ResetTextTextShadow, SetTextHeightAdaptivePolicy, ResetTextHeightAdaptivePolicy,
1208         SetTextTextIndent, ResetTextTextIndent, SetTextBaselineOffset, ResetTextBaselineOffset, SetTextLetterSpacing,
1209         ResetTextLetterSpacing, SetTextFont, ResetTextFont, SetFontWeightStr, SetFontWeightWithOption, SetWordBreak,
1210         ResetWordBreak, GetFontFamily, GetCopyOption, GetHeightAdaptivePolicy, GetTextMinFontSize, GetTextMaxFontSize,
1211         GetFont, GetFontSize, GetFontWeight, GetItalicFontStyle, SetEllipsisMode, ResetEllipsisMode,
1212         SetTextDetectEnable, ResetTextDetectEnable, GetTextContent, GetTextLineHeight, GetTextDecoration,
1213         GetTextTextCase, GetTextLetterSpacing, GetTextMaxLines, GetTextAlign, GetTextTextOverflow, GetTextTextIndent,
1214         GetFontColor, GetTextBaselineOffset, GetTextShadowCount, GetTextShadow, GetTextWordBreak, GetTextEllipsisMode,
1215         SetTextFontFeature, ResetTextFontFeature, GetTextFontFeature, GetTextDetectEnable, SetTextDataDetectorConfig,
1216         GetTextDataDetectorConfig, ResetTextDataDetectorConfig, SetTextLineSpacing, GetTextLineSpacing,
1217         ResetTextLineSpacing, SetTextCaretColor, GetTextCaretColor, ResetTextCaretColor,
1218         SetTextSelectedBackgroundColor, GetTextSelectedBackgroundColor, ResetTextSelectedBackgroundColor,
1219         SetLineBreakStrategy, ResetLineBreakStrategy, GetTextLineBreakStrategy,
1220         SetTextContentWithStyledString, ResetTextContentWithStyledString, SetTextSelection, ResetTextSelection,
1221         SetTextSelectableMode, ResetTextSelectableMode, SetTextDataDetectorConfigWithEvent,
1222         ResetTextDataDetectorConfigWithEvent, SetTextOnCopy, ResetTextOnCopy, SetTextOnTextSelectionChange,
1223         ResetTextOnTextSelectionChange, SetTextSelectionMenuOptions, ResetTextSelectionMenuOptions, SetTextMinFontScale,
1224         ResetTextMinFontScale, SetTextMaxFontScale, ResetTextMaxFontScale, SetTextHalfLeading, ResetTextHalfLeading,
1225         GetTextHalfLeading, SetOnClick, ResetOnClick, SetResponseRegion, ResetResponseRegion };
1226 
1227     return &modifier;
1228 }
1229 
GetCJUITextModifier()1230 const CJUITextModifier* GetCJUITextModifier()
1231 {
1232     static const CJUITextModifier modifier = { SetTextContent, SetFontWeight, ResetFontWeight, SetFontStyle,
1233         ResetFontStyle, SetTextAlign, ResetTextAlign, SetFontColor, ResetFontColor, SetTextForegroundColor,
1234         ResetTextForegroundColor, SetFontSize, ResetFontSize, SetTextLineHeight, ResetTextLineHeight,
1235         SetTextTextOverflow, ResetTextTextOverflow, SetTextDecoration, ResetTextDecoration, SetTextTextCase,
1236         ResetTextTextCase, SetTextMaxLines, ResetTextMaxLines, SetTextMinFontSize, ResetTextMinFontSize,
1237         SetTextDraggable, ResetTextDraggable, SetTextPrivacySensitve, ResetTextPrivacySensitve, SetTextMaxFontSize,
1238         ResetTextMaxFontSize, SetTextFontFamily, ResetTextFontFamily, SetTextCopyOption, ResetTextCopyOption,
1239         SetTextTextShadow, ResetTextTextShadow, SetTextHeightAdaptivePolicy, ResetTextHeightAdaptivePolicy,
1240         SetTextTextIndent, ResetTextTextIndent, SetTextBaselineOffset, ResetTextBaselineOffset, SetTextLetterSpacing,
1241         ResetTextLetterSpacing, SetTextFont, ResetTextFont, SetFontWeightStr, SetWordBreak, ResetWordBreak,
1242         GetFontFamily, GetCopyOption, GetHeightAdaptivePolicy, GetTextMinFontSize, GetTextMaxFontSize, GetFont,
1243         GetFontSize, GetFontWeight, GetItalicFontStyle, SetEllipsisMode, ResetEllipsisMode, SetTextDetectEnable,
1244         ResetTextDetectEnable, GetTextContent, GetTextLineHeight, GetTextDecoration, GetTextTextCase,
1245         GetTextLetterSpacing, GetTextMaxLines, GetTextAlign, GetTextTextOverflow, GetTextTextIndent, GetFontColor,
1246         GetTextBaselineOffset, GetTextShadowCount, GetTextShadow, GetTextWordBreak, GetTextEllipsisMode,
1247         SetTextFontFeature, ResetTextFontFeature, GetTextFontFeature, GetTextDetectEnable, SetTextDataDetectorConfig,
1248         GetTextDataDetectorConfig, ResetTextDataDetectorConfig, SetTextLineSpacing, GetTextLineSpacing,
1249         ResetTextLineSpacing, SetTextSelectedBackgroundColor, GetTextSelectedBackgroundColor,
1250         ResetTextSelectedBackgroundColor, SetLineBreakStrategy, ResetLineBreakStrategy, GetTextLineBreakStrategy,
1251         SetTextContentWithStyledString, ResetTextContentWithStyledString, SetTextSelection, ResetTextSelection,
1252         SetTextSelectableMode, ResetTextSelectableMode, SetTextDataDetectorConfigWithEvent,
1253         ResetTextDataDetectorConfigWithEvent, SetTextOnCopy, ResetTextOnCopy, SetTextOnTextSelectionChange,
1254         ResetTextOnTextSelectionChange };
1255 
1256     return &modifier;
1257 }
1258 
SetOnDetectResultUpdate(ArkUINodeHandle node,void * extraParam)1259 void SetOnDetectResultUpdate(ArkUINodeHandle node, void* extraParam)
1260 {
1261     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1262     CHECK_NULL_VOID(frameNode);
1263     auto onDetectResultUpdate = [node, extraParam](const std::string& str) {
1264         ArkUINodeEvent event;
1265         event.kind = TEXT_INPUT;
1266         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
1267         event.textInputEvent.subKind = ON_DETECT_RESULT_UPDATE;
1268         event.textInputEvent.nativeStringPtr = reinterpret_cast<intptr_t>(str.c_str());
1269         SendArkUIAsyncEvent(&event);
1270     };
1271     TextModelNG::SetOnDetectResultUpdate(frameNode, std::move(onDetectResultUpdate));
1272 }
1273 
ResetOnDetectResultUpdate(ArkUINodeHandle node)1274 void ResetOnDetectResultUpdate(ArkUINodeHandle node)
1275 {
1276     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1277     CHECK_NULL_VOID(frameNode);
1278     TextModelNG::SetOnDetectResultUpdate(frameNode, nullptr);
1279 }
1280 } // namespace NodeModifier
1281 } // namespace OHOS::Ace::NG
1282