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_grid_row_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
17 #include "core/components/common/layout/constants.h"
18 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 
20 namespace OHOS::Ace::NG {
21 constexpr int32_t MAX_NUMBER_BREAKPOINT = 6;
22 constexpr int XS = 0;
23 constexpr int SM = 1;
24 constexpr int MD = 2;
25 constexpr int LG = 3;
26 constexpr int XL = 4;
27 constexpr int XXL = 5;
28 constexpr int32_t MAX_NUMBER_GUTTER = 12;
29 constexpr int X_XS = 0;
30 constexpr int X_SM = 1;
31 constexpr int X_MD = 2;
32 constexpr int X_LG = 3;
33 constexpr int X_XL = 4;
34 constexpr int X_XXL = 5;
35 constexpr int Y_XS = 6;
36 constexpr int Y_SM = 7;
37 constexpr int Y_MD = 8;
38 constexpr int Y_LG = 9;
39 constexpr int Y_XL = 10;
40 constexpr int Y_XXL = 11;
41 
SetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)42 ArkUINativeModuleValue GridRowBridge::SetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
43 {
44     EcmaVM* vm = runtimeCallInfo->GetVM();
45     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
46     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
47     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
48     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
49     if (secondArg->IsNumber()) {
50         int32_t alignItem = secondArg->Int32Value(vm);
51         if (alignItem == static_cast<int32_t>(OHOS::Ace::FlexAlign::FLEX_START) ||
52             alignItem == static_cast<int32_t>(OHOS::Ace::FlexAlign::FLEX_END) ||
53             alignItem == static_cast<int32_t>(OHOS::Ace::FlexAlign::CENTER) ||
54             alignItem == static_cast<int32_t>(OHOS::Ace::FlexAlign::STRETCH)) {
55             GetArkUINodeModifiers()->getGridRowModifier()->setAlignItems(nativeNode, alignItem);
56         } else if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
57             GetArkUINodeModifiers()->getGridRowModifier()->setAlignItems(nativeNode,
58                 static_cast<int32_t>(OHOS::Ace::FlexAlign::FLEX_START));
59         }
60     } else {
61         GetArkUINodeModifiers()->getGridRowModifier()->resetAlignItems(nativeNode);
62     }
63     return panda::JSValueRef::Undefined(vm);
64 }
65 
ResetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)66 ArkUINativeModuleValue GridRowBridge::ResetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
67 {
68     EcmaVM* vm = runtimeCallInfo->GetVM();
69     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
70     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
71     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
72     GetArkUINodeModifiers()->getGridRowModifier()->resetAlignItems(nativeNode);
73     return panda::JSValueRef::Undefined(vm);
74 }
75 
SetDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)76 ArkUINativeModuleValue GridRowBridge::SetDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
77 {
78     EcmaVM* vm = runtimeCallInfo->GetVM();
79     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
80     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
81     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
82     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
83     if (secondArg->IsNumber()) {
84         GetArkUINodeModifiers()->getGridRowModifier()->setDirection(nativeNode, secondArg->Int32Value(vm));
85     } else {
86         GetArkUINodeModifiers()->getGridRowModifier()->resetDirection(nativeNode);
87     }
88     return panda::JSValueRef::Undefined(vm);
89 }
ResetDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)90 ArkUINativeModuleValue GridRowBridge::ResetDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
91 {
92     EcmaVM* vm = runtimeCallInfo->GetVM();
93     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
94     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
95     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
96     GetArkUINodeModifiers()->getGridRowModifier()->resetDirection(nativeNode);
97     return panda::JSValueRef::Undefined(vm);
98 }
99 
SetBreakpoints(ArkUIRuntimeCallInfo * runtimeCallInfo)100 ArkUINativeModuleValue GridRowBridge::SetBreakpoints(ArkUIRuntimeCallInfo* runtimeCallInfo)
101 {
102     EcmaVM* vm = runtimeCallInfo->GetVM();
103     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
104     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
105     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
106     Local<JSValueRef> threeArg = runtimeCallInfo->GetCallArgRef(2);
107     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
108 
109     int32_t reference = 0;
110     if (threeArg->IsNumber()) {
111         reference = threeArg->Int32Value(vm);
112     }
113 
114     std::vector<ArkUI_Float32> pointValues;
115     std::vector<const char*> pointStr;
116     int32_t size = 0;
117     if (!secondArg->IsArray(vm)) {
118         GetArkUINodeModifiers()->getGridRowModifier()->setBreakpoints(
119             nativeNode, reference, pointValues.data(), pointStr.data(), size);
120         return panda::JSValueRef::Undefined(vm);
121     }
122     auto arrayVal = panda::Local<panda::ArrayRef>(secondArg);
123     auto length = arrayVal->Length(vm);
124     if (length <= 0 || length > (MAX_NUMBER_BREAKPOINT-1)) {
125         GetArkUINodeModifiers()->getGridRowModifier()->setBreakpoints(
126             nativeNode, reference, pointValues.data(), pointStr.data(), size);
127         return panda::JSValueRef::Undefined(vm);
128     }
129     for (uint32_t index = 0; index < length; index++) {
130         CalcDimension calvalue;
131         std::string calcStr;
132         auto item = panda::ArrayRef::GetValueAt(vm, arrayVal, index);
133         calcStr = item->ToString(vm)->ToString(vm);
134         if (!ArkTSUtils::ParseJsDimensionVp(vm, item, calvalue, false)) {
135             calvalue = CalcDimension(0, DimensionUnit::VP);
136         }
137         pointValues.push_back(calvalue.Value());
138         pointStr.push_back(calcStr.c_str());
139         size++;
140     }
141     GetArkUINodeModifiers()->getGridRowModifier()->setBreakpoints(nativeNode, reference, pointValues.data(),
142         pointStr.data(), size);
143     return panda::JSValueRef::Undefined(vm);
144 }
ResetBreakpoints(ArkUIRuntimeCallInfo * runtimeCallInfo)145 ArkUINativeModuleValue GridRowBridge::ResetBreakpoints(ArkUIRuntimeCallInfo* runtimeCallInfo)
146 {
147     EcmaVM* vm = runtimeCallInfo->GetVM();
148     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
149     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
150     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
151     GetArkUINodeModifiers()->getGridRowModifier()->resetBreakpoints(nativeNode);
152     return panda::JSValueRef::Undefined(vm);
153 }
154 
SetColumns(ArkUIRuntimeCallInfo * runtimeCallInfo)155 ArkUINativeModuleValue GridRowBridge::SetColumns(ArkUIRuntimeCallInfo* runtimeCallInfo)
156 {
157     EcmaVM* vm = runtimeCallInfo->GetVM();
158     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
159     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
160     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
161     Local<JSValueRef> xs = runtimeCallInfo->GetCallArgRef(XS + 1);
162     Local<JSValueRef> sm = runtimeCallInfo->GetCallArgRef(SM + 1);
163     Local<JSValueRef> md = runtimeCallInfo->GetCallArgRef(MD + 1);
164     Local<JSValueRef> lg = runtimeCallInfo->GetCallArgRef(LG + 1);
165     Local<JSValueRef> xl = runtimeCallInfo->GetCallArgRef(XL + 1);
166     Local<JSValueRef> xxl = runtimeCallInfo->GetCallArgRef(XXL + 1);
167     int32_t containerSizeArray[MAX_NUMBER_BREAKPOINT];
168     if (xs->IsNumber() && xs->Int32Value(vm) >= 0) {
169         containerSizeArray[XS] = xs->Int32Value(vm);
170     } else {
171         containerSizeArray[XS] = -1;
172     }
173     if (sm->IsNumber() && sm->Int32Value(vm) >= 0) {
174         containerSizeArray[SM] = sm->Int32Value(vm);
175     } else {
176         containerSizeArray[SM] = -1;
177     }
178     if (md->IsNumber() && md->Int32Value(vm) >= 0) {
179         containerSizeArray[MD] = md->Int32Value(vm);
180     } else {
181         containerSizeArray[MD] = -1;
182     }
183     if (lg->IsNumber() && lg->Int32Value(vm) >= 0) {
184         containerSizeArray[LG] = lg->Int32Value(vm);
185     } else {
186         containerSizeArray[LG] = -1;
187     }
188     if (xl->IsNumber() && xl->Int32Value(vm) >= 0) {
189         containerSizeArray[XL] = xl->Int32Value(vm);
190     } else {
191         containerSizeArray[XL] = -1;
192     }
193     if (xxl->IsNumber() && xxl->Int32Value(vm) >= 0) {
194         containerSizeArray[XXL] = xxl->Int32Value(vm);
195     } else {
196         containerSizeArray[XXL] = -1;
197     }
198     GetArkUINodeModifiers()->getGridRowModifier()->setColumns(nativeNode, containerSizeArray, MAX_NUMBER_BREAKPOINT);
199     return panda::JSValueRef::Undefined(vm);
200 }
ResetColumns(ArkUIRuntimeCallInfo * runtimeCallInfo)201 ArkUINativeModuleValue GridRowBridge::ResetColumns(ArkUIRuntimeCallInfo* runtimeCallInfo)
202 {
203     EcmaVM* vm = runtimeCallInfo->GetVM();
204     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
205     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
206     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
207     GetArkUINodeModifiers()->getGridRowModifier()->resetColumns(nativeNode);
208     return panda::JSValueRef::Undefined(vm);
209 }
210 
SetGutter(ArkUIRuntimeCallInfo * runtimeCallInfo)211 ArkUINativeModuleValue GridRowBridge::SetGutter(ArkUIRuntimeCallInfo* runtimeCallInfo)
212 {
213     EcmaVM* vm = runtimeCallInfo->GetVM();
214     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
215     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
217     Local<JSValueRef> xXs = runtimeCallInfo->GetCallArgRef(X_XS + 1);
218     Local<JSValueRef> xSm = runtimeCallInfo->GetCallArgRef(X_SM + 1);
219     Local<JSValueRef> xMd = runtimeCallInfo->GetCallArgRef(X_MD + 1);
220     Local<JSValueRef> xLg = runtimeCallInfo->GetCallArgRef(X_LG + 1);
221     Local<JSValueRef> xXl = runtimeCallInfo->GetCallArgRef(X_XL + 1);
222     Local<JSValueRef> xXxl = runtimeCallInfo->GetCallArgRef(X_XXL + 1);
223     Local<JSValueRef> yXs = runtimeCallInfo->GetCallArgRef(Y_XS + 1);
224     Local<JSValueRef> ySm = runtimeCallInfo->GetCallArgRef(Y_SM + 1);
225     Local<JSValueRef> yMd = runtimeCallInfo->GetCallArgRef(Y_MD + 1);
226     Local<JSValueRef> yLg = runtimeCallInfo->GetCallArgRef(Y_LG + 1);
227     Local<JSValueRef> yXl = runtimeCallInfo->GetCallArgRef(Y_XL + 1);
228     Local<JSValueRef> yXxl = runtimeCallInfo->GetCallArgRef(Y_XXL + 1);
229     int32_t containerSizeArray[MAX_NUMBER_GUTTER];
230     if (xXs->IsNumber()) {
231         containerSizeArray[X_XS] = xXs->Int32Value(vm);
232     } else {
233         containerSizeArray[X_XS] = 0;
234     }
235     if (xSm->IsNumber()) {
236         containerSizeArray[X_SM] = xSm->Int32Value(vm);
237     } else {
238         containerSizeArray[X_SM] = containerSizeArray[X_XS];
239     }
240     if (xMd->IsNumber()) {
241         containerSizeArray[X_MD] = xMd->Int32Value(vm);
242     } else {
243         containerSizeArray[X_MD] = containerSizeArray[X_SM];
244     }
245     if (xLg->IsNumber()) {
246         containerSizeArray[X_LG] = xLg->Int32Value(vm);
247     } else {
248         containerSizeArray[X_LG] = containerSizeArray[X_MD];
249     }
250     if (xXl->IsNumber()) {
251         containerSizeArray[X_XL] = xXl->Int32Value(vm);
252     } else {
253         containerSizeArray[X_XL] = containerSizeArray[X_LG];
254     }
255     if (xXxl->IsNumber()) {
256         containerSizeArray[X_XXL] = xXxl->Int32Value(vm);
257     } else {
258         containerSizeArray[X_XXL] = containerSizeArray[X_XL];
259     }
260 
261     if (yXs->IsNumber()) {
262         containerSizeArray[Y_XS] = yXs->Int32Value(vm);
263     } else {
264         containerSizeArray[Y_XS] = 0;
265     }
266     if (ySm->IsNumber()) {
267         containerSizeArray[Y_SM] = ySm->Int32Value(vm);
268     } else {
269         containerSizeArray[Y_SM] = containerSizeArray[Y_XS];
270     }
271     if (yMd->IsNumber()) {
272         containerSizeArray[Y_MD] = yMd->Int32Value(vm);
273     } else {
274         containerSizeArray[Y_MD] = containerSizeArray[Y_SM];
275     }
276     if (yLg->IsNumber()) {
277         containerSizeArray[Y_LG] = yLg->Int32Value(vm);
278     } else {
279         containerSizeArray[Y_LG] = containerSizeArray[Y_MD];
280     }
281     if (yXl->IsNumber()) {
282         containerSizeArray[Y_XL] = yXl->Int32Value(vm);
283     } else {
284         containerSizeArray[Y_XL] = containerSizeArray[Y_LG];
285     }
286     if (yXxl->IsNumber()) {
287         containerSizeArray[Y_XXL] = yXxl->Int32Value(vm);
288     } else {
289         containerSizeArray[Y_XXL] = containerSizeArray[Y_XL];
290     }
291     GetArkUINodeModifiers()->getGridRowModifier()->setGutter(nativeNode, containerSizeArray, MAX_NUMBER_GUTTER);
292     return panda::JSValueRef::Undefined(vm);
293 }
ResetGutter(ArkUIRuntimeCallInfo * runtimeCallInfo)294 ArkUINativeModuleValue GridRowBridge::ResetGutter(ArkUIRuntimeCallInfo* runtimeCallInfo)
295 {
296     EcmaVM* vm = runtimeCallInfo->GetVM();
297     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
298     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
299     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
300     GetArkUINodeModifiers()->getGridRowModifier()->resetGutter(nativeNode);
301     return panda::JSValueRef::Undefined(vm);
302 }
303 
SetOnBreakpointChange(ArkUIRuntimeCallInfo * runtimeCallInfo)304 ArkUINativeModuleValue GridRowBridge::SetOnBreakpointChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
305 {
306     EcmaVM *vm = runtimeCallInfo->GetVM();
307     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
308     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
309     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
310     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
311     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
312     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
313     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
314         GetArkUINodeModifiers()->getGridRowModifier()->resetOnBreakpointChange(nativeNode);
315         return panda::JSValueRef::Undefined(vm);
316     }
317     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
318     std::function<void(const std::string&)> callback = [vm, frameNode,
319         func = panda::CopyableGlobal(vm, func)](const std::string& changeStr) {
320         panda::LocalScope pandaScope(vm);
321         panda::TryCatch trycatch(vm);
322         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
323         panda::Local<panda::JSValueRef> params[1] = {
324             panda::StringRef::NewFromUtf8(vm, changeStr.c_str()) };
325         func->Call(vm, func.ToLocal(), params, 1);
326     };
327     GetArkUINodeModifiers()->getGridRowModifier()->setOnBreakpointChange(nativeNode,
328         reinterpret_cast<void*>(&callback));
329 
330     return panda::JSValueRef::Undefined(vm);
331 }
332 
ResetOnBreakpointChange(ArkUIRuntimeCallInfo * runtimeCallInfo)333 ArkUINativeModuleValue GridRowBridge::ResetOnBreakpointChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
334 {
335     EcmaVM* vm = runtimeCallInfo->GetVM();
336     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
337     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
338     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
339     GetArkUINodeModifiers()->getGridRowModifier()->resetOnBreakpointChange(nativeNode);
340     return panda::JSValueRef::Undefined(vm);
341 }
342 }
343