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