• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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     RefPtr<ResourceObject> resObj;
347     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
348     if (ArkTSUtils::ParseJsColorAlpha(vm, arg_color, color, resObj, nodeInfo)) {
349         GetArkUINodeModifiers()->getGridModifier()->setGridScrollBarColor(
350             nativeNode, color.GetValue());
351     } else {
352         GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
353     }
354     if (SystemProperties::ConfigChangePerform()) {
355         GetArkUINodeModifiers()->getGridModifier()->createWithResourceObjScrollBarColor(
356             nativeNode, reinterpret_cast<void*>(AceType::RawPtr(resObj)));
357     }
358     return panda::JSValueRef::Undefined(vm);
359 }
360 
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)361 ArkUINativeModuleValue GridBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
362 {
363     EcmaVM* vm = runtimeCallInfo->GetVM();
364     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
365     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
366     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
367     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
368     GetArkUINodeModifiers()->getGridModifier()->resetGridScrollBarColor(nativeNode);
369     if (SystemProperties::ConfigChangePerform()) {
370         GetArkUINodeModifiers()->getGridModifier()->createWithResourceObjScrollBarColor(nativeNode, nullptr);
371     }
372     return panda::JSValueRef::Undefined(vm);
373 }
374 
SetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)375 ArkUINativeModuleValue GridBridge::SetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
376 {
377     EcmaVM* vm = runtimeCallInfo->GetVM();
378     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
379     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
380     Local<JSValueRef> argCachedCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
381     Local<JSValueRef> argShow = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
382     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
383     auto* nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
384     auto value = DEFAULT_CACHED_COUNT;
385     if (!argCachedCount->IsUndefined()) {
386         ArkTSUtils::ParseJsInteger(vm, argCachedCount, value);
387         if (value < 0) {
388             value = DEFAULT_CACHED_COUNT;
389         }
390     }
391     GetArkUINodeModifiers()->getGridModifier()->setGridCachedCount(nativeNode, value);
392 
393     bool show = !argShow.IsNull() && argShow->IsTrue();
394     GetArkUINodeModifiers()->getGridModifier()->setShowCached(nativeNode, show);
395     return panda::JSValueRef::Undefined(vm);
396 }
397 
ResetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)398 ArkUINativeModuleValue GridBridge::ResetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
399 {
400     EcmaVM* vm = runtimeCallInfo->GetVM();
401     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
402     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
403     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
404     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
405     GetArkUINodeModifiers()->getGridModifier()->resetGridCachedCount(nativeNode);
406     GetArkUINodeModifiers()->getGridModifier()->resetShowCached(nativeNode);
407     return panda::JSValueRef::Undefined(vm);
408 }
409 
SetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)410 ArkUINativeModuleValue GridBridge::SetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
411 {
412     EcmaVM* vm = runtimeCallInfo->GetVM();
413     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
414     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
415     Local<JSValueRef> arg_editMode = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
416     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
417     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
418     bool editMode = arg_editMode->ToBoolean(vm)->Value();
419     GetArkUINodeModifiers()->getGridModifier()->setGridEditMode(nativeNode, editMode);
420     return panda::JSValueRef::Undefined(vm);
421 }
422 
ResetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)423 ArkUINativeModuleValue GridBridge::ResetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
424 {
425     EcmaVM* vm = runtimeCallInfo->GetVM();
426     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
427     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
428     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
429     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
430     GetArkUINodeModifiers()->getGridModifier()->resetGridEditMode(nativeNode);
431     return panda::JSValueRef::Undefined(vm);
432 }
433 
SetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)434 ArkUINativeModuleValue GridBridge::SetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
435 {
436     EcmaVM* vm = runtimeCallInfo->GetVM();
437     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
438     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
439     Local<JSValueRef> arg_multiSelectable = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
440     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
441     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
442     bool multiSelectable = arg_multiSelectable->ToBoolean(vm)->Value();
443     GetArkUINodeModifiers()->getGridModifier()->setGridMultiSelectable(nativeNode, multiSelectable);
444     return panda::JSValueRef::Undefined(vm);
445 }
446 
ResetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)447 ArkUINativeModuleValue GridBridge::ResetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
448 {
449     EcmaVM* vm = runtimeCallInfo->GetVM();
450     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
451     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
452     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
453     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
454     GetArkUINodeModifiers()->getGridModifier()->resetGridMultiSelectable(nativeNode);
455     return panda::JSValueRef::Undefined(vm);
456 }
457 
SetMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)458 ArkUINativeModuleValue GridBridge::SetMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
459 {
460     EcmaVM* vm = runtimeCallInfo->GetVM();
461     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
462     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
463     Local<JSValueRef> arg_maxCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
464     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
465     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
466     if (!arg_maxCount->IsNull() && arg_maxCount->IsNumber()) {
467         int32_t maxCount = arg_maxCount->Int32Value(vm);
468         if (maxCount < 1) {
469             GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
470         } else {
471             GetArkUINodeModifiers()->getGridModifier()->setGridMaxCount(nativeNode, maxCount);
472         }
473     } else {
474         GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
475     }
476     return panda::JSValueRef::Undefined(vm);
477 }
478 
ResetMaxCount(ArkUIRuntimeCallInfo * runtimeCallInfo)479 ArkUINativeModuleValue GridBridge::ResetMaxCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
480 {
481     EcmaVM* vm = runtimeCallInfo->GetVM();
482     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
483     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
484     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
485     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
486     GetArkUINodeModifiers()->getGridModifier()->resetGridMaxCount(nativeNode);
487     return panda::JSValueRef::Undefined(vm);
488 }
489 
SetMinCount(ArkUIRuntimeCallInfo * runtimeCallInfo)490 ArkUINativeModuleValue GridBridge::SetMinCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
491 {
492     EcmaVM* vm = runtimeCallInfo->GetVM();
493     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
494     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
495     Local<JSValueRef> arg_minCount = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
496     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
497     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
498     if (!arg_minCount->IsNull() && arg_minCount->IsNumber()) {
499         int32_t minCount = arg_minCount->Int32Value(vm);
500         if (minCount < 1) {
501             GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
502         } else {
503             GetArkUINodeModifiers()->getGridModifier()->setGridMinCount(nativeNode, minCount);
504         }
505     } else {
506         GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
507     }
508     return panda::JSValueRef::Undefined(vm);
509 }
510 
ResetMinCount(ArkUIRuntimeCallInfo * runtimeCallInfo)511 ArkUINativeModuleValue GridBridge::ResetMinCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
512 {
513     EcmaVM* vm = runtimeCallInfo->GetVM();
514     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
515     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
516     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
517     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
518     GetArkUINodeModifiers()->getGridModifier()->resetGridMinCount(nativeNode);
519     return panda::JSValueRef::Undefined(vm);
520 }
521 
SetCellLength(ArkUIRuntimeCallInfo * runtimeCallInfo)522 ArkUINativeModuleValue GridBridge::SetCellLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
523 {
524     EcmaVM* vm = runtimeCallInfo->GetVM();
525     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
526     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
527     Local<JSValueRef> arg_cellLength = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
528     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
529     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
530     if (!arg_cellLength->IsNull() && arg_cellLength->IsNumber()) {
531         int32_t cellLength = arg_cellLength->Int32Value(vm);
532         GetArkUINodeModifiers()->getGridModifier()->setGridCellLength(nativeNode, cellLength);
533     } else {
534         GetArkUINodeModifiers()->getGridModifier()->resetGridCellLength(nativeNode);
535     }
536     return panda::JSValueRef::Undefined(vm);
537 }
538 
ResetCellLength(ArkUIRuntimeCallInfo * runtimeCallInfo)539 ArkUINativeModuleValue GridBridge::ResetCellLength(ArkUIRuntimeCallInfo* runtimeCallInfo)
540 {
541     EcmaVM* vm = runtimeCallInfo->GetVM();
542     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
543     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
544     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
545     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
546     GetArkUINodeModifiers()->getGridModifier()->resetGridCellLength(nativeNode);
547     return panda::JSValueRef::Undefined(vm);
548 }
549 
SetLayoutDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)550 ArkUINativeModuleValue GridBridge::SetLayoutDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
551 {
552     EcmaVM* vm = runtimeCallInfo->GetVM();
553     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
554     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
555     Local<JSValueRef> arg_layoutDirection = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
556     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
557     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
558     if (!arg_layoutDirection->IsNull() && arg_layoutDirection->IsNumber()) {
559         int32_t layoutDirection = arg_layoutDirection->Int32Value(vm);
560         GetArkUINodeModifiers()->getGridModifier()->setGridLayoutDirection(nativeNode, layoutDirection);
561     } else {
562         GetArkUINodeModifiers()->getGridModifier()->resetGridLayoutDirection(nativeNode);
563     }
564     return panda::JSValueRef::Undefined(vm);
565 }
566 
ResetLayoutDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)567 ArkUINativeModuleValue GridBridge::ResetLayoutDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
568 {
569     EcmaVM* vm = runtimeCallInfo->GetVM();
570     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
571     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
572     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
573     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
574     GetArkUINodeModifiers()->getGridModifier()->resetGridLayoutDirection(nativeNode);
575     return panda::JSValueRef::Undefined(vm);
576 }
577 
SetSupportAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)578 ArkUINativeModuleValue GridBridge::SetSupportAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
579 {
580     EcmaVM* vm = runtimeCallInfo->GetVM();
581     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
582     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
583     Local<JSValueRef> arg_supportAnimation = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
584     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
585     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
586     bool supportAnimation = arg_supportAnimation->ToBoolean(vm)->Value();
587     GetArkUINodeModifiers()->getGridModifier()->setGridSupportAnimation(nativeNode, supportAnimation);
588     return panda::JSValueRef::Undefined(vm);
589 }
590 
ResetSupportAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue GridBridge::ResetSupportAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593     EcmaVM* vm = runtimeCallInfo->GetVM();
594     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
595     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
596     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
597     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
598     GetArkUINodeModifiers()->getGridModifier()->resetGridSupportAnimation(nativeNode);
599     return panda::JSValueRef::Undefined(vm);
600 }
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)601 ArkUINativeModuleValue GridBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
602 {
603     EcmaVM* vm = runtimeCallInfo->GetVM();
604     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
605     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
606     Local<JSValueRef> arg_forward = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
607     Local<JSValueRef> arg_backward = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
608 
609     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
610     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
611     int32_t forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
612     int32_t backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
613     if (!arg_forward->IsUndefined()) {
614         forward = arg_forward->Int32Value(vm);
615     }
616     if (!arg_backward->IsUndefined()) {
617         backward = arg_backward->Int32Value(vm);
618     }
619 
620     if (forward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
621         forward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
622         forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
623     }
624 
625     if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
626         backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
627         backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
628     }
629 
630     GetArkUINodeModifiers()->getGridModifier()->setNestedScroll(nativeNode, forward, backward);
631 
632     return panda::JSValueRef::Undefined(vm);
633 }
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)634 ArkUINativeModuleValue GridBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
635 {
636     EcmaVM* vm = runtimeCallInfo->GetVM();
637     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
638     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
639     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
640     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
641     GetArkUINodeModifiers()->getGridModifier()->resetNestedScroll(nativeNode);
642     return panda::JSValueRef::Undefined(vm);
643 }
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)644 ArkUINativeModuleValue GridBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
645 {
646     EcmaVM* vm = runtimeCallInfo->GetVM();
647     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
648     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
649     Local<JSValueRef> arg_enableScroll = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
650 
651     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
652     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
653 
654     GetArkUINodeModifiers()->getGridModifier()->setEnableScroll(
655         nativeNode, arg_enableScroll->IsBoolean() ? arg_enableScroll->ToBoolean(vm)->Value() : true);
656 
657     return panda::JSValueRef::Undefined(vm);
658 }
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)659 ArkUINativeModuleValue GridBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
660 {
661     EcmaVM* vm = runtimeCallInfo->GetVM();
662     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
663     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
664     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
665     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
666     GetArkUINodeModifiers()->getGridModifier()->resetEnableScroll(nativeNode);
667     return panda::JSValueRef::Undefined(vm);
668 }
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue GridBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
670 {
671     EcmaVM* vm = runtimeCallInfo->GetVM();
672     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
673     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
674     Local<JSValueRef> arg_friction = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
675 
676     double friction = -1.0;
677     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
678     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
679     RefPtr<ResourceObject> resObj;
680     if (!ArkTSUtils::ParseJsDouble(vm, arg_friction, friction, resObj)) {
681         friction = -1.0;
682     }
683     if (SystemProperties::ConfigChangePerform()) {
684         GetArkUINodeModifiers()->getGridModifier()->createWithResourceObjFriction(
685             nativeNode, reinterpret_cast<void*>(AceType::RawPtr(resObj)));
686     }
687     GetArkUINodeModifiers()->getGridModifier()->setFriction(nativeNode, static_cast<ArkUI_Float32>(friction));
688 
689     return panda::JSValueRef::Undefined(vm);
690 }
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)691 ArkUINativeModuleValue GridBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
692 {
693     EcmaVM* vm = runtimeCallInfo->GetVM();
694     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
695     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
696     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
697     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
698     GetArkUINodeModifiers()->getGridModifier()->resetFriction(nativeNode);
699     if (SystemProperties::ConfigChangePerform()) {
700         GetArkUINodeModifiers()->getGridModifier()->createWithResourceObjFriction(nativeNode, nullptr);
701     }
702     return panda::JSValueRef::Undefined(vm);
703 }
SetFocusWrapMode(ArkUIRuntimeCallInfo * runtimeCallInfo)704 ArkUINativeModuleValue GridBridge::SetFocusWrapMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
705 {
706     EcmaVM* vm = runtimeCallInfo->GetVM();
707     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
708     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
709     Local<JSValueRef> arg_focusWrapMode = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
710     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
711     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
712     if (!arg_focusWrapMode->IsNull() && arg_focusWrapMode->IsNumber()) {
713         int32_t focusWrapMode = arg_focusWrapMode->Int32Value(vm);
714         if (focusWrapMode < 0 || focusWrapMode > 1) {
715             GetArkUINodeModifiers()->getGridModifier()->resetGridFocusWrapMode(nativeNode);
716         } else {
717             GetArkUINodeModifiers()->getGridModifier()->setGridFocusWrapMode(nativeNode, focusWrapMode);
718         }
719     } else {
720         GetArkUINodeModifiers()->getGridModifier()->resetGridFocusWrapMode(nativeNode);
721     }
722     return panda::JSValueRef::Undefined(vm);
723 }
ResetFocusWrapMode(ArkUIRuntimeCallInfo * runtimeCallInfo)724 ArkUINativeModuleValue GridBridge::ResetFocusWrapMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
725 {
726     EcmaVM* vm = runtimeCallInfo->GetVM();
727     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
728     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
729     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
730     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
731     GetArkUINodeModifiers()->getGridModifier()->resetGridFocusWrapMode(nativeNode);
732     return panda::JSValueRef::Undefined(vm);
733 }
SetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)734 ArkUINativeModuleValue GridBridge::SetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
735 {
736     EcmaVM* vm = runtimeCallInfo->GetVM();
737     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
738     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
739     Local<JSValueRef> arg_alignItems = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
740 
741     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
742     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
743     int32_t itemAlignment = static_cast<int32_t>(GridItemAlignment::DEFAULT);
744     if (!arg_alignItems->IsUndefined() && !arg_alignItems->IsNull()) {
745         itemAlignment = arg_alignItems->Int32Value(vm);
746     }
747 
748     if (itemAlignment != static_cast<int32_t>(GridItemAlignment::DEFAULT) &&
749         itemAlignment != static_cast<int32_t>(GridItemAlignment::STRETCH)) {
750         itemAlignment = static_cast<int32_t>(GridItemAlignment::DEFAULT);
751     }
752 
753     GetArkUINodeModifiers()->getGridModifier()->setGridAlignItems(nativeNode, itemAlignment);
754     return panda::JSValueRef::Undefined(vm);
755 }
ResetAlignItems(ArkUIRuntimeCallInfo * runtimeCallInfo)756 ArkUINativeModuleValue GridBridge::ResetAlignItems(ArkUIRuntimeCallInfo* runtimeCallInfo)
757 {
758     EcmaVM* vm = runtimeCallInfo->GetVM();
759     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
760     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
761     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
762     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
763     GetArkUINodeModifiers()->getGridModifier()->resetGridAlignItems(nativeNode);
764     return panda::JSValueRef::Undefined(vm);
765 }
766 
SetSyncLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)767 ArkUINativeModuleValue GridBridge::SetSyncLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
768 {
769     EcmaVM* vm = runtimeCallInfo->GetVM();
770     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
771     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
772     Local<JSValueRef> argSyncLoad = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
773 
774     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
775     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
776     bool syncLoad = true;
777     if (!argSyncLoad->IsUndefined() && !argSyncLoad->IsNull()) {
778         syncLoad = argSyncLoad->BooleaValue(vm);
779     }
780 
781     GetArkUINodeModifiers()->getGridModifier()->setSyncLoad(nativeNode, syncLoad);
782     return panda::JSValueRef::Undefined(vm);
783 }
784 
ResetSyncLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)785 ArkUINativeModuleValue GridBridge::ResetSyncLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
786 {
787     EcmaVM* vm = runtimeCallInfo->GetVM();
788     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
789     Local<JSValueRef> node = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
790     CHECK_NULL_RETURN(node->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
791     auto nativeNode = nodePtr(node->ToNativePointer(vm)->Value());
792     GetArkUINodeModifiers()->getGridModifier()->resetSyncLoad(nativeNode);
793     return panda::JSValueRef::Undefined(vm);
794 }
795 
SetGridScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)796 ArkUINativeModuleValue GridBridge::SetGridScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
797 {
798     EcmaVM* vm = runtimeCallInfo->GetVM();
799     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
800     Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
801     Local<JSValueRef> scrollerVal = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
802     RefPtr<ScrollControllerBase> positionController;
803     RefPtr<ScrollProxy> scrollBarProxy;
804     CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
805     auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
806     if (scrollerVal->IsObject(vm)) {
807         auto* jsScroller = Framework::JSRef<Framework::JSObject>(Framework::JSObject(scrollerVal->ToObject(vm)))
808                                ->Unwrap<Framework::JSScroller>();
809         if (jsScroller) {
810             jsScroller->SetInstanceId(Container::CurrentIdSafely());
811             positionController = AceType::MakeRefPtr<ScrollableController>();
812             jsScroller->SetController(positionController);
813             scrollBarProxy = jsScroller->GetScrollBarProxy();
814             if (!scrollBarProxy) {
815                 scrollBarProxy = AceType::MakeRefPtr<NG::ScrollBarProxy>();
816                 jsScroller->SetScrollBarProxy(scrollBarProxy);
817             }
818         }
819     }
820     GridModelNG::InitScroller(reinterpret_cast<FrameNode*>(nativeNode), positionController, scrollBarProxy);
821     return panda::JSValueRef::Undefined(vm);
822 }
823 
SetGridLayoutOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)824 ArkUINativeModuleValue GridBridge::SetGridLayoutOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
825 {
826     EcmaVM* vm = runtimeCallInfo->GetVM();
827     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
828     Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(0);
829     Local<JSValueRef> irregularIndexesVal = runtimeCallInfo->GetCallArgRef(2); // 2: parameter index
830     Local<JSValueRef> indexesLengthVal = runtimeCallInfo->GetCallArgRef(3); // 3: parameter index
831     CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
832     auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
833     int32_t length = 0;
834     if (indexesLengthVal->IsNumber()) {
835         length = indexesLengthVal->Int32Value(vm);
836     }
837     auto irregularIndexes = std::make_unique<int32_t[]>(length);
838     bool irregularResult = ArkTSUtils::ParseArray<int32_t>(vm, irregularIndexesVal, irregularIndexes.get(), length,
839         [](const EcmaVM* vm, const Local<JSValueRef>& jsValue) {
840             bool isNumber = false;
841             return jsValue->GetValueInt32(isNumber);
842         });
843 
844     GridLayoutOptions options;
845     // only support regularSize(1, 1)
846     options.regularSize.rows = 1;
847     options.regularSize.columns = 1;
848     if (irregularResult) {
849         for (int32_t i = 0; i < length; i++) {
850             options.irregularIndexes.emplace(irregularIndexes[i]);
851         }
852     }
853     irregularIndexes.reset();
854     ParseGetGridItemSize(vm, runtimeCallInfo->GetCallArgRef(4), options); // 4: parameter index
855     ParseGetGridItemRect(vm, runtimeCallInfo->GetCallArgRef(5), options); // 5: parameter index
856     GridModelNG::SetLayoutOptions(reinterpret_cast<FrameNode*>(nativeNode), options);
857     return panda::JSValueRef::Undefined(vm);
858 }
859 
SetOnGridScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)860 ArkUINativeModuleValue GridBridge::SetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
861 {
862     EcmaVM* vm = runtimeCallInfo->GetVM();
863     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
864     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
865     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
866     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
867     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
868     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
869         GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollIndex(nativeNode);
870         return panda::JSValueRef::Undefined(vm);
871     }
872     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
873     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
874     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
875 
876     std::function<void(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
877                                                          const int32_t first, const int32_t last) {
878         panda::LocalScope pandaScope(vm);
879         panda::TryCatch trycatch(vm);
880         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
881 
882         panda::Local<panda::NumberRef> firstParam = panda::NumberRef::New(vm, first);
883         panda::Local<panda::NumberRef> lastParam = panda::NumberRef::New(vm, last);
884         // 2: Array length
885         panda::Local<panda::JSValueRef> params[2] = { firstParam, lastParam };
886         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
887     };
888     GetArkUINodeModifiers()->getGridModifier()->setOnGridScrollIndexCallBack(
889         nativeNode, reinterpret_cast<void*>(&callback));
890     return panda::JSValueRef::Undefined(vm);
891 }
892 
ResetOnGridScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)893 ArkUINativeModuleValue GridBridge::ResetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
894 {
895     EcmaVM* vm = runtimeCallInfo->GetVM();
896     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
897     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
898     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
899     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
900     GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollIndex(nativeNode);
901     return panda::JSValueRef::Undefined(vm);
902 }
903 
SetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)904 ArkUINativeModuleValue GridBridge::SetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
905 {
906     EcmaVM* vm = runtimeCallInfo->GetVM();
907     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
908     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
909     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
910     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
911     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
912     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
913         GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollBarUpdate(nativeNode);
914         return panda::JSValueRef::Undefined(vm);
915     }
916     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
917     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
918     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
919 
920     std::function<std::pair<std::optional<float>, std::optional<float>>(int32_t, Dimension)> callback =
921         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const int32_t index, const Dimension& offset) {
922             panda::LocalScope pandaScope(vm);
923             panda::TryCatch trycatch(vm);
924             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
925 
926             panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
927             panda::Local<panda::NumberRef> offsetParam =
928                 panda::NumberRef::New(vm, static_cast<double>(offset.ConvertToVp()));
929 
930             // 2: Array length
931             panda::Local<panda::JSValueRef> params[2] = { indexParam, offsetParam };
932             auto result = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
933             if (result->IsObject(vm)) {
934                 auto resultObj = result->ToObject(vm);
935                 panda::Local<panda::JSValueRef> offset =
936                     resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "totalOffset"));
937                 panda::Local<panda::JSValueRef> length =
938                     resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "totalLength"));
939                 CalcDimension totalOffset_;
940                 CalcDimension totalLength_;
941                 if (ArkTSUtils::ParseJsDimensionVp(vm, offset, totalOffset_) &&
942                     ArkTSUtils::ParseJsDimensionVp(vm, length, totalLength_)) {
943                     return std::pair<float, float>(totalOffset_.ConvertToPx(), totalLength_.ConvertToPx());
944                 }
945             }
946             return std::pair<float, float>(0, 0);
947         };
948     GetArkUINodeModifiers()->getGridModifier()->setOnGridScrollBarUpdateCallBack(
949         nativeNode, reinterpret_cast<void*>(&callback));
950     return panda::JSValueRef::Undefined(vm);
951 }
952 
ResetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)953 ArkUINativeModuleValue GridBridge::ResetOnGridScrollBarUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
954 {
955     EcmaVM* vm = runtimeCallInfo->GetVM();
956     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
957     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
958     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
959     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
960     GetArkUINodeModifiers()->getGridModifier()->resetOnGridScrollBarUpdate(nativeNode);
961     return panda::JSValueRef::Undefined(vm);
962 }
963 
SetOnGridItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)964 ArkUINativeModuleValue GridBridge::SetOnGridItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
965 {
966     EcmaVM* vm = runtimeCallInfo->GetVM();
967     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
968     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
969     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
970     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
971     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
972     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
973 
974     JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
975     if (!info[1]->IsFunction()) {
976         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragStart(nativeNode);
977         return panda::JSValueRef::Undefined(vm);
978     }
979 
980     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
981     std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
982                                                                      execCtx = info.GetExecutionContext()](
983                                                                      const ItemDragInfo& dragInfo, int32_t itemIndex) {
984         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
985         panda::LocalScope pandaScope(vm);
986         panda::TryCatch trycatch(vm);
987 
988         auto ret = func->ItemDragStartExecute(dragInfo, itemIndex);
989         if (!ret->IsFunction()) {
990             return;
991         }
992 
993         auto builderFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(ret));
994         if (!builderFunc) {
995             return;
996         }
997 
998         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
999         builderFunc->Execute();
1000     };
1001     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragStart(nativeNode, reinterpret_cast<void*>(&callback));
1002     return panda::JSValueRef::Undefined(vm);
1003 }
1004 
ResetOnGridItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1005 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1006 {
1007     EcmaVM* vm = runtimeCallInfo->GetVM();
1008     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1009     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1010     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1011     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1012     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragStart(nativeNode);
1013     return panda::JSValueRef::Undefined(vm);
1014 }
1015 
SetOnGridItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1016 ArkUINativeModuleValue GridBridge::SetOnGridItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1017 {
1018     EcmaVM* vm = runtimeCallInfo->GetVM();
1019     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1020     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1021     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1022     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1023     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1024     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1025 
1026     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1027     if (!info[1]->IsFunction()) {
1028         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragEnter(nativeNode);
1029         return panda::JSValueRef::Undefined(vm);
1030     }
1031     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1032 
1033     std::function<void(const ItemDragInfo&)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1034                                                             execCtx = info.GetExecutionContext()](
1035                                                             const ItemDragInfo& dragInfo) {
1036         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1037         panda::LocalScope pandaScope(vm);
1038         panda::TryCatch trycatch(vm);
1039 
1040         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1041         func->ItemDragEnterExecute(dragInfo);
1042     };
1043     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragEnter(nativeNode, reinterpret_cast<void*>(&callback));
1044     return panda::JSValueRef::Undefined(vm);
1045 }
1046 
ResetOnGridItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1047 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1048 {
1049     EcmaVM* vm = runtimeCallInfo->GetVM();
1050     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1051     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1052     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1053     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1054     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragEnter(nativeNode);
1055     return panda::JSValueRef::Undefined(vm);
1056 }
1057 
SetOnGridItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1058 ArkUINativeModuleValue GridBridge::SetOnGridItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1059 {
1060     EcmaVM* vm = runtimeCallInfo->GetVM();
1061     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1062     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1063     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1064     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1065     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1066     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1067 
1068     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1069     if (!info[1]->IsFunction()) {
1070         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragMove(nativeNode);
1071         return panda::JSValueRef::Undefined(vm);
1072     }
1073     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1074 
1075     std::function<void(const ItemDragInfo&, int32_t, int32_t)> callback =
1076         [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1077             const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) {
1078             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1079             panda::LocalScope pandaScope(vm);
1080             panda::TryCatch trycatch(vm);
1081 
1082             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1083             func->ItemDragMoveExecute(dragInfo, itemIndex, insertIndex);
1084         };
1085     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragMove(nativeNode, reinterpret_cast<void*>(&callback));
1086     return panda::JSValueRef::Undefined(vm);
1087 }
1088 
ResetOnGridItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1089 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1090 {
1091     EcmaVM* vm = runtimeCallInfo->GetVM();
1092     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1093     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1094     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1095     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1096     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragMove(nativeNode);
1097     return panda::JSValueRef::Undefined(vm);
1098 }
1099 
SetOnGridItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1100 ArkUINativeModuleValue GridBridge::SetOnGridItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1101 {
1102     EcmaVM* vm = runtimeCallInfo->GetVM();
1103     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1104     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1105     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1106     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1107     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1108     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1109 
1110     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1111     if (!info[1]->IsFunction()) {
1112         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragLeave(nativeNode);
1113         return panda::JSValueRef::Undefined(vm);
1114     }
1115     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1116 
1117     std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1118                                                                      execCtx = info.GetExecutionContext()](
1119                                                                      const ItemDragInfo& dragInfo, int32_t itemIndex) {
1120         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1121         panda::LocalScope pandaScope(vm);
1122         panda::TryCatch trycatch(vm);
1123 
1124         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1125         func->ItemDragLeaveExecute(dragInfo, itemIndex);
1126     };
1127     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDragLeave(nativeNode, reinterpret_cast<void*>(&callback));
1128     return panda::JSValueRef::Undefined(vm);
1129 }
1130 
ResetOnGridItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1131 ArkUINativeModuleValue GridBridge::ResetOnGridItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1132 {
1133     EcmaVM* vm = runtimeCallInfo->GetVM();
1134     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1135     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1136     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1137     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1138     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDragLeave(nativeNode);
1139     return panda::JSValueRef::Undefined(vm);
1140 }
1141 
SetOnGridItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1142 ArkUINativeModuleValue GridBridge::SetOnGridItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1143 {
1144     EcmaVM* vm = runtimeCallInfo->GetVM();
1145     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1146     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1147     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1148     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1149     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1150     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1151 
1152     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1153     if (!info[1]->IsFunction()) {
1154         GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDrop(nativeNode);
1155         return panda::JSValueRef::Undefined(vm);
1156     }
1157     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1158 
1159     std::function<void(const ItemDragInfo&, int32_t, int32_t, bool)> callback =
1160         [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1161             const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) {
1162             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1163             panda::LocalScope pandaScope(vm);
1164             panda::TryCatch trycatch(vm);
1165 
1166             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1167             func->ItemDropExecute(dragInfo, itemIndex, insertIndex, isSuccess);
1168         };
1169     GetArkUINodeModifiers()->getGridModifier()->setOnGridItemDrop(nativeNode, reinterpret_cast<void*>(&callback));
1170     return panda::JSValueRef::Undefined(vm);
1171 }
1172 
ResetOnGridItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1173 ArkUINativeModuleValue GridBridge::ResetOnGridItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1174 {
1175     EcmaVM* vm = runtimeCallInfo->GetVM();
1176     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1177     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1178     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1179     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1180     GetArkUINodeModifiers()->getGridModifier()->resetOnGridItemDrop(nativeNode);
1181     return panda::JSValueRef::Undefined(vm);
1182 }
1183 } // namespace OHOS::Ace::NG
1184