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