• 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 
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