• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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_bridge.h"
16 #include "base/utils/string_utils.h"
17 #include "base/utils/utils.h"
18 #include "bridge/declarative_frontend/engine/functions/js_function.h"
19 #include "bridge/declarative_frontend/jsview/js_grid.h"
20 #include "bridge/declarative_frontend/jsview/js_scroller.h"
21 #include "core/components_ng/pattern/grid/grid_model_ng.h"
22 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
23 #include "core/components_ng/pattern/scrollable/scrollable_controller.h"
24 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
25 using namespace OHOS::Ace::Framework;
26 
27 namespace OHOS::Ace::NG {
28 constexpr int32_t CALL_ARG_0 = 0;
29 constexpr int32_t CALL_ARG_1 = 1;
30 constexpr int32_t CALL_ARG_2 = 2;
31 constexpr int32_t DEFAULT_CACHED_COUNT = 1;
32 constexpr size_t GRID_ITEM_SIZE_RESULT_LENGTH = 2;
33 constexpr size_t GRID_ITEM_RECT_RESULT_LENGTH = 4;
34 namespace {
ParseGridItemSize(const Framework::JSRef<Framework::JSVal> & value,GridItemSize & gridItemSize)35 void ParseGridItemSize(const Framework::JSRef<Framework::JSVal>& value, GridItemSize& gridItemSize)
36 {
37     if (value->IsArray()) {
38         auto array = Framework::JSRef<Framework::JSArray>::Cast(value);
39         auto length = array->Length();
40         if (length != GRID_ITEM_SIZE_RESULT_LENGTH) {
41             return;
42         }
43         Framework::JSRef<Framework::JSVal> rows = array->GetValueAt(0);
44         if (rows->IsNumber()) {
45             gridItemSize.rows = rows->ToNumber<int32_t>();
46         }
47         Framework::JSRef<Framework::JSVal> columns = array->GetValueAt(1);
48         if (columns->IsNumber()) {
49             gridItemSize.columns = columns->ToNumber<int32_t>();
50         }
51     }
52 }
53 
ParseGridItemRect(const Framework::JSRef<Framework::JSVal> & value,GridItemRect & gridItemRect)54 void ParseGridItemRect(const Framework::JSRef<Framework::JSVal>& value, GridItemRect& gridItemRect)
55 {
56     if (value->IsArray()) {
57         Framework::JSRef<Framework::JSArray> array = Framework::JSRef<Framework::JSArray>::Cast(value);
58         auto length = array->Length();
59         if (length != GRID_ITEM_RECT_RESULT_LENGTH) {
60             return;
61         }
62         auto rowStart = array->GetValueAt(GridItemRect::ROW_START);
63         if (rowStart->IsNumber()) {
64             gridItemRect.rowStart = rowStart->ToNumber<int32_t>();
65         }
66         auto rowSpan = array->GetValueAt(GridItemRect::ROW_SPAN);
67         if (rowSpan->IsNumber()) {
68             gridItemRect.rowSpan = rowSpan->ToNumber<int32_t>();
69         }
70         auto columnStart = array->GetValueAt(GridItemRect::COLUMN_START);
71         if (columnStart->IsNumber()) {
72             gridItemRect.columnStart = columnStart->ToNumber<int32_t>();
73         }
74         auto columnSpan = array->GetValueAt(GridItemRect::COLUMN_SPAN);
75         if (columnSpan->IsNumber()) {
76             gridItemRect.columnSpan = columnSpan->ToNumber<int32_t>();
77         }
78     }
79 }
80 
ParseGetGridItemSize(const EcmaVM * vm,const Local<JSValueRef> & getSizeByIndex,GridLayoutOptions & option)81 void ParseGetGridItemSize(const EcmaVM* vm, const Local<JSValueRef>& getSizeByIndex, GridLayoutOptions& option)
82 {
83     if (getSizeByIndex->IsFunction(vm)) {
84         Local<panda::FunctionRef> functionRef = getSizeByIndex->ToObject(vm);
85         auto onGetIrregularSizeByIndex =
86             [func = AceType::MakeRefPtr<Framework::JsFunction>(Framework::JSRef<Framework::JSObject>(),
87                  Framework::JSRef<Framework::JSFunc>(Framework::JSFunc(functionRef)))](int32_t index) {
88                 GridItemSize gridItemSize;
89                 auto itemIndex = Framework::JSRef<Framework::JSVal>::Make(Framework::ToJSValue(index));
90                 auto result = func->ExecuteJS(1, &itemIndex);
91                 if (!result->IsArray()) {
92                     return gridItemSize;
93                 }
94                 ParseGridItemSize(result, gridItemSize);
95                 return gridItemSize;
96             };
97         option.getSizeByIndex = std::move(onGetIrregularSizeByIndex);
98     }
99 }
100 
ParseGetGridItemRect(const EcmaVM * vm,const Local<JSValueRef> & getRectByIndex,GridLayoutOptions & option)101 void ParseGetGridItemRect(const EcmaVM* vm, const Local<JSValueRef>& getRectByIndex, GridLayoutOptions& option)
102 {
103     if (getRectByIndex->IsFunction(vm)) {
104         Local<panda::FunctionRef> functionRef = getRectByIndex->ToObject(vm);
105         auto onGetRectByIndex =
106             [func = AceType::MakeRefPtr<Framework::JsFunction>(Framework::JSRef<Framework::JSObject>(),
107                  Framework::JSRef<Framework::JSFunc>(Framework::JSFunc(functionRef)))](int32_t index) {
108                 GridItemRect gridItemRect;
109                 auto itemIndex = Framework::JSRef<Framework::JSVal>::Make(Framework::ToJSValue(index));
110                 auto result = func->ExecuteJS(1, &itemIndex);
111                 if (!result->IsArray()) {
112                     return gridItemRect;
113                 }
114                 ParseGridItemRect(result, gridItemRect);
115                 return gridItemRect;
116             };
117         option.getRectByIndex = std::move(onGetRectByIndex);
118     }
119 }
120 } // namespace
121 
SetColumnsTemplate(ArkUIRuntimeCallInfo * runtimeCallInfo)122 ArkUINativeModuleValue GridBridge::SetColumnsTemplate(ArkUIRuntimeCallInfo* runtimeCallInfo)
123 {
124     EcmaVM* vm = runtimeCallInfo->GetVM();
125     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
126     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
127     Local<JSValueRef> arg_columnsTemplate = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
128     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
129     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
130     if (arg_columnsTemplate->IsUndefined() || !arg_columnsTemplate->IsString(vm)) {
131         GetArkUINodeModifiers()->getGridModifier()->resetGridColumnsTemplate(nativeNode);
132     } else {
133         std::string columnsTemplate = arg_columnsTemplate->ToString(vm)->ToString(vm);
134         GetArkUINodeModifiers()->getGridModifier()->setGridColumnsTemplate(nativeNode, columnsTemplate.c_str());
135     }
136     return panda::JSValueRef::Undefined(vm);
137 }
138 
ResetColumnsTemplate(ArkUIRuntimeCallInfo * runtimeCallInfo)139 ArkUINativeModuleValue GridBridge::ResetColumnsTemplate(ArkUIRuntimeCallInfo* runtimeCallInfo)
140 {
141     EcmaVM* vm = runtimeCallInfo->GetVM();
142     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
143     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
144     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
145     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
146     GetArkUINodeModifiers()->getGridModifier()->resetGridColumnsTemplate(nativeNode);
147     return panda::JSValueRef::Undefined(vm);
148 }
149 
SetRowsTemplate(ArkUIRuntimeCallInfo * runtimeCallInfo)150 ArkUINativeModuleValue GridBridge::SetRowsTemplate(ArkUIRuntimeCallInfo* runtimeCallInfo)
151 {
152     EcmaVM* vm = runtimeCallInfo->GetVM();
153     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
154     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
155     Local<JSValueRef> arg_rowsTemplate = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
156     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
157     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
158     if (arg_rowsTemplate->IsUndefined() || !arg_rowsTemplate->IsString(vm)) {
159         GetArkUINodeModifiers()->getGridModifier()->resetGridRowsTemplate(nativeNode);
160     } else {
161         std::string rowsTemplate = arg_rowsTemplate->ToString(vm)->ToString(vm);
162         GetArkUINodeModifiers()->getGridModifier()->setGridRowsTemplate(nativeNode, rowsTemplate.c_str());
163     }
164     return panda::JSValueRef::Undefined(vm);
165 }
166 
ResetRowsTemplate(ArkUIRuntimeCallInfo * runtimeCallInfo)167 ArkUINativeModuleValue GridBridge::ResetRowsTemplate(ArkUIRuntimeCallInfo* runtimeCallInfo)
168 {
169     EcmaVM* vm = runtimeCallInfo->GetVM();
170     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
171     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
172     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
173     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
174     GetArkUINodeModifiers()->getGridModifier()->resetGridRowsTemplate(nativeNode);
175     return panda::JSValueRef::Undefined(vm);
176 }
177 
SetColumnsGap(ArkUIRuntimeCallInfo * runtimeCallInfo)178 ArkUINativeModuleValue GridBridge::SetColumnsGap(ArkUIRuntimeCallInfo* runtimeCallInfo)
179 {
180     EcmaVM* vm = runtimeCallInfo->GetVM();
181     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
182     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
183     Local<JSValueRef> arg_size = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
184     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
185     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
186 
187     CalcDimension size;
188     std::string calcStr;
189     struct ArkUIResourceLength columnGap = { 0.0, 0, nullptr };
190     if (arg_size->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, arg_size, size, true)) {
191         GetArkUINodeModifiers()->getGridModifier()->resetGridColumnsGap(nativeNode);
192     } else {
193         if (size.Unit() == DimensionUnit::CALC) {
194             columnGap.unit = static_cast<int32_t>(DimensionUnit::CALC);
195             calcStr = size.CalcValue();
196             columnGap.string = calcStr.c_str();
197             GetArkUINodeModifiers()->getGridModifier()->setGridColumnsGap(nativeNode, &columnGap);
198         } else {
199             columnGap.value = size.Value();
200             columnGap.unit = static_cast<int32_t>(size.Unit());
201             columnGap.string = calcStr.c_str();
202             GetArkUINodeModifiers()->getGridModifier()->setGridColumnsGap(nativeNode, &columnGap);
203         }
204     }
205     return panda::JSValueRef::Undefined(vm);
206 }
207 
ResetColumnsGap(ArkUIRuntimeCallInfo * runtimeCallInfo)208 ArkUINativeModuleValue GridBridge::ResetColumnsGap(ArkUIRuntimeCallInfo* runtimeCallInfo)
209 {
210     EcmaVM* vm = runtimeCallInfo->GetVM();
211     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
212     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
213     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
214     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
215     GetArkUINodeModifiers()->getGridModifier()->resetGridColumnsGap(nativeNode);
216     return panda::JSValueRef::Undefined(vm);
217 }
218 
SetRowsGap(ArkUIRuntimeCallInfo * runtimeCallInfo)219 ArkUINativeModuleValue GridBridge::SetRowsGap(ArkUIRuntimeCallInfo* runtimeCallInfo)
220 {
221     EcmaVM* vm = runtimeCallInfo->GetVM();
222     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
223     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
224     Local<JSValueRef> arg_size = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
225     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
226     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
227 
228     CalcDimension size;
229     std::string calcStr;
230     struct ArkUIResourceLength rowsGap = { 0.0, 0, nullptr };
231     if (arg_size->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, arg_size, size, true)) {
232         GetArkUINodeModifiers()->getGridModifier()->resetGridRowsGap(nativeNode);
233     } else {
234         if (size.Unit() == DimensionUnit::CALC) {
235             rowsGap.unit = static_cast<int32_t>(DimensionUnit::CALC);
236             calcStr = size.CalcValue();
237             rowsGap.string = calcStr.c_str();
238             GetArkUINodeModifiers()->getGridModifier()->setGridRowsGap(nativeNode, &rowsGap);
239         } else {
240             rowsGap.value = size.Value();
241             rowsGap.unit = static_cast<int32_t>(size.Unit());
242             rowsGap.string = calcStr.c_str();
243             GetArkUINodeModifiers()->getGridModifier()->setGridRowsGap(nativeNode, &rowsGap);
244         }
245     }
246     return panda::JSValueRef::Undefined(vm);
247 }
248 
ResetRowsGap(ArkUIRuntimeCallInfo * runtimeCallInfo)249 ArkUINativeModuleValue GridBridge::ResetRowsGap(ArkUIRuntimeCallInfo* runtimeCallInfo)
250 {
251     EcmaVM* vm = runtimeCallInfo->GetVM();
252     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
253     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
254     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
255     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
256     GetArkUINodeModifiers()->getGridModifier()->resetGridRowsGap(nativeNode);
257     return panda::JSValueRef::Undefined(vm);
258 }
259 
SetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)260 ArkUINativeModuleValue GridBridge::SetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
261 {
262     EcmaVM* vm = runtimeCallInfo->GetVM();
263     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
264     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
265     Local<JSValueRef> arg_scrollBar = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
266     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
267     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
268     if (!arg_scrollBar->IsNull() && arg_scrollBar->IsNumber()) {
269         int32_t scrollBar = arg_scrollBar->Int32Value(vm);
270         if (scrollBar < 0) {
271             GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBar(nativeNode);
272         } else {
273             GetArkUINodeModifiers()->getGridModifier()->setGridScrollBar(nativeNode, scrollBar);
274         }
275     } else {
276         GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBar(nativeNode);
277     }
278     return panda::JSValueRef::Undefined(vm);
279 }
280 
ResetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)281 ArkUINativeModuleValue GridBridge::ResetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
282 {
283     EcmaVM* vm = runtimeCallInfo->GetVM();
284     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
285     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
286     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
287     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
288     GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBar(nativeNode);
289     return panda::JSValueRef::Undefined(vm);
290 }
291 
SetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)292 ArkUINativeModuleValue GridBridge::SetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
293 {
294     EcmaVM* vm = runtimeCallInfo->GetVM();
295     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
296     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
297     Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
298     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
299     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
300 
301     CalcDimension scrollBarWidth;
302     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, scrollBarArg, scrollBarWidth, false)) {
303         GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarWidth(nativeNode);
304     } else {
305         if (LessNotEqual(scrollBarWidth.Value(), 0.0f)) {
306             GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarWidth(nativeNode);
307         } else {
308             GetArkUINodeModifiers()->getGridModifier()->setGridScrollBarWidth(
309                 nativeNode, scrollBarWidth.Value(), static_cast<int32_t>(scrollBarWidth.Unit()));
310         }
311     }
312     return panda::JSValueRef::Undefined(vm);
313 }
314 
ResetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)315 ArkUINativeModuleValue GridBridge::ResetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
316 {
317     EcmaVM* vm = runtimeCallInfo->GetVM();
318     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
319     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
320     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
321     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
322     GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarWidth(nativeNode);
323     return panda::JSValueRef::Undefined(vm);
324 }
325 
SetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)326 ArkUINativeModuleValue GridBridge::SetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
327 {
328     EcmaVM* vm = runtimeCallInfo->GetVM();
329     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
330     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
331     Local<JSValueRef> arg_color = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
332     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
333     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
334     if (arg_color->IsNull() || arg_color->IsUndefined()) {
335         GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
336         return panda::JSValueRef::Undefined(vm);
337     }
338     if (arg_color->IsNumber()) {
339         auto colorNum = arg_color->ToNumber(vm)->Value();
340         if (colorNum <= 0) {
341             GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
342             return panda::JSValueRef::Undefined(vm);
343         }
344     }
345     Color color;
346     if (ArkTSUtils::ParseJsColorAlpha(vm, arg_color, color)) {
347         GetArkUINodeModifiers()->getGridModifier()->setGridScrollBarColor(
348             nativeNode, color.GetValue());
349     } else {
350         GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
351     }
352     return panda::JSValueRef::Undefined(vm);
353 }
354 
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)355 ArkUINativeModuleValue GridBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
356 {
357     EcmaVM* vm = runtimeCallInfo->GetVM();
358     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
359     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
360     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
361     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
362     GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
363     return panda::JSValueRef::Undefined(vm);
364 }
365 
SetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)366 ArkUINativeModuleValue GridBridge::SetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
367 {
368     EcmaVM* vm = runtimeCallInfo->GetVM();
369     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
370     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
371     Local<JSValueRef> argCachedCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
372     Local<JSValueRef> argShow = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
373     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
374     auto* nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
375     auto value = DEFAULT_CACHED_COUNT;
376     if (!argCachedCount->IsUndefined()) {
377         ArkTSUtils::ParseJsInteger(vm, argCachedCount, value);
378         if (value < 0) {
379             value = DEFAULT_CACHED_COUNT;
380         }
381     }
382     GetArkUINodeModifiers()->getGridModifier()->setGridCachedCount(nativeNode, value);
383 
384     bool show = !argShow.IsNull() && argShow->IsTrue();
385     GetArkUINodeModifiers()->getGridModifier()->setShowCached(nativeNode, show);
386     return panda::JSValueRef::Undefined(vm);
387 }
388 
ResetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)389 ArkUINativeModuleValue GridBridge::ResetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
390 {
391     EcmaVM* vm = runtimeCallInfo->GetVM();
392     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
393     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
394     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
395     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
396     GetArkUINodeModifiers()->getGridModifier()->resetGridCachedCount(nativeNode);
397     GetArkUINodeModifiers()->getGridModifier()->resetShowCached(nativeNode);
398     return panda::JSValueRef::Undefined(vm);
399 }
400 
SetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)401 ArkUINativeModuleValue GridBridge::SetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
402 {
403     EcmaVM* vm = runtimeCallInfo->GetVM();
404     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
405     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
406     Local<JSValueRef> arg_editMode = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
407     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
408     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
409     bool editMode = arg_editMode->ToBoolean(vm)->Value();
410     GetArkUINodeModifiers()->getGridModifier()->setGridEditMode(nativeNode, editMode);
411     return panda::JSValueRef::Undefined(vm);
412 }
413 
ResetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)414 ArkUINativeModuleValue GridBridge::ResetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
415 {
416     EcmaVM* vm = runtimeCallInfo->GetVM();
417     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
418     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
419     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
420     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
421     GetArkUINodeModifiers()->getGridModifier()->resetGridEditMode(nativeNode);
422     return panda::JSValueRef::Undefined(vm);
423 }
424 
SetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)425 ArkUINativeModuleValue GridBridge::SetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
426 {
427     EcmaVM* vm = runtimeCallInfo->GetVM();
428     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
429     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
430     Local<JSValueRef> arg_multiSelectable = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
431     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
432     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
433     bool multiSelectable = arg_multiSelectable->ToBoolean(vm)->Value();
434     GetArkUINodeModifiers()->getGridModifier()->setGridMultiSelectable(nativeNode, multiSelectable);
435     return panda::JSValueRef::Undefined(vm);
436 }
437 
ResetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)438 ArkUINativeModuleValue GridBridge::ResetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
439 {
440     EcmaVM* vm = runtimeCallInfo->GetVM();
441     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
442     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
443     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
444     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
445     GetArkUINodeModifiers()->getGridModifier()->resetGridMultiSelectable(nativeNode);
446     return panda::JSValueRef::Undefined(vm);
447 }
448 
SetMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)449 ArkUINativeModuleValue GridBridge::SetMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
450 {
451     EcmaVM* vm = runtimeCallInfo->GetVM();
452     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
453     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
454     Local<JSValueRef> arg_maxCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
455     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
456     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
457     if (!arg_maxCount->IsNull() && arg_maxCount->IsNumber()) {
458         int32_t maxCount = arg_maxCount->Int32Value(vm);
459         if (maxCount < 1) {
460             GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
461         } else {
462             GetArkUINodeModifiers()->getGridModifier()->setGridMaxCount(nativeNode, maxCount);
463         }
464     } else {
465         GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
466     }
467     return panda::JSValueRef::Undefined(vm);
468 }
469 
ResetMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)470 ArkUINativeModuleValue GridBridge::ResetMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
471 {
472     EcmaVM* vm = runtimeCallInfo->GetVM();
473     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
474     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
475     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
476     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
477     GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
478     return panda::JSValueRef::Undefined(vm);
479 }
480 
SetMinCount(ArkUIRuntimeCallInfo * runtimeCallInfo)481 ArkUINativeModuleValue GridBridge::SetMinCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
482 {
483     EcmaVM* vm = runtimeCallInfo->GetVM();
484     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
485     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
486     Local<JSValueRef> arg_minCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
487     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
488     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
489     if (!arg_minCount->IsNull() && arg_minCount->IsNumber()) {
490         int32_t minCount = arg_minCount->Int32Value(vm);
491         if (minCount < 1) {
492             GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
493         } else {
494             GetArkUINodeModifiers()->getGridModifier()->setGridMinCount(nativeNode, minCount);
495         }
496     } else {
497         GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
498     }
499     return panda::JSValueRef::Undefined(vm);
500 }
501 
ResetMinCount(ArkUIRuntimeCallInfo * runtimeCallInfo)502 ArkUINativeModuleValue GridBridge::ResetMinCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
503 {
504     EcmaVM* vm = runtimeCallInfo->GetVM();
505     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
506     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
507     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
508     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
509     GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
510     return panda::JSValueRef::Undefined(vm);
511 }
512 
SetCellLength(ArkUIRuntimeCallInfo * runtimeCallInfo)513 ArkUINativeModuleValue GridBridge::SetCellLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
514 {
515     EcmaVM* vm = runtimeCallInfo->GetVM();
516     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
517     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
518     Local<JSValueRef> arg_cellLength = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
519     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
520     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
521     if (!arg_cellLength->IsNull() && arg_cellLength->IsNumber()) {
522         int32_t cellLength = arg_cellLength->Int32Value(vm);
523         GetArkUINodeModifiers()->getGridModifier()->setGridCellLength(nativeNode, cellLength);
524     } else {
525         GetArkUINodeModifiers()->getGridModifier()->resetGridCellLength(nativeNode);
526     }
527     return panda::JSValueRef::Undefined(vm);
528 }
529 
ResetCellLength(ArkUIRuntimeCallInfo * runtimeCallInfo)530 ArkUINativeModuleValue GridBridge::ResetCellLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
531 {
532     EcmaVM* vm = runtimeCallInfo->GetVM();
533     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
534     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
535     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
536     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
537     GetArkUINodeModifiers()->getGridModifier()->resetGridCellLength(nativeNode);
538     return panda::JSValueRef::Undefined(vm);
539 }
540 
SetLayoutDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)541 ArkUINativeModuleValue GridBridge::SetLayoutDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
542 {
543     EcmaVM* vm = runtimeCallInfo->GetVM();
544     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
545     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
546     Local<JSValueRef> arg_layoutDirection = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
547     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
548     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
549     if (!arg_layoutDirection->IsNull() && arg_layoutDirection->IsNumber()) {
550         int32_t layoutDirection = arg_layoutDirection->Int32Value(vm);
551         GetArkUINodeModifiers()->getGridModifier()->setGridLayoutDirection(nativeNode, layoutDirection);
552     } else {
553         GetArkUINodeModifiers()->getGridModifier()->resetGridLayoutDirection(nativeNode);
554     }
555     return panda::JSValueRef::Undefined(vm);
556 }
557 
ResetLayoutDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)558 ArkUINativeModuleValue GridBridge::ResetLayoutDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
559 {
560     EcmaVM* vm = runtimeCallInfo->GetVM();
561     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
562     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
563     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
564     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
565     GetArkUINodeModifiers()->getGridModifier()->resetGridLayoutDirection(nativeNode);
566     return panda::JSValueRef::Undefined(vm);
567 }
568 
SetSupportAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)569 ArkUINativeModuleValue GridBridge::SetSupportAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
570 {
571     EcmaVM* vm = runtimeCallInfo->GetVM();
572     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
573     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
574     Local<JSValueRef> arg_supportAnimation = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
575     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
576     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
577     bool supportAnimation = arg_supportAnimation->ToBoolean(vm)->Value();
578     GetArkUINodeModifiers()->getGridModifier()->setGridSupportAnimation(nativeNode, supportAnimation);
579     return panda::JSValueRef::Undefined(vm);
580 }
581 
ResetSupportAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)582 ArkUINativeModuleValue GridBridge::ResetSupportAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
583 {
584     EcmaVM* vm = runtimeCallInfo->GetVM();
585     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
586     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
587     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
588     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
589     GetArkUINodeModifiers()->getGridModifier()->resetGridSupportAnimation(nativeNode);
590     return panda::JSValueRef::Undefined(vm);
591 }
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)592 ArkUINativeModuleValue GridBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
593 {
594     EcmaVM* vm = runtimeCallInfo->GetVM();
595     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
596     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
597     Local<JSValueRef> arg_forward = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
598     Local<JSValueRef> arg_backward = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
599 
600     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
601     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
602     int32_t forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
603     int32_t backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
604     if (!arg_forward->IsUndefined()) {
605         forward = arg_forward->Int32Value(vm);
606     }
607     if (!arg_backward->IsUndefined()) {
608         backward = arg_backward->Int32Value(vm);
609     }
610 
611     if (forward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
612         forward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
613         forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
614     }
615 
616     if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
617         backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
618         backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
619     }
620 
621     GetArkUINodeModifiers()->getGridModifier()->setNestedScroll(nativeNode, forward, backward);
622 
623     return panda::JSValueRef::Undefined(vm);
624 }
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)625 ArkUINativeModuleValue GridBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
626 {
627     EcmaVM* vm = runtimeCallInfo->GetVM();
628     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
629     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
630     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
631     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
632     GetArkUINodeModifiers()->getGridModifier()->resetNestedScroll(nativeNode);
633     return panda::JSValueRef::Undefined(vm);
634 }
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)635 ArkUINativeModuleValue GridBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
636 {
637     EcmaVM* vm = runtimeCallInfo->GetVM();
638     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
639     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
640     Local<JSValueRef> arg_enableScroll = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
641 
642     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
643     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
644 
645     GetArkUINodeModifiers()->getGridModifier()->setEnableScroll(
646         nativeNode, arg_enableScroll->IsBoolean() ? arg_enableScroll->ToBoolean(vm)->Value() : true);
647 
648     return panda::JSValueRef::Undefined(vm);
649 }
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)650 ArkUINativeModuleValue GridBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
651 {
652     EcmaVM* vm = runtimeCallInfo->GetVM();
653     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
654     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
655     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
656     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
657     GetArkUINodeModifiers()->getGridModifier()->resetEnableScroll(nativeNode);
658     return panda::JSValueRef::Undefined(vm);
659 }
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)660 ArkUINativeModuleValue GridBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
661 {
662     EcmaVM* vm = runtimeCallInfo->GetVM();
663     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
664     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
665     Local<JSValueRef> arg_friction = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
666 
667     double friction = -1.0;
668     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
669     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
670     if (!ArkTSUtils::ParseJsDouble(vm, arg_friction, friction)) {
671         friction = -1.0;
672     }
673     GetArkUINodeModifiers()->getGridModifier()->setFriction(nativeNode, static_cast<ArkUI_Float32>(friction));
674 
675     return panda::JSValueRef::Undefined(vm);
676 }
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)677 ArkUINativeModuleValue GridBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
678 {
679     EcmaVM* vm = runtimeCallInfo->GetVM();
680     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
681     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
682     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
683     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
684     GetArkUINodeModifiers()->getGridModifier()->resetFriction(nativeNode);
685     return panda::JSValueRef::Undefined(vm);
686 }
SetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)687 ArkUINativeModuleValue GridBridge::SetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
688 {
689     EcmaVM* vm = runtimeCallInfo->GetVM();
690     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
691     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
692     Local<JSValueRef> arg_alignItems = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
693 
694     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
695     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
696     int32_t itemAlignment = static_cast<int32_t>(GridItemAlignment::DEFAULT);
697     if (!arg_alignItems->IsUndefined() && !arg_alignItems->IsNull()) {
698         itemAlignment = arg_alignItems->Int32Value(vm);
699     }
700 
701     if (itemAlignment != static_cast<int32_t>(GridItemAlignment::DEFAULT) &&
702         itemAlignment != static_cast<int32_t>(GridItemAlignment::STRETCH)) {
703         itemAlignment = static_cast<int32_t>(GridItemAlignment::DEFAULT);
704     }
705 
706     GetArkUINodeModifiers()->getGridModifier()->setGridAlignItems(nativeNode, itemAlignment);
707     return panda::JSValueRef::Undefined(vm);
708 }
ResetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)709 ArkUINativeModuleValue GridBridge::ResetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
710 {
711     EcmaVM* vm = runtimeCallInfo->GetVM();
712     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
713     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
714     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
715     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
716     GetArkUINodeModifiers()->getGridModifier()->resetGridAlignItems(nativeNode);
717     return panda::JSValueRef::Undefined(vm);
718 }
719 
SetGridScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)720 ArkUINativeModuleValue GridBridge::SetGridScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
721 {
722     EcmaVM* vm = runtimeCallInfo->GetVM();
723     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
724     Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
725     Local<JSValueRef> scrollerVal = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
726     RefPtr<ScrollControllerBase> positionController;
727     RefPtr<ScrollProxy> scrollBarProxy;
728     CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
729     auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
730     if (scrollerVal->IsObject(vm)) {
731         auto* jsScroller = Framework::JSRef<Framework::JSObject>(Framework::JSObject(scrollerVal->ToObject(vm)))
732                                ->Unwrap<Framework::JSScroller>();
733         if (jsScroller) {
734             jsScroller->SetInstanceId(Container::CurrentIdSafely());
735             positionController = AceType::MakeRefPtr<ScrollableController>();
736             jsScroller->SetController(positionController);
737             scrollBarProxy = jsScroller->GetScrollBarProxy();
738             if (!scrollBarProxy) {
739                 scrollBarProxy = AceType::MakeRefPtr<NG::ScrollBarProxy>();
740                 jsScroller->SetScrollBarProxy(scrollBarProxy);
741             }
742         }
743     }
744     GridModelNG::InitScroller(reinterpret_cast<FrameNode*>(nativeNode), positionController, scrollBarProxy);
745     return panda::JSValueRef::Undefined(vm);
746 }
747 
SetGridLayoutOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)748 ArkUINativeModuleValue GridBridge::SetGridLayoutOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
749 {
750     EcmaVM* vm = runtimeCallInfo->GetVM();
751     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
752     Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(0);
753     Local<JSValueRef> irregularIndexesVal = runtimeCallInfo->GetCallArgRef(2); // 2: parameter index
754     Local<JSValueRef> indexesLengthVal = runtimeCallInfo->GetCallArgRef(3); // 3: parameter index
755     CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
756     auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
757     int32_t length = 0;
758     if (indexesLengthVal->IsNumber()) {
759         length = indexesLengthVal->Int32Value(vm);
760     }
761     auto irregularIndexes = std::make_unique<int32_t[]>(length);
762     bool irregularResult = ArkTSUtils::ParseArray<int32_t>(vm, irregularIndexesVal, irregularIndexes.get(), length,
763         [](const EcmaVM* vm, const Local<JSValueRef>& jsValue) {
764             bool isNumber = false;
765             return jsValue->GetValueInt32(isNumber);
766         });
767 
768     GridLayoutOptions options;
769     // only support regularSize(1, 1)
770     options.regularSize.rows = 1;
771     options.regularSize.columns = 1;
772     if (irregularResult) {
773         for (int32_t i = 0; i < length; i++) {
774             options.irregularIndexes.emplace(irregularIndexes[i]);
775         }
776     }
777     irregularIndexes.reset();
778     ParseGetGridItemSize(vm, runtimeCallInfo->GetCallArgRef(4), options); // 4: parameter index
779     ParseGetGridItemRect(vm, runtimeCallInfo->GetCallArgRef(5), options); // 5: parameter index
780     GridModelNG::SetLayoutOptions(reinterpret_cast<FrameNode*>(nativeNode), options);
781     return panda::JSValueRef::Undefined(vm);
782 }
783 
SetOnGridScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)784 ArkUINativeModuleValue GridBridge::SetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
785 {
786     EcmaVM* vm = runtimeCallInfo->GetVM();
787     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
788     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
789     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
790     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
791     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
792     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
793         GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollIndex(nativeNode);
794         return panda::JSValueRef::Undefined(vm);
795     }
796     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
797     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
798     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
799 
800     std::function<void(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
801                                                          const int32_t first, const int32_t last) {
802         panda::LocalScope pandaScope(vm);
803         panda::TryCatch trycatch(vm);
804         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
805 
806         panda::Local<panda::NumberRef> firstParam = panda::NumberRef::New(vm, first);
807         panda::Local<panda::NumberRef> lastParam = panda::NumberRef::New(vm, last);
808         // 2: Array length
809         panda::Local<panda::JSValueRef> params[2] = { firstParam, lastParam };
810         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
811     };
812     GetArkUINodeModifiers()->getGridModifier()->setOnGridScrollIndexCallBack(
813         nativeNode, reinterpret_cast<void*>(&callback));
814     return panda::JSValueRef::Undefined(vm);
815 }
816 
ResetOnGridScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)817 ArkUINativeModuleValue GridBridge::ResetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
818 {
819     EcmaVM* vm = runtimeCallInfo->GetVM();
820     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
821     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
822     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
823     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
824     GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollIndex(nativeNode);
825     return panda::JSValueRef::Undefined(vm);
826 }
827 
SetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)828 ArkUINativeModuleValue GridBridge::SetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
829 {
830     EcmaVM* vm = runtimeCallInfo->GetVM();
831     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
832     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
833     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
834     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
835     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
836     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
837         GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollBarUpdate(nativeNode);
838         return panda::JSValueRef::Undefined(vm);
839     }
840     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
841     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
842     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
843 
844     std::function<std::pair<float, float>(int32_t, Dimension&)> callback =
845         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const int32_t index, const Dimension& offset) {
846             panda::LocalScope pandaScope(vm);
847             panda::TryCatch trycatch(vm);
848             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
849 
850             panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
851             panda::Local<panda::NumberRef> offsetParam =
852                 panda::NumberRef::New(vm, static_cast<double>(offset.ConvertToVp()));
853 
854             // 2: Array length
855             panda::Local<panda::JSValueRef> params[2] = { indexParam, offsetParam };
856             auto result = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
857             if (result->IsObject(vm)) {
858                 auto resultObj = result->ToObject(vm);
859                 panda::Local<panda::JSValueRef> offset =
860                     resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "totalOffset"));
861                 panda::Local<panda::JSValueRef> length =
862                     resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "totalLength"));
863                 CalcDimension totalOffset_;
864                 CalcDimension totalLength_;
865                 if (ArkTSUtils::ParseJsDimensionVp(vm, offset, totalOffset_) &&
866                     ArkTSUtils::ParseJsDimensionVp(vm, length, totalLength_)) {
867                     return std::pair<float, float>(totalOffset_.ConvertToPx(), totalLength_.ConvertToPx());
868                 }
869             }
870             return std::pair<float, float>(0, 0);
871         };
872     GetArkUINodeModifiers()->getGridModifier()->setOnGridScrollBarUpdateCallBack(
873         nativeNode, reinterpret_cast<void*>(&callback));
874     return panda::JSValueRef::Undefined(vm);
875 }
876 
ResetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)877 ArkUINativeModuleValue GridBridge::ResetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
878 {
879     EcmaVM* vm = runtimeCallInfo->GetVM();
880     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
881     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
882     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
883     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
884     GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollBarUpdate(nativeNode);
885     return panda::JSValueRef::Undefined(vm);
886 }
887 
SetOnGridItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)888 ArkUINativeModuleValue GridBridge::SetOnGridItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
889 {
890     EcmaVM* vm = runtimeCallInfo->GetVM();
891     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
892     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
893     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
894     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
895     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
896     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
897 
898     JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
899     if (!info[1]->IsFunction()) {
900         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragStart(nativeNode);
901         return panda::JSValueRef::Undefined(vm);
902     }
903 
904     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
905     std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
906                                                                      execCtx = info.GetExecutionContext()](
907                                                                      const ItemDragInfo& dragInfo, int32_t itemIndex) {
908         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
909         panda::LocalScope pandaScope(vm);
910         panda::TryCatch trycatch(vm);
911 
912         auto ret = func->ItemDragStartExecute(dragInfo, itemIndex);
913         if (!ret->IsFunction()) {
914             return;
915         }
916 
917         auto builderFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(ret));
918         if (!builderFunc) {
919             return;
920         }
921 
922         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
923         builderFunc->Execute();
924     };
925     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragStart(nativeNode, reinterpret_cast<void*>(&callback));
926     return panda::JSValueRef::Undefined(vm);
927 }
928 
ResetOnGridItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)929 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
930 {
931     EcmaVM* vm = runtimeCallInfo->GetVM();
932     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
933     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
934     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
935     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
936     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragStart(nativeNode);
937     return panda::JSValueRef::Undefined(vm);
938 }
939 
SetOnGridItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)940 ArkUINativeModuleValue GridBridge::SetOnGridItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
941 {
942     EcmaVM* vm = runtimeCallInfo->GetVM();
943     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
944     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
945     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
946     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
947     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
948     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
949 
950     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
951     if (!info[1]->IsFunction()) {
952         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragEnter(nativeNode);
953         return panda::JSValueRef::Undefined(vm);
954     }
955     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
956 
957     std::function<void(const ItemDragInfo&)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
958                                                             execCtx = info.GetExecutionContext()](
959                                                             const ItemDragInfo& dragInfo) {
960         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
961         panda::LocalScope pandaScope(vm);
962         panda::TryCatch trycatch(vm);
963 
964         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
965         func->ItemDragEnterExecute(dragInfo);
966     };
967     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragEnter(nativeNode, reinterpret_cast<void*>(&callback));
968     return panda::JSValueRef::Undefined(vm);
969 }
970 
ResetOnGridItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)971 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
972 {
973     EcmaVM* vm = runtimeCallInfo->GetVM();
974     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
975     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
976     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
977     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
978     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragEnter(nativeNode);
979     return panda::JSValueRef::Undefined(vm);
980 }
981 
SetOnGridItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)982 ArkUINativeModuleValue GridBridge::SetOnGridItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
983 {
984     EcmaVM* vm = runtimeCallInfo->GetVM();
985     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
986     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
987     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
988     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
989     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
990     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
991 
992     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
993     if (!info[1]->IsFunction()) {
994         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragMove(nativeNode);
995         return panda::JSValueRef::Undefined(vm);
996     }
997     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
998 
999     std::function<void(const ItemDragInfo&, int32_t, int32_t)> callback =
1000         [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1001             const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) {
1002             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1003             panda::LocalScope pandaScope(vm);
1004             panda::TryCatch trycatch(vm);
1005 
1006             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1007             func->ItemDragMoveExecute(dragInfo, itemIndex, insertIndex);
1008         };
1009     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragMove(nativeNode, reinterpret_cast<void*>(&callback));
1010     return panda::JSValueRef::Undefined(vm);
1011 }
1012 
ResetOnGridItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1013 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1014 {
1015     EcmaVM* vm = runtimeCallInfo->GetVM();
1016     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1017     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1018     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1019     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1020     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragMove(nativeNode);
1021     return panda::JSValueRef::Undefined(vm);
1022 }
1023 
SetOnGridItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1024 ArkUINativeModuleValue GridBridge::SetOnGridItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1025 {
1026     EcmaVM* vm = runtimeCallInfo->GetVM();
1027     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1028     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1029     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1030     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1031     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1032     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1033 
1034     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1035     if (!info[1]->IsFunction()) {
1036         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragLeave(nativeNode);
1037         return panda::JSValueRef::Undefined(vm);
1038     }
1039     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1040 
1041     std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1042                                                                      execCtx = info.GetExecutionContext()](
1043                                                                      const ItemDragInfo& dragInfo, int32_t itemIndex) {
1044         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1045         panda::LocalScope pandaScope(vm);
1046         panda::TryCatch trycatch(vm);
1047 
1048         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1049         func->ItemDragLeaveExecute(dragInfo, itemIndex);
1050     };
1051     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragLeave(nativeNode, reinterpret_cast<void*>(&callback));
1052     return panda::JSValueRef::Undefined(vm);
1053 }
1054 
ResetOnGridItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1055 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1056 {
1057     EcmaVM* vm = runtimeCallInfo->GetVM();
1058     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1059     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1060     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1061     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1062     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragLeave(nativeNode);
1063     return panda::JSValueRef::Undefined(vm);
1064 }
1065 
SetOnGridItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1066 ArkUINativeModuleValue GridBridge::SetOnGridItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1067 {
1068     EcmaVM* vm = runtimeCallInfo->GetVM();
1069     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1070     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1071     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1072     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1073     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1074     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1075 
1076     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1077     if (!info[1]->IsFunction()) {
1078         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDrop(nativeNode);
1079         return panda::JSValueRef::Undefined(vm);
1080     }
1081     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1082 
1083     std::function<void(const ItemDragInfo&, int32_t, int32_t, bool)> callback =
1084         [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1085             const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) {
1086             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1087             panda::LocalScope pandaScope(vm);
1088             panda::TryCatch trycatch(vm);
1089 
1090             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1091             func->ItemDropExecute(dragInfo, itemIndex, insertIndex, isSuccess);
1092         };
1093     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDrop(nativeNode, reinterpret_cast<void*>(&callback));
1094     return panda::JSValueRef::Undefined(vm);
1095 }
1096 
ResetOnGridItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1097 ArkUINativeModuleValue GridBridge::ResetOnGridItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1098 {
1099     EcmaVM* vm = runtimeCallInfo->GetVM();
1100     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1101     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1102     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1103     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1104     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDrop(nativeNode);
1105     return panda::JSValueRef::Undefined(vm);
1106 }
1107 } // namespace OHOS::Ace::NG
1108