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