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 
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_checkboxgroup_bridge.h"
17 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
18 
19 namespace OHOS::Ace::NG {
20 namespace {
21 constexpr int NUM_0 = 0;
22 constexpr int NUM_1 = 1;
23 constexpr int NUM_2 = 2;
24 constexpr int NUM_3 = 3;
25 constexpr float DEFAULT_SIZE_VALUE = -1.0f;
26 } // namespace
SetCheckboxGroupSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)27 ArkUINativeModuleValue CheckboxGroupBridge::SetCheckboxGroupSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
28 {
29     EcmaVM* vm = runtimeCallInfo->GetVM();
30     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
31     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
32     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
33     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
34     Color color;
35     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
36         GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupSelectedColor(nativeNode);
37     } else {
38         GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupSelectedColor(
39             nativeNode, color.GetValue());
40     }
41 
42     return panda::JSValueRef::Undefined(vm);
43 }
ResetCheckboxGroupSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)44 ArkUINativeModuleValue CheckboxGroupBridge::ResetCheckboxGroupSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
45 {
46     EcmaVM* vm = runtimeCallInfo->GetVM();
47     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
48     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
49     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
50 
51     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupSelectedColor(nativeNode);
52     return panda::JSValueRef::Undefined(vm);
53 }
SetCheckboxGroupUnSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)54 ArkUINativeModuleValue CheckboxGroupBridge::SetCheckboxGroupUnSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
55 {
56     EcmaVM* vm = runtimeCallInfo->GetVM();
57     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
58     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
59     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
60     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
61     Color color;
62     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
63         GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupUnSelectedColor(nativeNode);
64     } else {
65         GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupUnSelectedColor(
66             nativeNode, color.GetValue());
67     }
68     return panda::JSValueRef::Undefined(vm);
69 }
ResetCheckboxGroupUnSelectedColor(ArkUIRuntimeCallInfo * runtimeCallInfo)70 ArkUINativeModuleValue CheckboxGroupBridge::ResetCheckboxGroupUnSelectedColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
71 {
72     EcmaVM* vm = runtimeCallInfo->GetVM();
73     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
74     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
75     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
76 
77     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupUnSelectedColor(nativeNode);
78     return panda::JSValueRef::Undefined(vm);
79 }
SetCheckboxGroupSelectAll(ArkUIRuntimeCallInfo * runtimeCallInfo)80 ArkUINativeModuleValue CheckboxGroupBridge::SetCheckboxGroupSelectAll(ArkUIRuntimeCallInfo* runtimeCallInfo)
81 {
82     EcmaVM* vm = runtimeCallInfo->GetVM();
83     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
84     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
85     Local<JSValueRef> selectAllArg = runtimeCallInfo->GetCallArgRef(1);
86     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
87     if (selectAllArg->IsNull() || selectAllArg->IsUndefined()) {
88         GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupSelectAll(nativeNode);
89     } else {
90         bool selectAll = selectAllArg->ToBoolean(vm)->Value();
91         GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupSelectAll(nativeNode, selectAll);
92     }
93     return panda::JSValueRef::Undefined(vm);
94 }
ResetCheckboxGroupSelectAll(ArkUIRuntimeCallInfo * runtimeCallInfo)95 ArkUINativeModuleValue CheckboxGroupBridge::ResetCheckboxGroupSelectAll(ArkUIRuntimeCallInfo* runtimeCallInfo)
96 {
97     EcmaVM* vm = runtimeCallInfo->GetVM();
98     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
99     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
100     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
101 
102     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupSelectAll(nativeNode);
103     return panda::JSValueRef::Undefined(vm);
104 }
SetCheckboxGroupWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)105 ArkUINativeModuleValue CheckboxGroupBridge::SetCheckboxGroupWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
106 {
107     EcmaVM* vm = runtimeCallInfo->GetVM();
108     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
109     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
110     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);
111     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
112     CalcDimension width;
113     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
114         GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupWidth(nativeNode);
115         return panda::JSValueRef::Undefined(vm);
116     }
117     if (LessNotEqual(width.Value(), 0.0)) {
118         width.SetValue(0.0);
119     }
120     std::string widthCalc = width.CalcValue();
121     GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupWidth(
122         nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
123     return panda::JSValueRef::Undefined(vm);
124 }
ResetCheckboxGroupWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)125 ArkUINativeModuleValue CheckboxGroupBridge::ResetCheckboxGroupWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
126 {
127     EcmaVM* vm = runtimeCallInfo->GetVM();
128     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
129     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
130     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
131     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupWidth(nativeNode);
132     return panda::JSValueRef::Undefined(vm);
133 }
SetCheckboxGroupHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)134 ArkUINativeModuleValue CheckboxGroupBridge::SetCheckboxGroupHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
135 {
136     EcmaVM* vm = runtimeCallInfo->GetVM();
137     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
138     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
139     Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(1);
140     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
141     CalcDimension height;
142     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
143         GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupHeight(nativeNode);
144         return panda::JSValueRef::Undefined(vm);
145     }
146     if (LessNotEqual(height.Value(), 0.0)) {
147         height.SetValue(0.0);
148     }
149     std::string heightCalc = height.CalcValue();
150     GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupHeight(
151         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
152     return panda::JSValueRef::Undefined(vm);
153 }
ResetCheckboxGroupHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue CheckboxGroupBridge::ResetCheckboxGroupHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156     EcmaVM* vm = runtimeCallInfo->GetVM();
157     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
159     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
160     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupHeight(nativeNode);
161     return panda::JSValueRef::Undefined(vm);
162 }
SetCheckboxGroupMark(ArkUIRuntimeCallInfo * runtimeCallInfo)163 ArkUINativeModuleValue CheckboxGroupBridge::SetCheckboxGroupMark(ArkUIRuntimeCallInfo* runtimeCallInfo)
164 {
165     EcmaVM* vm = runtimeCallInfo->GetVM();
166     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
167     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
168     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
169     Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
170     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
171     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
172 
173     auto pipeline = PipelineBase::GetCurrentContext();
174     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
175     auto theme = pipeline->GetTheme<CheckboxTheme>();
176     CHECK_NULL_RETURN(theme, panda::NativePointerRef::New(vm, nullptr));
177 
178     Color strokeColor;
179     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, strokeColor)) {
180         strokeColor = theme->GetPointColor();
181     }
182 
183     CalcDimension size;
184     if (!(ArkTSUtils::ParseJsDimensionVp(vm, sizeArg, size, false)) || (size.Unit() == DimensionUnit::PERCENT) ||
185         (size.ConvertToVp() < 0)) {
186         size = Dimension(DEFAULT_SIZE_VALUE);
187     }
188 
189     CalcDimension strokeWidth;
190     if (!(ArkTSUtils::ParseJsDimensionVp(vm, widthArg, strokeWidth, false)) ||
191         (strokeWidth.Unit() == DimensionUnit::PERCENT) || (strokeWidth.ConvertToVp() < 0)) {
192         strokeWidth = theme->GetCheckStroke();
193     }
194 
195     GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupMark(
196         nativeNode, strokeColor.GetValue(), size.Value(), strokeWidth.Value());
197 
198     return panda::JSValueRef::Undefined(vm);
199 }
ResetCheckboxGroupMark(ArkUIRuntimeCallInfo * runtimeCallInfo)200 ArkUINativeModuleValue CheckboxGroupBridge::ResetCheckboxGroupMark(ArkUIRuntimeCallInfo* runtimeCallInfo)
201 {
202     EcmaVM* vm = runtimeCallInfo->GetVM();
203     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
204     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
205     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
206     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupMark(nativeNode);
207     return panda::JSValueRef::Undefined(vm);
208 }
209 
SetCheckboxGroupSize(ArkUIRuntimeCallInfo * runtimeCallInfo)210 ArkUINativeModuleValue CheckboxGroupBridge::SetCheckboxGroupSize(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     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);
216     Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of parameter CheckboxGroup height
217     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
218     CalcDimension width;
219     CalcDimension height;
220     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
221         GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupWidth(nativeNode);
222     } else {
223         std::string widthCalc = width.CalcValue();
224         if (LessNotEqual(width.Value(), 0.0)) {
225             width.SetValue(0.0);
226         }
227         GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupWidth(
228             nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
229     }
230     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
231         GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupHeight(nativeNode);
232     } else {
233         std::string heightCalc = height.CalcValue();
234         if (LessNotEqual(height.Value(), 0.0)) {
235             height.SetValue(0.0);
236         }
237         GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupHeight(
238             nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
239     }
240     return panda::JSValueRef::Undefined(vm);
241 }
242 
ResetCheckboxGroupSize(ArkUIRuntimeCallInfo * runtimeCallInfo)243 ArkUINativeModuleValue CheckboxGroupBridge::ResetCheckboxGroupSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
244 {
245     EcmaVM* vm = runtimeCallInfo->GetVM();
246     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
247     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
248     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
249 
250     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupWidth(nativeNode);
251     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupHeight(nativeNode);
252     return panda::JSValueRef::Undefined(vm);
253 }
254 
SetCheckboxGroupStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)255 ArkUINativeModuleValue CheckboxGroupBridge::SetCheckboxGroupStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
256 {
257     EcmaVM* vm = runtimeCallInfo->GetVM();
258     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
259     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
260     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(1);
261     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
262     if (styleArg->IsNull() || styleArg->IsUndefined()) {
263         GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupStyle(nativeNode);
264     } else {
265         int32_t style = styleArg->Int32Value(vm);
266         GetArkUINodeModifiers()->getCheckboxGroupModifier()->setCheckboxGroupStyle(nativeNode, style);
267     }
268 
269     return panda::JSValueRef::Undefined(vm);
270 }
ResetCheckboxGroupStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)271 ArkUINativeModuleValue CheckboxGroupBridge::ResetCheckboxGroupStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
272 {
273     EcmaVM* vm = runtimeCallInfo->GetVM();
274     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
275     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
276     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
277 
278     GetArkUINodeModifiers()->getCheckboxGroupModifier()->resetCheckboxGroupStyle(nativeNode);
279     return panda::JSValueRef::Undefined(vm);
280 }
281 } // namespace OHOS::Ace::NG
282