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
17 #include "core/interfaces/native/node/api.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19
20 namespace OHOS::Ace::NG {
21 constexpr float CHECK_BOX_MARK_SIZE_INVALID_VALUE = -1.0f;
22 const bool DEFAULT_SELECTED = false;
23
SetMark(ArkUIRuntimeCallInfo * runtimeCallInfo)24 ArkUINativeModuleValue CheckboxBridge::SetMark(ArkUIRuntimeCallInfo* runtimeCallInfo)
25 {
26 EcmaVM* vm = runtimeCallInfo->GetVM();
27 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
28 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
29 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // mark color
30 Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(2); // mark stroke size
31 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(3); // mark stroke width
32 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
33
34 auto theme = ArkTSUtils::GetTheme<CheckboxTheme>();
35 Color strokeColor;
36 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, strokeColor)) {
37 strokeColor = theme->GetPointColor();
38 }
39
40 CalcDimension size;
41 if (!(ArkTSUtils::ParseJsDimensionVp(vm, sizeArg, size, false)) || (size.Unit() == DimensionUnit::PERCENT) ||
42 (size.ConvertToVp() < 0)) {
43 size = Dimension(CHECK_BOX_MARK_SIZE_INVALID_VALUE);
44 }
45
46 CalcDimension strokeWidth;
47 if (!(ArkTSUtils::ParseJsDimensionVp(vm, widthArg, strokeWidth, false)) ||
48 (strokeWidth.Unit() == DimensionUnit::PERCENT) || (strokeWidth.ConvertToVp() < 0)) {
49 strokeWidth = theme->GetCheckStroke();
50 }
51
52 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetMark(
53 nativeNode, strokeColor.GetValue(), size.Value(), strokeWidth.Value());
54 return panda::JSValueRef::Undefined(vm);
55 }
56
SetSelect(ArkUIRuntimeCallInfo * runtimeCallInfo)57 ArkUINativeModuleValue CheckboxBridge::SetSelect(ArkUIRuntimeCallInfo* runtimeCallInfo)
58 {
59 EcmaVM* vm = runtimeCallInfo->GetVM();
60 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
61 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
62 Local<JSValueRef> selectedArg = runtimeCallInfo->GetCallArgRef(1);
63 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
64 bool select = DEFAULT_SELECTED;
65 if (selectedArg->IsBoolean()) {
66 select = selectedArg->ToBoolean(vm)->Value();
67 }
68 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetSelect(nativeNode, select);
69 return panda::JSValueRef::Undefined(vm);
70 }
71
SetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)72 ArkUINativeModuleValue CheckboxBridge::SetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
73 {
74 EcmaVM* vm = runtimeCallInfo->GetVM();
75 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
76 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
77 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
78 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
79
80 Color selectedColor;
81 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, selectedColor)) {
82 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetSelectedColor(nativeNode);
83 return panda::JSValueRef::Undefined(vm);
84 }
85
86 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetSelectedColor(nativeNode, selectedColor.GetValue());
87 return panda::JSValueRef::Undefined(vm);
88 }
89
SetUnSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)90 ArkUINativeModuleValue CheckboxBridge::SetUnSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
91 {
92 EcmaVM* vm = runtimeCallInfo->GetVM();
93 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
94 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
95 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
96 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
97
98 Color unSelectedColor;
99 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, unSelectedColor)) {
100 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetUnSelectedColor(nativeNode);
101 return panda::JSValueRef::Undefined(vm);
102 }
103
104 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetUnSelectedColor(nativeNode, unSelectedColor.GetValue());
105 return panda::JSValueRef::Undefined(vm);
106 }
107
SetCheckboxWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)108 ArkUINativeModuleValue CheckboxBridge::SetCheckboxWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
109 {
110 EcmaVM* vm = runtimeCallInfo->GetVM();
111 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
112 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
113 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
114 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
115
116 CalcDimension width;
117 if (!ArkTSUtils::ParseJsDimensionVp(vm, jsValue, width)) {
118 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxWidth(nativeNode);
119 return panda::JSValueRef::Undefined(vm);
120 }
121
122 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetCheckboxWidth(
123 nativeNode, width.Value(), static_cast<int>(width.Unit()));
124 return panda::JSValueRef::Undefined(vm);
125 }
126
SetCheckboxHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)127 ArkUINativeModuleValue CheckboxBridge::SetCheckboxHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
128 {
129 EcmaVM* vm = runtimeCallInfo->GetVM();
130 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
131 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
132 Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
133 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
134
135 CalcDimension height;
136 if (!ArkTSUtils::ParseJsDimensionVp(vm, jsValue, height)) {
137 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxHeight(nativeNode);
138 return panda::JSValueRef::Undefined(vm);
139 }
140 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetCheckboxHeight(
141 nativeNode, height.Value(), static_cast<int>(height.Unit()));
142 return panda::JSValueRef::Undefined(vm);
143 }
144
ResetMark(ArkUIRuntimeCallInfo * runtimeCallInfo)145 ArkUINativeModuleValue CheckboxBridge::ResetMark(ArkUIRuntimeCallInfo* runtimeCallInfo)
146 {
147 EcmaVM* vm = runtimeCallInfo->GetVM();
148 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
149 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
150 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
151 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetMark(nativeNode);
152 return panda::JSValueRef::Undefined(vm);
153 }
154
ResetSelect(ArkUIRuntimeCallInfo * runtimeCallInfo)155 ArkUINativeModuleValue CheckboxBridge::ResetSelect(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 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
161 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetSelect(nativeNode, DEFAULT_SELECTED);
162 return panda::JSValueRef::Undefined(vm);
163 }
164
ResetSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)165 ArkUINativeModuleValue CheckboxBridge::ResetSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
166 {
167 EcmaVM* vm = runtimeCallInfo->GetVM();
168 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
169 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
170 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
171 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetSelectedColor(nativeNode);
172 return panda::JSValueRef::Undefined(vm);
173 }
174
ResetUnSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)175 ArkUINativeModuleValue CheckboxBridge::ResetUnSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
176 {
177 EcmaVM* vm = runtimeCallInfo->GetVM();
178 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
179 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
180 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
181 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetUnSelectedColor(nativeNode);
182 return panda::JSValueRef::Undefined(vm);
183 }
184
ResetCheckboxWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)185 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
186 {
187 EcmaVM* vm = runtimeCallInfo->GetVM();
188 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
189 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
190 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
191 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxWidth(nativeNode);
192 return panda::JSValueRef::Undefined(vm);
193 }
194
ResetCheckboxHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)195 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
196 {
197 EcmaVM* vm = runtimeCallInfo->GetVM();
198 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
199 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
200 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
201 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxHeight(nativeNode);
202 return panda::JSValueRef::Undefined(vm);
203 }
204
SetCheckboxPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)205 ArkUINativeModuleValue CheckboxBridge::SetCheckboxPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
206 {
207 EcmaVM* vm = runtimeCallInfo->GetVM();
208 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
209 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
210 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
211 Local<JSValueRef> top = runtimeCallInfo->GetCallArgRef(1); // 1: top data
212 Local<JSValueRef> right = runtimeCallInfo->GetCallArgRef(2); // 2: right data
213 Local<JSValueRef> bottom = runtimeCallInfo->GetCallArgRef(3); // 3: bottom data
214 Local<JSValueRef> left = runtimeCallInfo->GetCallArgRef(4); // 4: left data
215 CalcDimension topDimen(0, DimensionUnit::VP);
216 CalcDimension rightDimen(0, DimensionUnit::VP);
217 CalcDimension bottomDimen(0, DimensionUnit::VP);
218 CalcDimension leftDimen(0, DimensionUnit::VP);
219 ArkTSUtils::ParseJsDimensionVp(vm, top, topDimen);
220 ArkTSUtils::ParseJsDimensionVp(vm, right, rightDimen);
221 ArkTSUtils::ParseJsDimensionVp(vm, bottom, bottomDimen);
222 ArkTSUtils::ParseJsDimensionVp(vm, left, leftDimen);
223 const uint32_t arraySize = 4; // 4 : data length
224 double values[arraySize];
225 int units[arraySize];
226 values[0] = topDimen.IsNonNegative() ? topDimen.Value() : 0;
227 units[0] = static_cast<int>(topDimen.Unit());
228 values[1] = rightDimen.IsNonNegative() ? rightDimen.Value() : 0;
229 units[1] = static_cast<int>(rightDimen.Unit());
230 values[2] = bottomDimen.IsNonNegative() ? bottomDimen.Value() : 0; // 2: bottom data
231 units[2] = static_cast<int>(bottomDimen.Unit()); // 2: bottom Unit
232 values[3] = leftDimen.IsNonNegative() ? leftDimen.Value() : 0; // 3: left data
233 units[3] = static_cast<int>(leftDimen.Unit()); // 3: left Unit
234 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetCheckboxPadding(nativeNode, values, units, arraySize);
235 return panda::JSValueRef::Undefined(vm);
236 }
237
ResetCheckboxPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)238 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
239 {
240 EcmaVM* vm = runtimeCallInfo->GetVM();
241 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
242 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
243 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
244 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxPadding(nativeNode);
245 return panda::JSValueRef::Undefined(vm);
246 }
247
SetCheckboxResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)248 ArkUINativeModuleValue CheckboxBridge::SetCheckboxResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
249 {
250 EcmaVM* vm = runtimeCallInfo->GetVM();
251 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
252 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
253 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
254 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
255 Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(2); // 2: array length
256 uint32_t length = lengthArg->Uint32Value(vm);
257 double regionArray[length];
258 int32_t regionUnits[length];
259 if (!ArkTSUtils::ParseResponseRegion(vm, secondArg, regionArray, regionUnits, length)) {
260 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxResponseRegion(nativeNode);
261 return panda::JSValueRef::Undefined(vm);
262 }
263 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetCheckboxResponseRegion(
264 nativeNode, regionArray, regionUnits, length);
265 return panda::JSValueRef::Undefined(vm);
266 }
267
ResetCheckboxResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)268 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
269 {
270 EcmaVM* vm = runtimeCallInfo->GetVM();
271 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
272 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
273 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
274 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxResponseRegion(nativeNode);
275 return panda::JSValueRef::Undefined(vm);
276 }
277
SetCheckboxSize(ArkUIRuntimeCallInfo * runtimeCallInfo)278 ArkUINativeModuleValue CheckboxBridge::SetCheckboxSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
279 {
280 EcmaVM* vm = runtimeCallInfo->GetVM();
281 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
282 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
283 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
284 Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1); // 1: width value
285 Local<JSValueRef> heightAry = runtimeCallInfo->GetCallArgRef(2); // 2: height value
286 CalcDimension width;
287 ArkTSUtils::ParseJsDimensionVp(vm, widthArg, width, false);
288 if (widthArg->IsUndefined() || width.IsNegative()) {
289 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxWidth(nativeNode);
290 } else {
291 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetCheckboxWidth(
292 nativeNode, width.Value(), static_cast<int>(width.Unit()));
293 }
294 CalcDimension height;
295 ArkTSUtils::ParseJsDimensionVp(vm, heightAry, height, false);
296 if (heightAry->IsUndefined() || height.IsNegative()) {
297 GetArkUIInternalNodeAPI()->GetCheckboxModifier().ResetCheckboxHeight(nativeNode);
298 } else {
299 GetArkUIInternalNodeAPI()->GetCheckboxModifier().SetCheckboxHeight(
300 nativeNode, height.Value(), static_cast<int>(height.Unit()));
301 }
302 return panda::JSValueRef::Undefined(vm);
303 }
304
ResetCheckboxSize(ArkUIRuntimeCallInfo * runtimeCallInfo)305 ArkUINativeModuleValue CheckboxBridge::ResetCheckboxSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
306 {
307 EcmaVM* vm = runtimeCallInfo->GetVM();
308 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
309 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
310 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
311 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
312 return panda::JSValueRef::Undefined(vm);
313 }
314 } // namespace OHOS::Ace::NG
315