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