• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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