1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_text_bridge.h"
16 
17 #include "base/utils/string_utils.h"
18 #include "base/utils/utils.h"
19 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
20 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
21 #include "bridge/declarative_frontend/style_string/js_span_string.h"
22 #include "core/components/common/properties/shadow.h"
23 #include "core/components_ng/pattern/text/text_model_ng.h"
24 #include "frameworks/base/geometry/calc_dimension.h"
25 #include "frameworks/base/geometry/dimension.h"
26 #include "frameworks/bridge/declarative_frontend/engine/js_types.h"
27 #include "frameworks/bridge/declarative_frontend/engine/jsi/jsi_value_conversions.h"
28 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
29 #include "frameworks/bridge/declarative_frontend/jsview/js_shape_abstract.h"
30 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
31 #include "frameworks/bridge/declarative_frontend/jsview/js_text.h"
32 
33 namespace OHOS::Ace::NG {
34 namespace {
35 constexpr int PARAM_ARR_LENGTH_1 = 1;
36 constexpr int PARAM_ARR_LENGTH_2 = 2;
37 constexpr int SIZE_OF_TEXT_CASES = 2;
38 constexpr int16_t DEFAULT_ALPHA = 255;
39 constexpr double DEFAULT_OPACITY = 0.2;
40 constexpr double DEFAULT_SPAN_FONT_SIZE = 16;
41 constexpr DimensionUnit DEFAULT_SPAN_FONT_UNIT = DimensionUnit::FP;
42 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
43 constexpr Ace::FontStyle DEFAULT_FONT_STYLE = Ace::FontStyle::NORMAL;
44 const Color DEFAULT_DECORATION_COLOR = Color::BLACK;
45 const std::string DEFAULT_FONT_WEIGHT = "400";
46 constexpr int DEFAULT_VARIABLE_FONT_WEIGHT = 400;
47 constexpr int NUM_0 = 0;
48 constexpr int NUM_1 = 1;
49 constexpr int NUM_2 = 2;
50 constexpr int NUM_3 = 3;
51 constexpr int NUM_4 = 4;
52 constexpr int NUM_5 = 5;
53 constexpr int NUM_6 = 6;
54 constexpr int NUM_7 = 7;
55 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::NONE, TextOverflow::CLIP, TextOverflow::ELLIPSIS,
56     TextOverflow::MARQUEE };
57 const std::vector<std::string> TEXT_DETECT_TYPES = { "phoneNum", "url", "email", "location", "datetime" };
58 } // namespace
59 
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)60 ArkUINativeModuleValue TextBridge::SetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
61 {
62     EcmaVM* vm = runtimeCallInfo->GetVM();
63     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
64     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
65     Local<JSValueRef> weightArg = runtimeCallInfo->GetCallArgRef(NUM_1);
66     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(NUM_2);
67     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
68 
69     ArkUIFontWeightWithOptionsStruct weightInfo;
70     int32_t variableFontWeight = DEFAULT_VARIABLE_FONT_WEIGHT;
71     std::string weight = DEFAULT_FONT_WEIGHT;
72     if (!weightArg->IsNull()) {
73         if (weightArg->IsNumber()) {
74             weight = std::to_string(weightArg->Int32Value(vm));
75             variableFontWeight = weightArg->Int32Value(vm);
76         } else if (weightArg->IsString(vm)) {
77             weight = weightArg->ToString(vm)->ToString(vm);
78             variableFontWeight = StringUtils::StringToInt(weight);
79         }
80     }
81     weightInfo.weight = weight.c_str();
82     weightInfo.variableFontWeight = variableFontWeight;
83 
84     if (optionsArg->IsBoolean()) {
85         weightInfo.enableVariableFontWeight = static_cast<int32_t>(optionsArg->BooleaValue(vm));
86     }
87     GetArkUINodeModifiers()->getTextModifier()->setFontWeightWithOption(nativeNode, &weightInfo);
88     return panda::JSValueRef::Undefined(vm);
89 }
90 
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)91 ArkUINativeModuleValue TextBridge::ResetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
92 {
93     EcmaVM* vm = runtimeCallInfo->GetVM();
94     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
95     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
96     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
97     GetArkUINodeModifiers()->getTextModifier()->resetFontWeight(nativeNode);
98     return panda::JSValueRef::Undefined(vm);
99 }
100 
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)101 ArkUINativeModuleValue TextBridge::SetFontStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
102 {
103     EcmaVM* vm = runtimeCallInfo->GetVM();
104     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
105     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
106     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
107     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
108     if (secondArg->IsNumber()) {
109         uint32_t fontStyle = secondArg->Uint32Value(vm);
110         if (fontStyle < static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL) ||
111             fontStyle > static_cast<uint32_t>(OHOS::Ace::FontStyle::ITALIC)) {
112             fontStyle = static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL);
113         }
114         GetArkUINodeModifiers()->getTextModifier()->setFontStyle(nativeNode, fontStyle);
115     } else {
116         GetArkUINodeModifiers()->getTextModifier()->resetFontStyle(nativeNode);
117     }
118     return panda::JSValueRef::Undefined(vm);
119 }
120 
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)121 ArkUINativeModuleValue TextBridge::ResetFontStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
122 {
123     EcmaVM* vm = runtimeCallInfo->GetVM();
124     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
125     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
126     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
127     GetArkUINodeModifiers()->getTextModifier()->resetFontStyle(nativeNode);
128     return panda::JSValueRef::Undefined(vm);
129 }
130 
SetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)131 ArkUINativeModuleValue TextBridge::SetTextAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
132 {
133     EcmaVM* vm = runtimeCallInfo->GetVM();
134     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
135     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
136     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
137     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
138     if (secondArg->IsNumber()) {
139         GetArkUINodeModifiers()->getTextModifier()->setTextAlign(nativeNode, secondArg->ToNumber(vm)->Value());
140     } else {
141         GetArkUINodeModifiers()->getTextModifier()->resetTextAlign(nativeNode);
142     }
143     return panda::JSValueRef::Undefined(vm);
144 }
145 
ResetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)146 ArkUINativeModuleValue TextBridge::ResetTextAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
147 {
148     EcmaVM* vm = runtimeCallInfo->GetVM();
149     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
150     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
151     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
152     GetArkUINodeModifiers()->getTextModifier()->resetTextAlign(nativeNode);
153     return panda::JSValueRef::Undefined(vm);
154 }
155 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)156 ArkUINativeModuleValue TextBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
157 {
158     EcmaVM* vm = runtimeCallInfo->GetVM();
159     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
160     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
161     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
162     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
163     Color color;
164     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
165         GetArkUINodeModifiers()->getTextModifier()->resetFontColor(nativeNode);
166     } else {
167         GetArkUINodeModifiers()->getTextModifier()->setFontColor(nativeNode, color.GetValue());
168     }
169     return panda::JSValueRef::Undefined(vm);
170 }
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)171 ArkUINativeModuleValue TextBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
172 {
173     EcmaVM* vm = runtimeCallInfo->GetVM();
174     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
175     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
176     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
177     GetArkUINodeModifiers()->getTextModifier()->resetFontColor(nativeNode);
178     return panda::JSValueRef::Undefined(vm);
179 }
180 
SetForegroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)181 ArkUINativeModuleValue TextBridge::SetForegroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
182 {
183     EcmaVM *vm = runtimeCallInfo->GetVM();
184     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
185     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
186     auto colorArg = runtimeCallInfo->GetCallArgRef(1);
187     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
188 
189     ForegroundColorStrategy strategy;
190     if (ArkTSUtils::ParseJsColorStrategy(vm, colorArg, strategy)) {
191         auto strategyInt = static_cast<uint32_t>(ForegroundColorStrategy::INVERT);
192         GetArkUINodeModifiers()->getTextModifier()->setTextForegroundColor(nativeNode, false, strategyInt);
193         return panda::JSValueRef::Undefined(vm);
194     }
195     Color foregroundColor;
196     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, foregroundColor)) {
197         GetArkUINodeModifiers()->getTextModifier()->resetTextForegroundColor(nativeNode);
198     } else {
199         GetArkUINodeModifiers()->getTextModifier()->setTextForegroundColor(
200             nativeNode, true, foregroundColor.GetValue());
201     }
202     return panda::JSValueRef::Undefined(vm);
203 }
204 
ResetForegroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)205 ArkUINativeModuleValue TextBridge::ResetForegroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
206 {
207     EcmaVM* vm = runtimeCallInfo->GetVM();
208     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
209     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
210     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
211     GetArkUINodeModifiers()->getTextModifier()->resetTextForegroundColor(nativeNode);
212     return panda::JSValueRef::Undefined(vm);
213 }
214 
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)215 ArkUINativeModuleValue TextBridge::SetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
216 {
217     EcmaVM* vm = runtimeCallInfo->GetVM();
218     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
219     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
220     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
221     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
222     CalcDimension fontSize;
223     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, false)) {
224         GetArkUINodeModifiers()->getTextModifier()->resetFontSize(nativeNode);
225     } else {
226         GetArkUINodeModifiers()->getTextModifier()->setFontSize(
227             nativeNode, fontSize.Value(), static_cast<int>(fontSize.Unit()));
228     }
229     return panda::JSValueRef::Undefined(vm);
230 }
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)231 ArkUINativeModuleValue TextBridge::ResetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
232 {
233     EcmaVM* vm = runtimeCallInfo->GetVM();
234     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
235     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
236     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
237     GetArkUINodeModifiers()->getTextModifier()->resetFontSize(nativeNode);
238     return panda::JSValueRef::Undefined(vm);
239 }
240 
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)241 ArkUINativeModuleValue TextBridge::SetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
242 {
243     EcmaVM* vm = runtimeCallInfo->GetVM();
244     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
245     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
246     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
247     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
248     CalcDimension lineHeight(0.0, DEFAULT_SPAN_FONT_UNIT);
249     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, lineHeight)) {
250         lineHeight.Reset();
251     }
252     if (lineHeight.IsNegative()) {
253         lineHeight.Reset();
254     }
255     GetArkUINodeModifiers()->getTextModifier()->setTextLineHeight(
256         nativeNode, lineHeight.Value(), static_cast<int8_t>(lineHeight.Unit()));
257     return panda::JSValueRef::Undefined(vm);
258 }
259 
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)260 ArkUINativeModuleValue TextBridge::ResetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
261 {
262     EcmaVM* vm = runtimeCallInfo->GetVM();
263     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
264     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
265     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
266     GetArkUINodeModifiers()->getTextModifier()->resetTextLineHeight(nativeNode);
267     return panda::JSValueRef::Undefined(vm);
268 }
269 
SetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)270 ArkUINativeModuleValue TextBridge::SetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
271 {
272     EcmaVM* vm = runtimeCallInfo->GetVM();
273     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
274     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
275     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
276     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
277     int32_t value;
278     if (secondArg->IsUndefined()) {
279         value = 0;
280     } else if (secondArg->IsNumber()) {
281         value = secondArg->Int32Value(vm);
282     } else {
283         return panda::JSValueRef::Undefined(vm);
284     }
285     if (value < 0 || value >= static_cast<int32_t>(TEXT_OVERFLOWS.size())) {
286         return panda::JSValueRef::Undefined(vm);
287     }
288     GetArkUINodeModifiers()->getTextModifier()->setTextOverflow(nativeNode, value);
289     return panda::JSValueRef::Undefined(vm);
290 }
291 
ResetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)292 ArkUINativeModuleValue TextBridge::ResetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
293 {
294     EcmaVM* vm = runtimeCallInfo->GetVM();
295     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
296     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
297     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
298     GetArkUINodeModifiers()->getTextModifier()->resetTextOverflow(nativeNode);
299     return panda::JSValueRef::Undefined(vm);
300 }
301 
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)302 ArkUINativeModuleValue TextBridge::SetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
303 {
304     EcmaVM* vm = runtimeCallInfo->GetVM();
305     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
306     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
307     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
308     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
309     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
310     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
311     int32_t textDecoration = static_cast<int32_t>(TextDecoration::NONE);
312     Color color = DEFAULT_DECORATION_COLOR;
313     int32_t style = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
314     if (secondArg->IsInt()) {
315         textDecoration = secondArg->Int32Value(vm);
316     }
317     if (!ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color)) {
318         color = DEFAULT_DECORATION_COLOR;
319     }
320     if (fourthArg->IsInt()) {
321         style = fourthArg->Int32Value(vm);
322     }
323     GetArkUINodeModifiers()->getTextModifier()->setTextDecoration(nativeNode, textDecoration, color.GetValue(), style);
324     return panda::JSValueRef::Undefined(vm);
325 }
326 
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)327 ArkUINativeModuleValue TextBridge::ResetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
328 {
329     EcmaVM* vm = runtimeCallInfo->GetVM();
330     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
331     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
332     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
333     GetArkUINodeModifiers()->getTextModifier()->resetTextDecoration(nativeNode);
334     return panda::JSValueRef::Undefined(vm);
335 }
336 
SetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)337 ArkUINativeModuleValue TextBridge::SetTextCase(ArkUIRuntimeCallInfo* runtimeCallInfo)
338 {
339     EcmaVM* vm = runtimeCallInfo->GetVM();
340     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
341     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
342     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
343     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
344     if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
345         secondArg->Int32Value(vm) <= SIZE_OF_TEXT_CASES) {
346         GetArkUINodeModifiers()->getTextModifier()->setTextCase(nativeNode, secondArg->Int32Value(vm));
347     } else {
348         GetArkUINodeModifiers()->getTextModifier()->resetTextCase(nativeNode);
349     }
350     return panda::JSValueRef::Undefined(vm);
351 }
352 
ResetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)353 ArkUINativeModuleValue TextBridge::ResetTextCase(ArkUIRuntimeCallInfo* runtimeCallInfo)
354 {
355     EcmaVM* vm = runtimeCallInfo->GetVM();
356     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
357     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
358     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
359     GetArkUINodeModifiers()->getTextModifier()->resetTextCase(nativeNode);
360     return panda::JSValueRef::Undefined(vm);
361 }
362 
SetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)363 ArkUINativeModuleValue TextBridge::SetMaxLines(ArkUIRuntimeCallInfo* runtimeCallInfo)
364 {
365     EcmaVM* vm = runtimeCallInfo->GetVM();
366     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
367     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
368     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
369     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
370     if (secondArg->IsNumber()) {
371         uint32_t maxLine = secondArg->Uint32Value(vm);
372         GetArkUINodeModifiers()->getTextModifier()->setTextMaxLines(nativeNode, maxLine);
373     } else {
374         GetArkUINodeModifiers()->getTextModifier()->resetTextMaxLines(nativeNode);
375     }
376     return panda::JSValueRef::Undefined(vm);
377 }
378 
ResetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)379 ArkUINativeModuleValue TextBridge::ResetMaxLines(ArkUIRuntimeCallInfo* runtimeCallInfo)
380 {
381     EcmaVM* vm = runtimeCallInfo->GetVM();
382     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
383     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
384     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
385     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxLines(nativeNode);
386     return panda::JSValueRef::Undefined(vm);
387 }
388 
SetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)389 ArkUINativeModuleValue TextBridge::SetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
390 {
391     EcmaVM* vm = runtimeCallInfo->GetVM();
392     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
393     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
394     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
395     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
396 
397     CalcDimension fontSize;
398     if (ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, false)) {
399         GetArkUINodeModifiers()->getTextModifier()->setTextMinFontSize(
400             nativeNode, fontSize.Value(), static_cast<int8_t>(fontSize.Unit()));
401     } else {
402         GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontSize(nativeNode);
403     }
404     return panda::JSValueRef::Undefined(vm);
405 }
406 
ReSetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)407 ArkUINativeModuleValue TextBridge::ReSetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
408 {
409     EcmaVM* vm = runtimeCallInfo->GetVM();
410     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
411     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
412     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
413     GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontSize(nativeNode);
414     return panda::JSValueRef::Undefined(vm);
415 }
416 
SetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)417 ArkUINativeModuleValue TextBridge::SetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
418 {
419     EcmaVM* vm = runtimeCallInfo->GetVM();
420     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
421     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
422     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
423     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
424     uint32_t draggable = false;
425     if (secondArg->IsBoolean()) {
426         draggable = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
427     }
428     GetArkUINodeModifiers()->getTextModifier()->setTextDraggable(nativeNode, draggable);
429     return panda::JSValueRef::Undefined(vm);
430 }
431 
ResetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)432 ArkUINativeModuleValue TextBridge::ResetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
433 {
434     EcmaVM* vm = runtimeCallInfo->GetVM();
435     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
436     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
437     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
438     GetArkUINodeModifiers()->getTextModifier()->resetTextDraggable(nativeNode);
439     return panda::JSValueRef::Undefined(vm);
440 }
441 
SetPrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)442 ArkUINativeModuleValue TextBridge::SetPrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
443 {
444     EcmaVM* vm = runtimeCallInfo->GetVM();
445     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
446     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
447     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
448     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
449     uint32_t sensitive = false;
450     if (secondArg->IsBoolean()) {
451         sensitive = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
452     }
453     GetArkUINodeModifiers()->getTextModifier()->setTextPrivacySensitive(nativeNode, sensitive);
454     return panda::JSValueRef::Undefined(vm);
455 }
456 
ResetPrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)457 ArkUINativeModuleValue TextBridge::ResetPrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
458 {
459     EcmaVM* vm = runtimeCallInfo->GetVM();
460     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
461     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
462     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
463     GetArkUINodeModifiers()->getTextModifier()->resetTextPrivacySensitive(nativeNode);
464     return panda::JSValueRef::Undefined(vm);
465 }
466 
SetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)467 ArkUINativeModuleValue TextBridge::SetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
468 {
469     EcmaVM* vm = runtimeCallInfo->GetVM();
470     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
471     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
472     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
473     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
474     CalcDimension fontSize;
475     if (ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, false)) {
476         GetArkUINodeModifiers()->getTextModifier()->setTextMaxFontSize(
477             nativeNode, fontSize.Value(), static_cast<int8_t>(fontSize.Unit()));
478     } else {
479         GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontSize(nativeNode);
480     }
481 
482     return panda::JSValueRef::Undefined(vm);
483 }
484 
ResetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)485 ArkUINativeModuleValue TextBridge::ResetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
486 {
487     EcmaVM* vm = runtimeCallInfo->GetVM();
488     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
489     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
490     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
491     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontSize(nativeNode);
492     return panda::JSValueRef::Undefined(vm);
493 }
494 
SetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)495 ArkUINativeModuleValue TextBridge::SetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
496 {
497     EcmaVM* vm = runtimeCallInfo->GetVM();
498     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
499     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
500     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
501     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
502     double minFontScale;
503     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, minFontScale)) {
504         return panda::JSValueRef::Undefined(vm);
505     }
506     if (LessOrEqual(minFontScale, 0.0f)) {
507         GetArkUINodeModifiers()->getTextModifier()->setTextMinFontScale(nativeNode, static_cast<float>(minFontScale));
508         minFontScale = 0.0f;
509     } else if (GreatOrEqual(minFontScale, 1.0f)) {
510         minFontScale = 1.0f;
511     }
512     GetArkUINodeModifiers()->getTextModifier()->setTextMinFontScale(nativeNode, static_cast<float>(minFontScale));
513     return panda::JSValueRef::Undefined(vm);
514 }
515 
ResetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)516 ArkUINativeModuleValue TextBridge::ResetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
517 {
518     EcmaVM* vm = runtimeCallInfo->GetVM();
519     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
520     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
521     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
522     GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontScale(nativeNode);
523     return panda::JSValueRef::Undefined(vm);
524 }
525 
SetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)526 ArkUINativeModuleValue TextBridge::SetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
527 {
528     EcmaVM* vm = runtimeCallInfo->GetVM();
529     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
530     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
531     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
532     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
533     double maxFontScale;
534     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, maxFontScale)) {
535         return panda::JSValueRef::Undefined(vm);
536     }
537     if (LessOrEqual(maxFontScale, 1.0f)) {
538         maxFontScale = 1.0f;
539     }
540     GetArkUINodeModifiers()->getTextModifier()->setTextMaxFontScale(nativeNode, static_cast<float>(maxFontScale));
541     return panda::JSValueRef::Undefined(vm);
542 }
543 
ResetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)544 ArkUINativeModuleValue TextBridge::ResetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
545 {
546     EcmaVM* vm = runtimeCallInfo->GetVM();
547     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
548     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
549     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
550     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontScale(nativeNode);
551     return panda::JSValueRef::Undefined(vm);
552 }
553 
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)554 ArkUINativeModuleValue TextBridge::SetFontFamily(ArkUIRuntimeCallInfo* runtimeCallInfo)
555 {
556     EcmaVM* vm = runtimeCallInfo->GetVM();
557     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
558     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
559     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
560     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
561 
562     std::vector<std::string> fontFamilies;
563     if (!ArkTSUtils::ParseJsFontFamilies(vm, secondArg, fontFamilies)) {
564         GetArkUINodeModifiers()->getTextModifier()->resetTextFontFamily(nativeNode);
565         return panda::JSValueRef::Undefined(vm);
566     }
567     auto families = std::make_unique<char* []>(fontFamilies.size());
568     for (uint32_t i = 0; i < fontFamilies.size(); i++) {
569         families[i] = const_cast<char*>(fontFamilies.at(i).c_str());
570     }
571     GetArkUINodeModifiers()->getTextModifier()->setTextFontFamily(
572         nativeNode, const_cast<const char**>(families.get()), fontFamilies.size());
573     return panda::JSValueRef::Undefined(vm);
574 }
575 
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)576 ArkUINativeModuleValue TextBridge::ResetFontFamily(ArkUIRuntimeCallInfo* runtimeCallInfo)
577 {
578     EcmaVM* vm = runtimeCallInfo->GetVM();
579     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
580     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
581     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
582 
583     GetArkUINodeModifiers()->getTextModifier()->resetTextFontFamily(nativeNode);
584     return panda::JSValueRef::Undefined(vm);
585 }
586 
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)587 ArkUINativeModuleValue TextBridge::SetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
588 {
589     EcmaVM* vm = runtimeCallInfo->GetVM();
590     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
591     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
592     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
593     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
594     int32_t copyOption = static_cast<int32_t>(CopyOptions::None);
595     if (secondArg->IsInt()) {
596         copyOption = secondArg->Int32Value(vm);
597     }
598     GetArkUINodeModifiers()->getTextModifier()->setTextCopyOption(nativeNode, copyOption);
599     return panda::JSValueRef::Undefined(vm);
600 }
601 
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)602 ArkUINativeModuleValue TextBridge::ResetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
603 {
604     EcmaVM* vm = runtimeCallInfo->GetVM();
605     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
606     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
607     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
608     GetArkUINodeModifiers()->getTextModifier()->resetTextCopyOption(nativeNode);
609     return panda::JSValueRef::Undefined(vm);
610 }
611 
SetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)612 ArkUINativeModuleValue TextBridge::SetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
613 {
614     EcmaVM* vm = runtimeCallInfo->GetVM();
615     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
616     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
617     Local<JSValueRef> radiusArg = runtimeCallInfo->GetCallArgRef(NUM_1);
618     Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
619     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
620     Local<JSValueRef> offsetXArg = runtimeCallInfo->GetCallArgRef(NUM_4);
621     Local<JSValueRef> offsetYArg = runtimeCallInfo->GetCallArgRef(NUM_5);
622     Local<JSValueRef> fillArg = runtimeCallInfo->GetCallArgRef(NUM_6);
623     Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(NUM_7);
624     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
625     uint32_t length;
626     if (!lengthArg->IsNumber() || lengthArg->Uint32Value(vm) == 0) {
627         return panda::JSValueRef::Undefined(vm);
628     }
629     length = lengthArg->Uint32Value(vm);
630     auto radiusArray = std::make_unique<double[]>(length);
631     auto typeArray = std::make_unique<uint32_t[]>(length);
632     auto colorArray = std::make_unique<uint32_t[]>(length);
633     auto offsetXArray = std::make_unique<double[]>(length);
634     auto offsetYArray = std::make_unique<double[]>(length);
635     auto fillArray = std::make_unique<uint32_t[]>(length);
636     bool radiusParseResult = ArkTSUtils::ParseArray<double>(
637         vm, radiusArg, radiusArray.get(), length, ArkTSUtils::parseShadowRadius);
638     bool typeParseResult = ArkTSUtils::ParseArray<uint32_t>(
639         vm, typeArg, typeArray.get(), length, ArkTSUtils::parseShadowType);
640     bool colorParseResult = ArkTSUtils::ParseArray<uint32_t>(
641         vm, colorArg, colorArray.get(), length, ArkTSUtils::parseShadowColor);
642     bool offsetXParseResult = ArkTSUtils::ParseArray<double>(
643         vm, offsetXArg, offsetXArray.get(), length, ArkTSUtils::parseShadowOffset);
644     bool offsetYParseResult = ArkTSUtils::ParseArray<double>(
645         vm, offsetYArg, offsetYArray.get(), length, ArkTSUtils::parseShadowOffset);
646     bool fillParseResult = ArkTSUtils::ParseArray<uint32_t>(
647         vm, fillArg, fillArray.get(), length, ArkTSUtils::parseShadowFill);
648     if (!radiusParseResult || !colorParseResult || !offsetXParseResult ||
649         !offsetYParseResult || !fillParseResult || !typeParseResult) {
650         return panda::JSValueRef::Undefined(vm);
651     }
652     auto textShadowArray = std::make_unique<ArkUITextShadowStruct[]>(length);
653     CHECK_NULL_RETURN(textShadowArray.get(), panda::JSValueRef::Undefined(vm));
654     for (uint32_t i = 0; i < length; i++) {
655         textShadowArray[i].radius = radiusArray[i];
656         textShadowArray[i].type = typeArray[i];
657         textShadowArray[i].color = colorArray[i];
658         textShadowArray[i].offsetX = offsetXArray[i];
659         textShadowArray[i].offsetY = offsetYArray[i];
660         textShadowArray[i].fill = fillArray[i];
661     }
662     GetArkUINodeModifiers()->getTextModifier()->setTextShadow(nativeNode, textShadowArray.get(), length);
663     return panda::JSValueRef::Undefined(vm);
664 }
665 
ResetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)666 ArkUINativeModuleValue TextBridge::ResetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
667 {
668     EcmaVM* vm = runtimeCallInfo->GetVM();
669     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
670     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
671     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
672     GetArkUINodeModifiers()->getTextModifier()->resetTextShadow(nativeNode);
673     return panda::JSValueRef::Undefined(vm);
674 }
675 
SetContent(ArkUIRuntimeCallInfo * runtimeCallInfo)676 ArkUINativeModuleValue TextBridge::SetContent(ArkUIRuntimeCallInfo* runtimeCallInfo)
677 {
678     EcmaVM* vm = runtimeCallInfo->GetVM();
679     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
680     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
681     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
682     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
683     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
684 
685     Framework::JSRef<Framework::JSVal> args = info[1];
686     if (args->IsObject() && Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSSpanString>()) {
687         auto* spanString = Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSSpanString>();
688         auto spanStringController = spanString->GetController();
689         if (spanStringController) {
690             TextModelNG::InitSpanStringController(reinterpret_cast<FrameNode*>(nativeNode), spanStringController);
691         }
692         return panda::JSValueRef::Undefined(vm);
693     }
694     std::string content;
695     if (ArkTSUtils::ParseJsString(vm, secondArg, content)) {
696         GetArkUINodeModifiers()->getTextModifier()->setContent(nativeNode, content.c_str());
697     }
698     return panda::JSValueRef::Undefined(vm);
699 }
700 
SetTextController(ArkUIRuntimeCallInfo * runtimeCallInfo)701 ArkUINativeModuleValue TextBridge::SetTextController(ArkUIRuntimeCallInfo* runtimeCallInfo)
702 {
703     EcmaVM* vm = runtimeCallInfo->GetVM();
704     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
705     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
706     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
707     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
708     Framework::JSRef<Framework::JSVal> args = info[1];
709     if (args->IsObject()) {
710         auto paramObject = Framework::JSRef<Framework::JSObject>::Cast(args);
711         auto controllerObj = paramObject->GetProperty("controller");
712         Framework::JSTextController* jsController = nullptr;
713         if (controllerObj->IsObject()) {
714             jsController =
715                 Framework::JSRef<Framework::JSObject>::Cast(controllerObj)->Unwrap<Framework::JSTextController>();
716         }
717         RefPtr<TextControllerBase> controller =
718             TextModelNG::InitTextController(reinterpret_cast<FrameNode*>(nativeNode));
719         if (jsController) {
720             jsController->SetController(controller);
721         }
722     }
723     return panda::JSValueRef::Undefined(vm);
724 }
725 
SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)726 ArkUINativeModuleValue TextBridge::SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
727 {
728     EcmaVM* vm = runtimeCallInfo->GetVM();
729     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
730     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
731     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
732     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
733     if (secondArg->IsNumber()
734         && secondArg->Int32Value(vm) >= static_cast<int32_t>(TextHeightAdaptivePolicy::MAX_LINES_FIRST)
735         && secondArg->Int32Value(vm) <= static_cast<int32_t>(TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST)) {
736         auto value = secondArg->Int32Value(vm);
737         GetArkUINodeModifiers()->getTextModifier()->setTextHeightAdaptivePolicy(nativeNode, value);
738     } else {
739         GetArkUINodeModifiers()->getTextModifier()->resetTextHeightAdaptivePolicy(nativeNode);
740     }
741     return panda::JSValueRef::Undefined(vm);
742 }
743 
ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)744 ArkUINativeModuleValue TextBridge::ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
745 {
746     EcmaVM* vm = runtimeCallInfo->GetVM();
747     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
748     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
749     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
750     GetArkUINodeModifiers()->getTextModifier()->resetTextHeightAdaptivePolicy(nativeNode);
751     return panda::JSValueRef::Undefined(vm);
752 }
753 
SetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)754 ArkUINativeModuleValue TextBridge::SetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
755 {
756     EcmaVM* vm = runtimeCallInfo->GetVM();
757     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
758     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
759     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
760     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
761     CalcDimension indent;
762     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, indent) || indent.IsNegative()) {
763         indent.Reset();
764     }
765 
766     GetArkUINodeModifiers()->getTextModifier()->setTextIndent(
767         nativeNode, indent.Value(), static_cast<int8_t>(indent.Unit()));
768     return panda::JSValueRef::Undefined(vm);
769 }
770 
ResetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)771 ArkUINativeModuleValue TextBridge::ResetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
772 {
773     EcmaVM* vm = runtimeCallInfo->GetVM();
774     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
775     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
776     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
777     GetArkUINodeModifiers()->getTextModifier()->resetTextIndent(nativeNode);
778     return panda::JSValueRef::Undefined(vm);
779 }
780 
SetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)781 ArkUINativeModuleValue TextBridge::SetBaselineOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
782 {
783     EcmaVM* vm = runtimeCallInfo->GetVM();
784     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
785     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
786     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
787     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
788     CalcDimension baselineOffset;
789     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, baselineOffset, DimensionUnit::FP, false)) {
790         baselineOffset.Reset();
791     }
792 
793     GetArkUINodeModifiers()->getTextModifier()->setTextBaselineOffset(
794         nativeNode, baselineOffset.Value(), static_cast<int8_t>(baselineOffset.Unit()));
795     return panda::JSValueRef::Undefined(vm);
796 }
797 
ResetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)798 ArkUINativeModuleValue TextBridge::ResetBaselineOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
799 {
800     EcmaVM* vm = runtimeCallInfo->GetVM();
801     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
802     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
803     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
804     GetArkUINodeModifiers()->getTextModifier()->resetTextBaselineOffset(nativeNode);
805     return panda::JSValueRef::Undefined(vm);
806 }
807 
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)808 ArkUINativeModuleValue TextBridge::SetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
809 {
810     EcmaVM* vm = runtimeCallInfo->GetVM();
811     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
812     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
813     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
814     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
815     CalcDimension letterSpacing;
816     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, letterSpacing, DimensionUnit::FP, false)) {
817         letterSpacing.Reset();
818     }
819 
820     GetArkUINodeModifiers()->getTextModifier()->setTextLetterSpacing(
821         nativeNode, letterSpacing.Value(), static_cast<int8_t>(letterSpacing.Unit()));
822     return panda::JSValueRef::Undefined(vm);
823 }
824 
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)825 ArkUINativeModuleValue TextBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
826 {
827     EcmaVM* vm = runtimeCallInfo->GetVM();
828     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
829     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
830     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
831     GetArkUINodeModifiers()->getTextModifier()->resetTextLetterSpacing(nativeNode);
832     return panda::JSValueRef::Undefined(vm);
833 }
834 
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)835 ArkUINativeModuleValue TextBridge::SetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
836 {
837     EcmaVM* vm = runtimeCallInfo->GetVM();
838     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
839     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
840     Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
841     Local<JSValueRef> weightArg = runtimeCallInfo->GetCallArgRef(NUM_2);
842     Local<JSValueRef> familyArg = runtimeCallInfo->GetCallArgRef(NUM_3);
843     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(NUM_4);
844     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(NUM_5);
845 
846     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
847     ArkUIFontWithOptionsStruct fontInfo;
848     CalcDimension fontSize;
849     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, sizeArg, fontSize, false) || sizeArg->IsNull()) {
850         fontSize.SetValue(DEFAULT_SPAN_FONT_SIZE);
851         fontSize.SetUnit(DEFAULT_SPAN_FONT_UNIT);
852     }
853     if (sizeArg->IsUndefined() || fontSize.IsNegative() || fontSize.Unit() == DimensionUnit::PERCENT) {
854         auto theme = ArkTSUtils::GetTheme<TextTheme>();
855         CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
856         auto size = theme->GetTextStyle().GetFontSize();
857         fontInfo.fontSizeNumber = size.Value();
858         fontInfo.fontSizeUnit = static_cast<int8_t>(size.Unit());
859     } else {
860         fontInfo.fontSizeNumber = fontSize.Value();
861         fontInfo.fontSizeUnit = static_cast<int8_t>(fontSize.Unit());
862     }
863 
864     int32_t variableFontWeight = DEFAULT_VARIABLE_FONT_WEIGHT;
865     std::string weight = DEFAULT_FONT_WEIGHT;
866     if (!weightArg->IsNull()) {
867         if (weightArg->IsNumber()) {
868             weight = std::to_string(weightArg->Int32Value(vm));
869             variableFontWeight = weightArg->Int32Value(vm);
870         } else if (weightArg->IsString(vm)) {
871             weight = weightArg->ToString(vm)->ToString(vm);
872             variableFontWeight = StringUtils::StringToInt(weight);
873         }
874     }
875     fontInfo.fontWeight = static_cast<uint8_t>(Framework::ConvertStrToFontWeight(weight));
876     fontInfo.variableFontWeight = variableFontWeight;
877 
878     if (optionsArg->IsBoolean()) {
879         fontInfo.enableVariableFontWeight = static_cast<int32_t>(optionsArg->BooleaValue(vm));
880     }
881 
882     int32_t style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
883     if (styleArg->IsInt()) {
884         style = styleArg->Int32Value(vm);
885     }
886     fontInfo.fontStyle = static_cast<uint8_t>(style);
887 
888     std::vector<std::string> fontFamilies;
889     fontInfo.fontFamilies = nullptr;
890     if (!familyArg->IsNull() && ArkTSUtils::ParseJsFontFamilies(vm, familyArg, fontFamilies)) {
891         fontInfo.familyLength = fontFamilies.size();
892         auto families = std::make_unique<const char* []>(fontInfo.familyLength);
893         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
894             families[i] = fontFamilies[i].c_str();
895         }
896         fontInfo.fontFamilies = families.get();
897         GetArkUINodeModifiers()->getTextModifier()->setTextFont(nativeNode, &fontInfo);
898     } else {
899         GetArkUINodeModifiers()->getTextModifier()->setTextFont(nativeNode, &fontInfo);
900     }
901     return panda::JSValueRef::Undefined(vm);
902 }
903 
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)904 ArkUINativeModuleValue TextBridge::ResetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
905 {
906     EcmaVM* vm = runtimeCallInfo->GetVM();
907     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
908     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
909     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
910     GetArkUINodeModifiers()->getTextModifier()->resetTextFont(nativeNode);
911     return panda::JSValueRef::Undefined(vm);
912 }
913 
SetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)914 ArkUINativeModuleValue TextBridge::SetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
915 {
916     EcmaVM* vm = runtimeCallInfo->GetVM();
917     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
918     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
919     Local<JSValueRef> workBreakArg = runtimeCallInfo->GetCallArgRef(NUM_1);
920     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
921     if (workBreakArg->IsNull() || workBreakArg->IsUndefined() || !workBreakArg->IsNumber()) {
922         GetArkUINodeModifiers()->getTextModifier()->resetWordBreak(nativeNode);
923         return panda::JSValueRef::Undefined(vm);
924     }
925     uint32_t wordBreak = workBreakArg->Uint32Value(vm);
926     GetArkUINodeModifiers()->getTextModifier()->setWordBreak(nativeNode, wordBreak);
927     return panda::JSValueRef::Undefined(vm);
928 }
929 
ResetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)930 ArkUINativeModuleValue TextBridge::ResetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
931 {
932     EcmaVM* vm = runtimeCallInfo->GetVM();
933     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
934     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
935     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
936     GetArkUINodeModifiers()->getTextModifier()->resetWordBreak(nativeNode);
937     return panda::JSValueRef::Undefined(vm);
938 }
939 
SetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)940 ArkUINativeModuleValue TextBridge::SetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
941 {
942     EcmaVM* vm = runtimeCallInfo->GetVM();
943     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
944     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
945     Local<JSValueRef> lineBreakStrategyArg = runtimeCallInfo->GetCallArgRef(NUM_1);
946     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
947     if (lineBreakStrategyArg->IsNull() || lineBreakStrategyArg->IsUndefined() || !lineBreakStrategyArg->IsNumber()) {
948         GetArkUINodeModifiers()->getTextModifier()->resetLineBreakStrategy(nativeNode);
949         return panda::JSValueRef::Undefined(vm);
950     }
951     uint32_t lineBreakStrategy = lineBreakStrategyArg->Uint32Value(vm);
952     GetArkUINodeModifiers()->getTextModifier()->setLineBreakStrategy(nativeNode, lineBreakStrategy);
953     return panda::JSValueRef::Undefined(vm);
954 }
955 
ResetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)956 ArkUINativeModuleValue TextBridge::ResetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
957 {
958     EcmaVM* vm = runtimeCallInfo->GetVM();
959     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
960     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
961     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
962     GetArkUINodeModifiers()->getTextModifier()->resetLineBreakStrategy(nativeNode);
963     return panda::JSValueRef::Undefined(vm);
964 }
965 
SetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)966 ArkUINativeModuleValue TextBridge::SetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
967 {
968     EcmaVM* vm = runtimeCallInfo->GetVM();
969     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
970     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
971     Local<JSValueRef> ellipsisModeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
972     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
973     if (ellipsisModeArg->IsNull() || ellipsisModeArg->IsUndefined() || !ellipsisModeArg->IsNumber()) {
974         GetArkUINodeModifiers()->getTextModifier()->resetEllipsisMode(nativeNode);
975         return panda::JSValueRef::Undefined(vm);
976     }
977     uint32_t ellipsisMode = ellipsisModeArg->Uint32Value(vm);
978     GetArkUINodeModifiers()->getTextModifier()->setEllipsisMode(nativeNode, ellipsisMode);
979     return panda::JSValueRef::Undefined(vm);
980 }
981 
ResetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)982 ArkUINativeModuleValue TextBridge::ResetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
983 {
984     EcmaVM* vm = runtimeCallInfo->GetVM();
985     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
986     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
987     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
988     GetArkUINodeModifiers()->getTextModifier()->resetEllipsisMode(nativeNode);
989     return panda::JSValueRef::Undefined(vm);
990 }
991 
SetEnableDataDetector(ArkUIRuntimeCallInfo * runtimeCallInfo)992 ArkUINativeModuleValue TextBridge::SetEnableDataDetector(ArkUIRuntimeCallInfo* runtimeCallInfo)
993 {
994     EcmaVM* vm = runtimeCallInfo->GetVM();
995     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
996     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
997     Local<JSValueRef> enableDataDetectorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
998     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
999     if (enableDataDetectorArg->IsNull() || enableDataDetectorArg->IsUndefined() ||
1000         !enableDataDetectorArg->IsBoolean()) {
1001         GetArkUINodeModifiers()->getTextModifier()->resetEnableDataDetector(nativeNode);
1002         return panda::JSValueRef::Undefined(vm);
1003     }
1004     uint32_t enableDataDetector = enableDataDetectorArg->Uint32Value(vm);
1005     GetArkUINodeModifiers()->getTextModifier()->setEnableDataDetector(nativeNode, enableDataDetector);
1006     return panda::JSValueRef::Undefined(vm);
1007 }
1008 
ResetEnableDataDetector(ArkUIRuntimeCallInfo * runtimeCallInfo)1009 ArkUINativeModuleValue TextBridge::ResetEnableDataDetector(ArkUIRuntimeCallInfo* runtimeCallInfo)
1010 {
1011     EcmaVM* vm = runtimeCallInfo->GetVM();
1012     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1013     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1014     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1015     GetArkUINodeModifiers()->getTextModifier()->resetEnableDataDetector(nativeNode);
1016     return panda::JSValueRef::Undefined(vm);
1017 }
1018 
SetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)1019 ArkUINativeModuleValue TextBridge::SetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
1020 {
1021     EcmaVM* vm = runtimeCallInfo->GetVM();
1022     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1023     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1024     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1025     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1026     if (secondArg->IsString(vm)) {
1027         auto value = secondArg->ToString(vm)->ToString(vm);
1028         GetArkUINodeModifiers()->getTextModifier()->setTextFontFeature(nativeNode, value.c_str());
1029     } else {
1030         GetArkUINodeModifiers()->getTextModifier()->resetTextFontFeature(nativeNode);
1031     }
1032     return panda::JSValueRef::Undefined(vm);
1033 }
1034 
ResetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)1035 ArkUINativeModuleValue TextBridge::ResetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
1036 {
1037     EcmaVM* vm = runtimeCallInfo->GetVM();
1038     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1039     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1040     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1041     GetArkUINodeModifiers()->getTextModifier()->resetTextFontFeature(nativeNode);
1042     return panda::JSValueRef::Undefined(vm);
1043 }
1044 
SetLineSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1045 ArkUINativeModuleValue TextBridge::SetLineSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1046 {
1047     EcmaVM* vm = runtimeCallInfo->GetVM();
1048     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1049     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1050     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1051     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1052     CalcDimension value;
1053     if (!ArkTSUtils::ParseJsLengthMetrics(vm, secondArg, value)) {
1054         GetArkUINodeModifiers()->getTextModifier()->resetTextLineSpacing(nativeNode);
1055     } else {
1056         if (value.IsNegative()) {
1057             value.Reset();
1058         }
1059         GetArkUINodeModifiers()->getTextModifier()->setTextLineSpacing(
1060             nativeNode, value.Value(), static_cast<int>(value.Unit()));
1061     }
1062     return panda::JSValueRef::Undefined(vm);
1063 }
1064 
ResetLineSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1065 ArkUINativeModuleValue TextBridge::ResetLineSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1066 {
1067     EcmaVM* vm = runtimeCallInfo->GetVM();
1068     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1069     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1070     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1071     GetArkUINodeModifiers()->getTextModifier()->resetTextLineSpacing(nativeNode);
1072     return panda::JSValueRef::Undefined(vm);
1073 }
1074 
SetSelection(ArkUIRuntimeCallInfo * runtimeCallInfo)1075 ArkUINativeModuleValue TextBridge::SetSelection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1076 {
1077     EcmaVM* vm = runtimeCallInfo->GetVM();
1078     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1079     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1080     Local<JSValueRef> startArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1081     Local<JSValueRef> endArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1082     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1083     if (!startArg->IsNumber() || !endArg->IsNumber()) {
1084         GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1085         return panda::JSValueRef::Undefined(vm);
1086     }
1087     int32_t startIndex = startArg->Int32Value(vm);
1088     int32_t endIndex = endArg->Int32Value(vm);
1089     if (startIndex >= endIndex) {
1090         GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1091         return panda::JSValueRef::Undefined(vm);
1092     }
1093     GetArkUINodeModifiers()->getTextModifier()->setTextSelection(nativeNode, startIndex, endIndex);
1094     return panda::JSValueRef::Undefined(vm);
1095 }
1096 
ResetSelection(ArkUIRuntimeCallInfo * runtimeCallInfo)1097 ArkUINativeModuleValue TextBridge::ResetSelection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1098 {
1099     EcmaVM* vm = runtimeCallInfo->GetVM();
1100     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1101     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1102     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1103     GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1104     return panda::JSValueRef::Undefined(vm);
1105 }
1106 
SetTextSelectableMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1107 ArkUINativeModuleValue TextBridge::SetTextSelectableMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1108 {
1109     EcmaVM* vm = runtimeCallInfo->GetVM();
1110     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1111     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1112     Local<JSValueRef> textSelectableModeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1113     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1114     if (textSelectableModeArg->IsNull() || textSelectableModeArg->IsUndefined() || !textSelectableModeArg->IsNumber()) {
1115         GetArkUINodeModifiers()->getTextModifier()->resetTextSelectableMode(nativeNode);
1116         return panda::JSValueRef::Undefined(vm);
1117     }
1118     uint32_t textSelectableMode = textSelectableModeArg->Uint32Value(vm);
1119     GetArkUINodeModifiers()->getTextModifier()->setTextSelectableMode(nativeNode, textSelectableMode);
1120     return panda::JSValueRef::Undefined(vm);
1121 }
1122 
ResetTextSelectableMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1123 ArkUINativeModuleValue TextBridge::ResetTextSelectableMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1124 {
1125     EcmaVM* vm = runtimeCallInfo->GetVM();
1126     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1127     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1128     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1129     GetArkUINodeModifiers()->getTextModifier()->resetTextSelectableMode(nativeNode);
1130     return panda::JSValueRef::Undefined(vm);
1131 }
1132 
SetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1133 ArkUINativeModuleValue TextBridge::SetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1134 {
1135     EcmaVM *vm = runtimeCallInfo->GetVM();
1136     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1137     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1138     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1139     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1140     Color color;
1141     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
1142         GetArkUINodeModifiers()->getTextModifier()->resetTextCaretColor(nativeNode);
1143     } else {
1144         GetArkUINodeModifiers()->getTextModifier()->setTextCaretColor(nativeNode, color.GetValue());
1145     }
1146     return panda::JSValueRef::Undefined(vm);
1147 }
1148 
ResetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1149 ArkUINativeModuleValue TextBridge::ResetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1150 {
1151     EcmaVM *vm = runtimeCallInfo->GetVM();
1152     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1153     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1154     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1155     GetArkUINodeModifiers()->getTextModifier()->resetTextCaretColor(nativeNode);
1156     return panda::JSValueRef::Undefined(vm);
1157 }
1158 
SetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1159 ArkUINativeModuleValue TextBridge::SetSelectedBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1160 {
1161     EcmaVM *vm = runtimeCallInfo->GetVM();
1162     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1163     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1164     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1165     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1166     Color color;
1167     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
1168         GetArkUINodeModifiers()->getTextModifier()->resetTextSelectedBackgroundColor(nativeNode);
1169     } else {
1170         if (color.GetAlpha() == DEFAULT_ALPHA) {
1171             color = color.ChangeOpacity(DEFAULT_OPACITY);
1172         }
1173         GetArkUINodeModifiers()->getTextModifier()->setTextSelectedBackgroundColor(
1174             nativeNode, color.GetValue());
1175     }
1176     return panda::JSValueRef::Undefined(vm);
1177 }
1178 
ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1179 ArkUINativeModuleValue TextBridge::ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1180 {
1181     EcmaVM *vm = runtimeCallInfo->GetVM();
1182     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1183     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1184     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1185     GetArkUINodeModifiers()->getTextModifier()->resetTextSelectedBackgroundColor(nativeNode);
1186     return panda::JSValueRef::Undefined(vm);
1187 }
1188 
SetDataDetectorConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)1189 ArkUINativeModuleValue TextBridge::SetDataDetectorConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
1190 {
1191     EcmaVM* vm = runtimeCallInfo->GetVM();
1192     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1193     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1194     Local<JSValueRef> typesArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1195     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1196     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1197     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1198     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1199     if (!typesArg->IsArray(vm)) {
1200         GetArkUINodeModifiers()->getTextModifier()->
1201             resetTextDataDetectorConfigWithEvent(nativeNode);
1202         return panda::JSValueRef::Undefined(vm);
1203     }
1204 
1205     struct ArkUITextDetectConfigStruct arkUITextDetectConfig;
1206     std::string types;
1207     auto array = panda::Local<panda::ArrayRef>(typesArg);
1208     for (size_t i = 0; i < array->Length(vm); i++) {
1209         auto value = panda::ArrayRef::GetValueAt(vm, array, i);
1210         auto index = value->Int32Value(vm);
1211         if (index < 0 || index >= static_cast<int32_t>(TEXT_DETECT_TYPES.size())) {
1212             return panda::NativePointerRef::New(vm, nullptr);
1213         }
1214         if (i != 0) {
1215             types.append(",");
1216         }
1217         types.append(TEXT_DETECT_TYPES[index]);
1218     }
1219     arkUITextDetectConfig.types = types.c_str();
1220     std::function<void(const std::string&)> callback;
1221     if (callbackArg->IsFunction(vm)) {
1222         panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1223         callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const std::string& info) {
1224             panda::LocalScope pandaScope(vm);
1225             panda::TryCatch trycatch(vm);
1226             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1227             panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1228                 panda::StringRef::NewFromUtf8(vm, info.c_str()) };
1229             func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1230         };
1231         arkUITextDetectConfig.onResult = reinterpret_cast<void*>(&callback);
1232     }
1233     ParseAIEntityColor(runtimeCallInfo, arkUITextDetectConfig);
1234     GetArkUINodeModifiers()->getTextModifier()->
1235         setTextDataDetectorConfigWithEvent(nativeNode, &arkUITextDetectConfig);
1236     return panda::JSValueRef::Undefined(vm);
1237 }
1238 
ParseAIEntityColor(ArkUIRuntimeCallInfo * runtimeCallInfo,struct ArkUITextDetectConfigStruct & arkUITextDetectConfig)1239 void TextBridge::ParseAIEntityColor(
1240     ArkUIRuntimeCallInfo* runtimeCallInfo, struct ArkUITextDetectConfigStruct& arkUITextDetectConfig)
1241 {
1242     EcmaVM* vm = runtimeCallInfo->GetVM();
1243     CHECK_NULL_VOID(vm);
1244     TextDetectConfig textDetectConfig;
1245     Local<JSValueRef> entityColorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1246     ArkTSUtils::ParseJsColorAlpha(vm, entityColorArg, textDetectConfig.entityColor);
1247     arkUITextDetectConfig.entityColor = textDetectConfig.entityColor.GetValue();
1248 
1249     Local<JSValueRef> entityDecorationTypeArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1250     Local<JSValueRef> entityDecorationColorArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1251     Local<JSValueRef> entityDecorationStyleArg = runtimeCallInfo->GetCallArgRef(NUM_6);
1252     arkUITextDetectConfig.entityDecorationType = static_cast<int32_t>(textDetectConfig.entityDecorationType);
1253     arkUITextDetectConfig.entityDecorationColor = arkUITextDetectConfig.entityColor;
1254     arkUITextDetectConfig.entityDecorationStyle = static_cast<int32_t>(textDetectConfig.entityDecorationStyle);
1255 
1256     if (entityDecorationTypeArg->IsInt()) {
1257         arkUITextDetectConfig.entityDecorationType = entityDecorationTypeArg->Int32Value(vm);
1258     }
1259     if (ArkTSUtils::ParseJsColorAlpha(vm, entityDecorationColorArg, textDetectConfig.entityDecorationColor)) {
1260         arkUITextDetectConfig.entityDecorationColor = textDetectConfig.entityDecorationColor.GetValue();
1261     }
1262     if (entityDecorationStyleArg->IsInt()) {
1263         arkUITextDetectConfig.entityDecorationStyle = entityDecorationStyleArg->Int32Value(vm);
1264     }
1265 }
1266 
ResetDataDetectorConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)1267 ArkUINativeModuleValue TextBridge::ResetDataDetectorConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
1268 {
1269     EcmaVM* vm = runtimeCallInfo->GetVM();
1270     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1271     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1272     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1273     GetArkUINodeModifiers()->getTextModifier()->
1274         resetTextDataDetectorConfigWithEvent(nativeNode);
1275     return panda::JSValueRef::Undefined(vm);
1276 }
1277 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1278 ArkUINativeModuleValue TextBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1279 {
1280     EcmaVM *vm = runtimeCallInfo->GetVM();
1281     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1282     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1283     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1284     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1285     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1286     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1287     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1288         GetArkUINodeModifiers()->getTextModifier()->resetTextOnCopy(nativeNode);
1289         return panda::JSValueRef::Undefined(vm);
1290     }
1291     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1292     std::function<void(const std::string&)> callback = [vm, frameNode,
1293         func = panda::CopyableGlobal(vm, func)](const std::string& copyStr) {
1294         panda::LocalScope pandaScope(vm);
1295         panda::TryCatch trycatch(vm);
1296         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1297         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1298             panda::StringRef::NewFromUtf8(vm, copyStr.c_str()) };
1299         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1300     };
1301     GetArkUINodeModifiers()->getTextModifier()->setTextOnCopy(nativeNode, reinterpret_cast<void*>(&callback));
1302     return panda::JSValueRef::Undefined(vm);
1303 }
1304 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1305 ArkUINativeModuleValue TextBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1306 {
1307     EcmaVM* vm = runtimeCallInfo->GetVM();
1308     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1309     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1310     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1311     GetArkUINodeModifiers()->getTextModifier()->resetTextOnCopy(nativeNode);
1312     return panda::JSValueRef::Undefined(vm);
1313 }
1314 
SetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1315 ArkUINativeModuleValue TextBridge::SetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1316 {
1317     EcmaVM *vm = runtimeCallInfo->GetVM();
1318     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1319     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1320     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1321     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1322     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1323     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1324     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1325         GetArkUINodeModifiers()->getTextModifier()->resetTextOnTextSelectionChange(nativeNode);
1326         return panda::JSValueRef::Undefined(vm);
1327     }
1328     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1329     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1330         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int32_t selectionEnd) {
1331         panda::LocalScope pandaScope(vm);
1332         panda::TryCatch trycatch(vm);
1333         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1334         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1335         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1336         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1337         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1338     };
1339     GetArkUINodeModifiers()->getTextModifier()->setTextOnTextSelectionChange(
1340         nativeNode, reinterpret_cast<void*>(&callback));
1341     return panda::JSValueRef::Undefined(vm);
1342 }
1343 
ResetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1344 ArkUINativeModuleValue TextBridge::ResetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1345 {
1346     EcmaVM* vm = runtimeCallInfo->GetVM();
1347     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1348     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1349     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1350     GetArkUINodeModifiers()->getTextModifier()->resetTextOnTextSelectionChange(nativeNode);
1351     return panda::JSValueRef::Undefined(vm);
1352 }
1353 
SetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1354 ArkUINativeModuleValue TextBridge::SetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1355 {
1356     EcmaVM* vm = runtimeCallInfo->GetVM();
1357     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1358     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1359     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1360     NG::OnCreateMenuCallback onCreateMenuCallback;
1361     NG::OnMenuItemClickCallback onMenuItemClickCallback;
1362     if (!ArkTSUtils::ParseSelectionMenuOptions(runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback)) {
1363         GetArkUINodeModifiers()->getTextModifier()->resetTextSelectionMenuOptions(nativeNode);
1364         return panda::JSValueRef::Undefined(vm);
1365     }
1366     GetArkUINodeModifiers()->getTextModifier()->setTextSelectionMenuOptions(
1367         nativeNode, reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback));
1368     return panda::JSValueRef::Undefined(vm);
1369 }
1370 
ResetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1371 ArkUINativeModuleValue TextBridge::ResetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1372 {
1373     EcmaVM* vm = runtimeCallInfo->GetVM();
1374     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1375     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1376     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1377     GetArkUINodeModifiers()->getTextModifier()->resetTextSelectionMenuOptions(nativeNode);
1378     return panda::JSValueRef::Undefined(vm);
1379 }
1380 
SetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1381 ArkUINativeModuleValue TextBridge::SetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1382 {
1383     EcmaVM* vm = runtimeCallInfo->GetVM();
1384     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1385     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1386     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1387     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1388     bool halfLeading = false;
1389     if (secondArg->IsBoolean()) {
1390         halfLeading = secondArg->ToBoolean(vm)->Value();
1391     }
1392     GetArkUINodeModifiers()->getTextModifier()->setTextHalfLeading(nativeNode, halfLeading);
1393     return panda::JSValueRef::Undefined(vm);
1394 }
1395 
ResetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1396 ArkUINativeModuleValue TextBridge::ResetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1397 {
1398     EcmaVM* vm = runtimeCallInfo->GetVM();
1399     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1400     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1401     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1402     GetArkUINodeModifiers()->getTextModifier()->resetTextHalfLeading(nativeNode);
1403     return panda::JSValueRef::Undefined(vm);
1404 }
1405 
SetOnClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1406 ArkUINativeModuleValue TextBridge::SetOnClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1407 {
1408     EcmaVM *vm = runtimeCallInfo->GetVM();
1409     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1410     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1411     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1412     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1413     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1414     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1415     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1416         GetArkUINodeModifiers()->getTextModifier()->resetTextOnClick(nativeNode);
1417         return panda::JSValueRef::Undefined(vm);
1418     }
1419     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1420     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1421         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int32_t selectionEnd) {
1422         panda::LocalScope pandaScope(vm);
1423         panda::TryCatch trycatch(vm);
1424         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1425         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1426         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1427         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1428         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1429     };
1430     GetArkUINodeModifiers()->getTextModifier()->setTextOnClick(
1431         nativeNode, reinterpret_cast<void*>(&callback));
1432     return panda::JSValueRef::Undefined(vm);
1433 }
1434 
ResetOnClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1435 ArkUINativeModuleValue TextBridge::ResetOnClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1436 {
1437     EcmaVM* vm = runtimeCallInfo->GetVM();
1438     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1439     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1440     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1441     GetArkUINodeModifiers()->getTextModifier()->resetTextOnClick(nativeNode);
1442     return panda::JSValueRef::Undefined(vm);
1443 }
1444 
SetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)1445 ArkUINativeModuleValue TextBridge::SetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
1446 {
1447     EcmaVM* vm = runtimeCallInfo->GetVM();
1448     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1449     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1450     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1451     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1452     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1453     int32_t length = thirdArg->Int32Value(vm);
1454     ArkUI_Float32 regionArray[length];
1455     int32_t regionUnits[length];
1456     if (!ArkTSUtils::ParseResponseRegion(vm, secondArg, regionArray, regionUnits, length)) {
1457         GetArkUINodeModifiers()->getTextModifier()->resetTextResponseRegion(nativeNode);
1458         return panda::JSValueRef::Undefined(vm);
1459     }
1460     GetArkUINodeModifiers()->getTextModifier()->setTextResponseRegion(nativeNode, regionArray, regionUnits, length);
1461     return panda::JSValueRef::Undefined(vm);
1462 }
1463 
ResetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)1464 ArkUINativeModuleValue TextBridge::ResetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
1465 {
1466     EcmaVM* vm = runtimeCallInfo->GetVM();
1467     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1468     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1469     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1470     GetArkUINodeModifiers()->getTextModifier()->resetTextResponseRegion(nativeNode);
1471     return panda::JSValueRef::Undefined(vm);
1472 }
1473 } // namespace OHOS::Ace::NG
1474