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