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_checkbox_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
17 #include "core/components_ng/base/frame_node.h"
18 #include "core/components_ng/pattern/checkbox/checkbox_model_ng.h"
19
20 namespace OHOS::Ace::NG {
21 constexpr int PARAM_ARR_LENGTH_1 = 1;
22 constexpr float CHECK_BOX_MARK_SIZE_INVALID_VALUE = -1.0f;
23 constexpr int32_t INFO_COUNT = 3;
24 const bool DEFAULT_SELECTED = false;
25 const char* CHECKBOX_NODEPTR_OF_UINODE = "nodePtr_";
26 constexpr int NUM_0 = 0;
27 constexpr int NUM_1 = 1;
28 constexpr int NUM_2 = 2;
JsCheckboxChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)29 panda::Local<panda::JSValueRef> JsCheckboxChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
30 {
31 auto vm = runtimeCallInfo->GetVM();
32 int32_t argc = static_cast<int32_t>(runtimeCallInfo->GetArgsNumber());
33 if (argc != 1) {
34 return panda::JSValueRef::Undefined(vm);
35 }
36 auto firstArg = runtimeCallInfo->GetCallArgRef(0);
37 if (!firstArg->IsBoolean()) {
38 return panda::JSValueRef::Undefined(vm);
39 }
40 bool value = firstArg->ToBoolean(vm)->Value();
41 auto ref = runtimeCallInfo->GetThisRef();
42 auto obj = ref->ToObject(vm);
43 if (obj->GetNativePointerFieldCount(vm) < 1) {
44 return panda::JSValueRef::Undefined(vm);
45 }
46 auto frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
47 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
48 CheckBoxModelNG::SetChangeValue(frameNode, value);
49 return panda::JSValueRef::Undefined(vm);
50 }
51
SetMark(ArkUIRuntimeCallInfo * runtimeCallInfo)52 ArkUINativeModuleValue CheckboxBridge::SetMark(ArkUIRuntimeCallInfo* runtimeCallInfo)
53 {
54 EcmaVM* vm = runtimeCallInfo->GetVM();
55 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
56 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
57 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // mark color
58 Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(2); // mark stroke size
59 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(3); // mark stroke width
60 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
61
62 auto theme = ArkTSUtils::GetTheme<CheckboxTheme>();
63 Color strokeColor;
64 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, strokeColor)) {
65 strokeColor = theme->GetPointColor();
66 }
67
68 CalcDimension size;
69 if (!(ArkTSUtils::ParseJsDimensionVp(vm, sizeArg, size, false)) || (size.Unit() == DimensionUnit::PERCENT) ||
70 (size.ConvertToVp() < 0)) {
71 size = Dimension(CHECK_BOX_MARK_SIZE_INVALID_VALUE);
72 }
73
74 CalcDimension strokeWidth;
75 if (!(ArkTSUtils::ParseJsDimensionVp(vm, widthArg, strokeWidth, false)) ||
76 (strokeWidth.Unit() == DimensionUnit::PERCENT) || (strokeWidth.ConvertToVp() < 0)) {
77 strokeWidth = theme->GetCheckStroke();
78 }
79
80 GetArkUINodeModifiers()->getCheckboxModifier()->setMark(nativeNode, strokeColor.GetValue(), size.Value(),
81 static_cast<int>(size.Unit()), strokeWidth.Value(), static_cast<int>(strokeWidth.Unit()));
82 return panda::JSValueRef::Undefined(vm);
83 }
84
SetSelect(ArkUIRuntimeCallInfo * runtimeCallInfo)85 ArkUINativeModuleValue CheckboxBridge::SetSelect(ArkUIRuntimeCallInfo* runtimeCallInfo)
86 {
87 EcmaVM* vm = runtimeCallInfo->GetVM();
88 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
89 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
90 Local<JSValueRef> selectedArg = runtimeCallInfo->GetCallArgRef(1);
91 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
92 bool select = DEFAULT_SELECTED;
93 if (selectedArg->IsBoolean()) {
94 select = selectedArg->ToBoolean(vm)->Value();
95 }
96 GetArkUINodeModifiers()->getCheckboxModifier()->setSelect(nativeNode, select);
97 return panda::JSValueRef::Undefined(vm);
98 }
99
SetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)100 ArkUINativeModuleValue CheckboxBridge::SetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
101 {
102 EcmaVM* vm = runtimeCallInfo->GetVM();
103 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
104 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
105 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
106 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
107
108 Color selectedColor;
109 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, selectedColor)) {
110 GetArkUINodeModifiers()->getCheckboxModifier()->resetSelectedColor(nativeNode);
111 return panda::JSValueRef::Undefined(vm);
112 }
113
114 GetArkUINodeModifiers()->getCheckboxModifier()->setSelectedColor(nativeNode, selectedColor.GetValue());
115 return panda::JSValueRef::Undefined(vm);
116 }
117
SetUnSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)118 ArkUINativeModuleValue CheckboxBridge::SetUnSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
119 {
120 EcmaVM* vm = runtimeCallInfo->GetVM();
121 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
122 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
123 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
124 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
125
126 Color unSelectedColor;
127 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, unSelectedColor)) {
128 GetArkUINodeModifiers()->getCheckboxModifier()->resetUnSelectedColor(nativeNode);
129 return panda::JSValueRef::Undefined(vm);
130 }
131
132 GetArkUINodeModifiers()->getCheckboxModifier()->setUnSelectedColor(nativeNode, unSelectedColor.GetValue());
133 return panda::JSValueRef::Undefined(vm);
134 }
135
SetCheckboxWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)136 ArkUINativeModuleValue CheckboxBridge::SetCheckboxWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
137 {
138 EcmaVM* vm = runtimeCallInfo->GetVM();
139 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
140 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
141 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
142 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
143
144 CalcDimension width;
145 if (!ArkTSUtils::ParseJsDimensionVp(vm, jsValue, width)) {
146 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxWidth(nativeNode);
147 return panda::JSValueRef::Undefined(vm);
148 }
149
150 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxWidth(
151 nativeNode, width.Value(), static_cast<int>(width.Unit()));
152 return panda::JSValueRef::Undefined(vm);
153 }
154
SetCheckboxHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)155 ArkUINativeModuleValue CheckboxBridge::SetCheckboxHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
156 {
157 EcmaVM* vm = runtimeCallInfo->GetVM();
158 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
159 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
160 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
161 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
162
163 CalcDimension height;
164 if (!ArkTSUtils::ParseJsDimensionVp(vm, jsValue, height)) {
165 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxHeight(nativeNode);
166 return panda::JSValueRef::Undefined(vm);
167 }
168 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxHeight(
169 nativeNode, height.Value(), static_cast<int>(height.Unit()));
170 return panda::JSValueRef::Undefined(vm);
171 }
172
ResetMark(ArkUIRuntimeCallInfo * runtimeCallInfo)173 ArkUINativeModuleValue CheckboxBridge::ResetMark(ArkUIRuntimeCallInfo* runtimeCallInfo)
174 {
175 EcmaVM* vm = runtimeCallInfo->GetVM();
176 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
177 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
178 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
179 GetArkUINodeModifiers()->getCheckboxModifier()->resetMark(nativeNode);
180 return panda::JSValueRef::Undefined(vm);
181 }
182
ResetSelect(ArkUIRuntimeCallInfo * runtimeCallInfo)183 ArkUINativeModuleValue CheckboxBridge::ResetSelect(ArkUIRuntimeCallInfo* runtimeCallInfo)
184 {
185 EcmaVM* vm = runtimeCallInfo->GetVM();
186 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
187 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
188 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
189 GetArkUINodeModifiers()->getCheckboxModifier()->setSelect(nativeNode, DEFAULT_SELECTED);
190 return panda::JSValueRef::Undefined(vm);
191 }
192
ResetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)193 ArkUINativeModuleValue CheckboxBridge::ResetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
194 {
195 EcmaVM* vm = runtimeCallInfo->GetVM();
196 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
197 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
198 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
199 GetArkUINodeModifiers()->getCheckboxModifier()->resetSelectedColor(nativeNode);
200 return panda::JSValueRef::Undefined(vm);
201 }
202
ResetUnSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)203 ArkUINativeModuleValue CheckboxBridge::ResetUnSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
204 {
205 EcmaVM* vm = runtimeCallInfo->GetVM();
206 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
207 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
208 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
209 GetArkUINodeModifiers()->getCheckboxModifier()->resetUnSelectedColor(nativeNode);
210 return panda::JSValueRef::Undefined(vm);
211 }
212
ResetCheckboxWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)213 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
214 {
215 EcmaVM* vm = runtimeCallInfo->GetVM();
216 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
217 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
218 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
219 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxWidth(nativeNode);
220 return panda::JSValueRef::Undefined(vm);
221 }
222
ResetCheckboxHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)223 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
224 {
225 EcmaVM* vm = runtimeCallInfo->GetVM();
226 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
227 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
228 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
229 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxHeight(nativeNode);
230 return panda::JSValueRef::Undefined(vm);
231 }
232
SetCheckboxPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)233 ArkUINativeModuleValue CheckboxBridge::SetCheckboxPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
234 {
235 EcmaVM* vm = runtimeCallInfo->GetVM();
236 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
237 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
238 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
239 Local<JSValueRef> top = runtimeCallInfo->GetCallArgRef(1); // 1: top data
240 Local<JSValueRef> right = runtimeCallInfo->GetCallArgRef(2); // 2: right data
241 Local<JSValueRef> bottom = runtimeCallInfo->GetCallArgRef(3); // 3: bottom data
242 Local<JSValueRef> left = runtimeCallInfo->GetCallArgRef(4); // 4: left data
243 CalcDimension topDim(0, DimensionUnit::VP);
244 CalcDimension rightDim(0, DimensionUnit::VP);
245 CalcDimension bottomDim(0, DimensionUnit::VP);
246 CalcDimension leftDim(0, DimensionUnit::VP);
247 ArkTSUtils::ParseJsDimensionVp(vm, top, topDim);
248 ArkTSUtils::ParseJsDimensionVp(vm, right, rightDim);
249 ArkTSUtils::ParseJsDimensionVp(vm, bottom, bottomDim);
250 ArkTSUtils::ParseJsDimensionVp(vm, left, leftDim);
251 const uint32_t arraySize = 4; // 4 : data length
252 ArkUI_Float32 values[arraySize];
253 int units[arraySize];
254 values[0] = topDim.IsNonNegative() ? topDim.Value() : 0;
255 units[0] = static_cast<int>(topDim.Unit());
256 values[1] = rightDim.IsNonNegative() ? rightDim.Value() : 0;
257 units[1] = static_cast<int>(rightDim.Unit());
258 values[2] = bottomDim.IsNonNegative() ? bottomDim.Value() : 0; // 2: bottom data
259 units[2] = static_cast<int>(bottomDim.Unit()); // 2: bottom Unit
260 values[3] = leftDim.IsNonNegative() ? leftDim.Value() : 0; // 3: left data
261 units[3] = static_cast<int>(leftDim.Unit()); // 3: left Unit
262 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxPadding(nativeNode, values, units, arraySize);
263 return panda::JSValueRef::Undefined(vm);
264 }
265
ResetCheckboxPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)266 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
267 {
268 EcmaVM* vm = runtimeCallInfo->GetVM();
269 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
270 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
271 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
272 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxPadding(nativeNode);
273 return panda::JSValueRef::Undefined(vm);
274 }
275
SetCheckboxResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)276 ArkUINativeModuleValue CheckboxBridge::SetCheckboxResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
277 {
278 EcmaVM* vm = runtimeCallInfo->GetVM();
279 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
280 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
281 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
282 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
283 Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(2); // 2: array length
284 uint32_t length = lengthArg->Uint32Value(vm);
285 ArkUI_Float32 regionArray[length];
286 int32_t regionUnits[length];
287 if (!ArkTSUtils::ParseResponseRegion(vm, secondArg, regionArray, regionUnits, length)) {
288 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxResponseRegion(nativeNode);
289 return panda::JSValueRef::Undefined(vm);
290 }
291 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxResponseRegion(
292 nativeNode, regionArray, regionUnits, length);
293 return panda::JSValueRef::Undefined(vm);
294 }
295
ResetCheckboxResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)296 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
297 {
298 EcmaVM* vm = runtimeCallInfo->GetVM();
299 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
300 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
301 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
302 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxResponseRegion(nativeNode);
303 return panda::JSValueRef::Undefined(vm);
304 }
305
SetCheckboxSize(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue CheckboxBridge::SetCheckboxSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
307 {
308 EcmaVM* vm = runtimeCallInfo->GetVM();
309 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
310 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
311 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
312 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1); // 1: width value
313 Local<JSValueRef> heightAry = runtimeCallInfo->GetCallArgRef(2); // 2: height value
314 CalcDimension width;
315 ArkTSUtils::ParseJsDimensionVp(vm, widthArg, width, false);
316 if (widthArg->IsUndefined() || width.IsNegative()) {
317 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxWidth(nativeNode);
318 } else {
319 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxWidth(
320 nativeNode, width.Value(), static_cast<int>(width.Unit()));
321 }
322 CalcDimension height;
323 ArkTSUtils::ParseJsDimensionVp(vm, heightAry, height, false);
324 if (heightAry->IsUndefined() || height.IsNegative()) {
325 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxHeight(nativeNode);
326 } else {
327 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxHeight(
328 nativeNode, height.Value(), static_cast<int>(height.Unit()));
329 }
330 return panda::JSValueRef::Undefined(vm);
331 }
332
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)333 ArkUINativeModuleValue CheckboxBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
334 {
335 EcmaVM* vm = runtimeCallInfo->GetVM();
336 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
337 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
338 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
339 auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
340 if (!secondArg->IsObject(vm)) {
341 CheckBoxModelNG::SetBuilderFunc(frameNode, nullptr);
342 return panda::JSValueRef::Undefined(vm);
343 }
344 panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
345 CheckBoxModelNG::SetBuilderFunc(frameNode,
346 [vm, frameNode, obj = std::move(obj), containerId = Container::CurrentId()](
347 CheckBoxConfiguration config) -> RefPtr<FrameNode> {
348 ContainerScope scope(containerId);
349 auto context = ArkTSUtils::GetContext(vm);
350 CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
351 const char* keysOfCheckbox[] = { "name", "selected", "enabled", "triggerChange"};
352 Local<JSValueRef> valuesOfCheckbox[] = { panda::StringRef::NewFromUtf8(vm, config.name_.c_str()),
353 panda::BooleanRef::New(vm, config.selected_), panda::BooleanRef::New(vm, config.enabled_),
354 panda::FunctionRef::New(vm, JsCheckboxChangeCallback)};
355 auto checkbox = panda::ObjectRef::NewWithNamedProperties(vm,
356 ArraySize(keysOfCheckbox), keysOfCheckbox, valuesOfCheckbox);
357 checkbox->SetNativePointerFieldCount(vm, 1);
358 checkbox->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
359 panda::Local<panda::JSValueRef> params[2] = { context, checkbox };
360 LocalScope pandaScope(vm);
361 panda::TryCatch trycatch(vm);
362 auto jsObject = obj.ToLocal();
363 auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
364 CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
365 panda::Local<panda::FunctionRef> func = makeFunc;
366 auto result = func->Call(vm, jsObject, params, 2);
367 JSNApi::ExecutePendingJob(vm);
368 CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
369 auto resultObj = result->ToObject(vm);
370 panda::Local<panda::JSValueRef> nodeptr =
371 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, CHECKBOX_NODEPTR_OF_UINODE));
372 CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
373 auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
374 CHECK_NULL_RETURN(frameNode, nullptr);
375 return AceType::Claim(frameNode);
376 });
377 return panda::JSValueRef::Undefined(vm);
378 }
379
ResetCheckboxSize(ArkUIRuntimeCallInfo * runtimeCallInfo)380 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
381 {
382 EcmaVM* vm = runtimeCallInfo->GetVM();
383 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
384 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
385 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
386 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
387 return panda::JSValueRef::Undefined(vm);
388 }
389
SetCheckboxShape(ArkUIRuntimeCallInfo * runtimeCallInfo)390 ArkUINativeModuleValue CheckboxBridge::SetCheckboxShape(ArkUIRuntimeCallInfo* runtimeCallInfo)
391 {
392 EcmaVM* vm = runtimeCallInfo->GetVM();
393 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
394 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
395 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(1);
396 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
397 if (styleArg->IsNull() || styleArg->IsUndefined()) {
398 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxShape(nativeNode);
399 } else {
400 int32_t style = styleArg->Int32Value(vm);
401 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxShape(nativeNode, style);
402 }
403
404 return panda::JSValueRef::Undefined(vm);
405 }
406
ResetCheckboxShape(ArkUIRuntimeCallInfo * runtimeCallInfo)407 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxShape(ArkUIRuntimeCallInfo* runtimeCallInfo)
408 {
409 EcmaVM* vm = runtimeCallInfo->GetVM();
410 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
411 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
412 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
413
414 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxShape(nativeNode);
415 return panda::JSValueRef::Undefined(vm);
416 }
417
SetCheckboxOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)418 ArkUINativeModuleValue CheckboxBridge::SetCheckboxOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
419 {
420 EcmaVM *vm = runtimeCallInfo->GetVM();
421 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
422 CHECK_EQUAL_RETURN(runtimeCallInfo->GetArgsNumber() != INFO_COUNT, true, panda::JSValueRef::Undefined(vm));
423 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
424 Local<JSValueRef> nameArg = runtimeCallInfo->GetCallArgRef(1);
425 Local<JSValueRef> groupArg = runtimeCallInfo->GetCallArgRef(2);
426 auto pointer = firstArg->ToNativePointer(vm);
427 CHECK_EQUAL_RETURN(pointer.IsEmpty(), true, panda::JSValueRef::Undefined(vm));
428 auto nativeNode = nodePtr(pointer->Value());
429 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
430 std::string nameStr;
431 std::string groupStr;
432 if (!nameArg.IsNull() && nameArg->IsString(vm)) {
433 nameStr = nameArg->ToString(vm)->ToString(vm);
434 }
435 if (!groupArg->IsNull() && groupArg->IsString(vm)) {
436 groupStr = groupArg->ToString(vm)->ToString(vm);
437 }
438 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxName(nativeNode, nameStr.c_str());
439 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxGroup(nativeNode, groupStr.c_str());
440 return panda::JSValueRef::Undefined(vm);
441 }
ResetCheckboxOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)442 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
443 {
444 EcmaVM* vm = runtimeCallInfo->GetVM();
445 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
446 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
447 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
448
449 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxOnChange(nativeNode);
450 return panda::JSValueRef::Undefined(vm);
451 }
SetCheckboxOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)452 ArkUINativeModuleValue CheckboxBridge::SetCheckboxOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
453 {
454 EcmaVM* vm = runtimeCallInfo->GetVM();
455 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
456 int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
457 if (argsNumber != NUM_2) {
458 return panda::JSValueRef::Undefined(vm);
459 }
460 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
461 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
462 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
463 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
464 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
465 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
466 GetArkUINodeModifiers()->getCheckboxModifier()->resetCheckboxOnChange(nativeNode);
467 return panda::JSValueRef::Undefined(vm);
468 }
469 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
470 std::function<void(bool)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](bool isOnchange) {
471 panda::LocalScope pandaScope(vm);
472 panda::TryCatch trycatch(vm);
473 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
474 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { panda::BooleanRef::New(vm, isOnchange) };
475 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
476 };
477 GetArkUINodeModifiers()->getCheckboxModifier()->setCheckboxOnChange(nativeNode, reinterpret_cast<void*>(&callback));
478 return panda::JSValueRef::Undefined(vm);
479 }
480 } // namespace OHOS::Ace::NG
481