• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_list_bridge.h"
16 
17 #include "core/interfaces/native/node/node_api.h"
18 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "frameworks/bridge/declarative_frontend/jsview/js_list.h"
20 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
21 #include "frameworks/core/components/list/list_theme.h"
22 #include "frameworks/core/components_ng/pattern/list/list_model.h"
23 #include "frameworks/core/components_ng/pattern/list/list_model_ng.h"
24 #include "frameworks/core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
25 #include "frameworks/core/components_ng/base/view_stack_model.h"
26 using namespace OHOS::Ace::Framework;
27 
28 namespace OHOS::Ace::NG {
29 constexpr int32_t LIST_ARG_INDEX_0 = 0;
30 constexpr int32_t LIST_ARG_INDEX_1 = 1;
31 constexpr int32_t LIST_ARG_INDEX_2 = 2;
32 constexpr int32_t LIST_ARG_INDEX_3 = 3;
33 constexpr int32_t LIST_ARG_INDEX_4 = 4;
34 constexpr int32_t LIST_ARG_INDEX_5 = 5;
35 constexpr int32_t LIST_ARG_INDEX_6 = 6;
36 constexpr int32_t LIST_ARG_INDEX_7 = 7;
37 constexpr int32_t DEFAULT_CACHED_COUNT = 1;
38 
39 constexpr int32_t ARG_LENGTH = 3;
40 
SetListLanes(ArkUIRuntimeCallInfo * runtimeCallInfo)41 ArkUINativeModuleValue ListBridge::SetListLanes(ArkUIRuntimeCallInfo* runtimeCallInfo)
42 {
43     EcmaVM* vm = runtimeCallInfo->GetVM();
44     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
45     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0); // 0: index of parameter frameNode
46     Local<JSValueRef> laneNumArg = runtimeCallInfo->GetCallArgRef(1);   // 1: index of parameter laneNum
47     Local<JSValueRef> minLengthArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of parameter minLength
48     Local<JSValueRef> maxLengthArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of parameter maxLength
49     Local<JSValueRef> gutterArg = runtimeCallInfo->GetCallArgRef(4);    // 4: index of parameter gutter
50     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
51     ArkUIDimensionType gutterType;
52     ArkUIDimensionType minLengthType;
53     ArkUIDimensionType maxLengthType;
54 
55     CalcDimension gutter = Dimension(0.0);
56     int32_t laneNum = 1;
57     CalcDimension minLength = -1.0_vp;
58     CalcDimension maxLength = -1.0_vp;
59     if (!gutterArg->IsUndefined() && ArkTSUtils::ParseJsDimensionVp(vm, gutterArg, gutter)) {
60         if (gutter.IsNegative()) {
61             gutter.Reset();
62         }
63         gutterType.value = gutter.Value();
64         gutterType.units = static_cast<int32_t>(gutter.Unit());
65     }
66     if (!laneNumArg->IsUndefined() && ArkTSUtils::ParseJsInteger(vm, laneNumArg, laneNum)) {
67         minLengthType.value = minLength.Value();
68         minLengthType.units = static_cast<int32_t>(minLength.Unit());
69         maxLengthType.value = maxLength.Value();
70         maxLengthType.units = static_cast<int32_t>(maxLength.Unit());
71     }
72     if (!minLengthArg->IsUndefined() && !maxLengthArg->IsUndefined() &&
73         ArkTSUtils::ParseJsDimensionVp(vm, minLengthArg, minLength) &&
74         ArkTSUtils::ParseJsDimensionVp(vm, maxLengthArg, maxLength)) {
75         laneNum = -1;
76         minLengthType.value = minLength.Value();
77         minLengthType.units = static_cast<int32_t>(minLength.Unit());
78         maxLengthType.value = maxLength.Value();
79         maxLengthType.units = static_cast<int32_t>(maxLength.Unit());
80     }
81     GetArkUINodeModifiers()->getListModifier()->setListLanes(
82         nativeNode, laneNum, &minLengthType, &maxLengthType, &gutterType);
83     return panda::JSValueRef::Undefined(vm);
84 }
85 
ResetListLanes(ArkUIRuntimeCallInfo * runtimeCallInfo)86 ArkUINativeModuleValue ListBridge::ResetListLanes(ArkUIRuntimeCallInfo* runtimeCallInfo)
87 {
88     EcmaVM* vm = runtimeCallInfo->GetVM();
89     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
90     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
91     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
92     GetArkUINodeModifiers()->getListModifier()->resetListLanes(nativeNode);
93 
94     return panda::JSValueRef::Undefined(vm);
95 }
SetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue ListBridge::SetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
97 {
98     EcmaVM* vm = runtimeCallInfo->GetVM();
99     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
100     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
101     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
102     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
103     if (secondArg->IsUndefined()) {
104         GetArkUINodeModifiers()->getListModifier()->resetEditMode(nativeNode);
105     } else {
106         bool editMode = secondArg->ToBoolean(vm)->Value();
107         GetArkUINodeModifiers()->getListModifier()->setEditMode(nativeNode, editMode);
108     }
109 
110     return panda::JSValueRef::Undefined(vm);
111 }
112 
ResetEditMode(ArkUIRuntimeCallInfo * runtimeCallInfo)113 ArkUINativeModuleValue ListBridge::ResetEditMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
114 {
115     EcmaVM* vm = runtimeCallInfo->GetVM();
116     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
117     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
118     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
119     GetArkUINodeModifiers()->getListModifier()->resetEditMode(nativeNode);
120 
121     return panda::JSValueRef::Undefined(vm);
122 }
123 
SetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)124 ArkUINativeModuleValue ListBridge::SetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
125 {
126     EcmaVM* vm = runtimeCallInfo->GetVM();
127     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
128     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
129     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
130     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
131     if (secondArg->IsUndefined()) {
132         GetArkUINodeModifiers()->getListModifier()->resetMultiSelectable(nativeNode);
133     } else {
134         bool selectable = secondArg->ToBoolean(vm)->Value();
135         GetArkUINodeModifiers()->getListModifier()->setMultiSelectable(nativeNode, selectable);
136     }
137 
138     return panda::JSValueRef::Undefined(vm);
139 }
140 
ResetMultiSelectable(ArkUIRuntimeCallInfo * runtimeCallInfo)141 ArkUINativeModuleValue ListBridge::ResetMultiSelectable(ArkUIRuntimeCallInfo* runtimeCallInfo)
142 {
143     EcmaVM* vm = runtimeCallInfo->GetVM();
144     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
145     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
146     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
147     GetArkUINodeModifiers()->getListModifier()->resetMultiSelectable(nativeNode);
148 
149     return panda::JSValueRef::Undefined(vm);
150 }
151 
SetChainAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)152 ArkUINativeModuleValue ListBridge::SetChainAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
153 {
154     EcmaVM* vm = runtimeCallInfo->GetVM();
155     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
156     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
157     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
158     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
159     bool chainAnimation = secondArg->ToBoolean(vm)->Value();
160     GetArkUINodeModifiers()->getListModifier()->setChainAnimation(nativeNode, chainAnimation);
161 
162     return panda::JSValueRef::Undefined(vm);
163 }
164 
ResetChainAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)165 ArkUINativeModuleValue ListBridge::ResetChainAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
166 {
167     EcmaVM* vm = runtimeCallInfo->GetVM();
168     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
169     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
170     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
171     GetArkUINodeModifiers()->getListModifier()->resetChainAnimation(nativeNode);
172 
173     return panda::JSValueRef::Undefined(vm);
174 }
175 
SetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)176 ArkUINativeModuleValue ListBridge::SetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
177 {
178     EcmaVM* vm = runtimeCallInfo->GetVM();
179     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
180     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
181     Local<JSValueRef> cacheCountArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
182     Local<JSValueRef> cacheShowArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
183 
184     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
185 
186     auto cacheCount = DEFAULT_CACHED_COUNT;
187     if (!cacheCountArg->IsUndefined()) {
188         ArkTSUtils::ParseJsInteger(vm, cacheCountArg, cacheCount);
189         if (cacheCount < 0) {
190             cacheCount = DEFAULT_CACHED_COUNT;
191         }
192     }
193     GetArkUINodeModifiers()->getListModifier()->setCachedCount(nativeNode, cacheCount);
194 
195     bool show = !cacheShowArg.IsNull() && cacheShowArg->IsTrue();
196     GetArkUINodeModifiers()->getListModifier()->setShowCached(nativeNode, show);
197 
198     return panda::JSValueRef::Undefined(vm);
199 }
200 
ResetCachedCount(ArkUIRuntimeCallInfo * runtimeCallInfo)201 ArkUINativeModuleValue ListBridge::ResetCachedCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
202 {
203     EcmaVM* vm = runtimeCallInfo->GetVM();
204     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
205     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
206     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
207     GetArkUINodeModifiers()->getListModifier()->resetCachedCount(nativeNode);
208     GetArkUINodeModifiers()->getListModifier()->resetShowCached(nativeNode);
209 
210     return panda::JSValueRef::Undefined(vm);
211 }
212 
SetEnableScrollInteraction(ArkUIRuntimeCallInfo * runtimeCallInfo)213 ArkUINativeModuleValue ListBridge::SetEnableScrollInteraction(ArkUIRuntimeCallInfo* runtimeCallInfo)
214 {
215     EcmaVM* vm = runtimeCallInfo->GetVM();
216     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
217     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
218     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
219     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
220     if (secondArg->IsBoolean()) {
221         bool enableScrollInteraction = secondArg->ToBoolean(vm)->Value();
222         GetArkUINodeModifiers()->getListModifier()->setEnableScrollInteraction(nativeNode, enableScrollInteraction);
223     } else {
224         GetArkUINodeModifiers()->getListModifier()->resetEnableScrollInteraction(nativeNode);
225     }
226 
227     return panda::JSValueRef::Undefined(vm);
228 }
229 
ResetEnableScrollInteraction(ArkUIRuntimeCallInfo * runtimeCallInfo)230 ArkUINativeModuleValue ListBridge::ResetEnableScrollInteraction(ArkUIRuntimeCallInfo* runtimeCallInfo)
231 {
232     EcmaVM* vm = runtimeCallInfo->GetVM();
233     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
234     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
235     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
236     GetArkUINodeModifiers()->getListModifier()->resetEnableScrollInteraction(nativeNode);
237 
238     return panda::JSValueRef::Undefined(vm);
239 }
240 
SetSticky(ArkUIRuntimeCallInfo * runtimeCallInfo)241 ArkUINativeModuleValue ListBridge::SetSticky(ArkUIRuntimeCallInfo* runtimeCallInfo)
242 {
243     EcmaVM* vm = runtimeCallInfo->GetVM();
244     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
245     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
246     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
247     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
248     if (secondArg->IsUndefined()) {
249         GetArkUINodeModifiers()->getListModifier()->resetSticky(nativeNode);
250     } else {
251         int32_t stickyStyle = secondArg->ToNumber(vm)->Value();
252         GetArkUINodeModifiers()->getListModifier()->setSticky(nativeNode, stickyStyle);
253     }
254 
255     return panda::JSValueRef::Undefined(vm);
256 }
257 
ResetSticky(ArkUIRuntimeCallInfo * runtimeCallInfo)258 ArkUINativeModuleValue ListBridge::ResetSticky(ArkUIRuntimeCallInfo* runtimeCallInfo)
259 {
260     EcmaVM* vm = runtimeCallInfo->GetVM();
261     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
262     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
263     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
264     GetArkUINodeModifiers()->getListModifier()->resetSticky(nativeNode);
265 
266     return panda::JSValueRef::Undefined(vm);
267 }
268 
SetListDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)269 ArkUINativeModuleValue ListBridge::SetListDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
270 {
271     EcmaVM* vm = runtimeCallInfo->GetVM();
272     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
273     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
274     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
275     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
276     if (secondArg->IsUndefined()) {
277         GetArkUINodeModifiers()->getListModifier()->resetListDirection(nativeNode);
278     } else {
279         int32_t direction = secondArg->ToNumber(vm)->Value();
280         GetArkUINodeModifiers()->getListModifier()->setListDirection(nativeNode, direction);
281     }
282 
283     return panda::JSValueRef::Undefined(vm);
284 }
ResetListDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)285 ArkUINativeModuleValue ListBridge::ResetListDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
286 {
287     EcmaVM* vm = runtimeCallInfo->GetVM();
288     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
289     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
290     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
291     GetArkUINodeModifiers()->getListModifier()->resetListDirection(nativeNode);
292 
293     return panda::JSValueRef::Undefined(vm);
294 }
295 
SetListFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)296 ArkUINativeModuleValue ListBridge::SetListFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
297 {
298     EcmaVM* vm = runtimeCallInfo->GetVM();
299     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
300     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
301     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
302 
303     double friction = -1.0;
304     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
305     if (secondArg->IsUndefined() || secondArg->IsNull() || !ArkTSUtils::ParseJsDouble(vm, secondArg, friction)) {
306         friction = -1.0;
307     }
308     GetArkUINodeModifiers()->getListModifier()->setListFriction(nativeNode, friction);
309     return panda::JSValueRef::Undefined(vm);
310 }
311 
ResetListFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)312 ArkUINativeModuleValue ListBridge::ResetListFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
313 {
314     EcmaVM* vm = runtimeCallInfo->GetVM();
315     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
316     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
317     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
318     GetArkUINodeModifiers()->getListModifier()->resetListFriction(nativeNode);
319     return panda::JSValueRef::Undefined(vm);
320 }
321 
SetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)322 ArkUINativeModuleValue ListBridge::SetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
323 {
324     EcmaVM* vm = runtimeCallInfo->GetVM();
325     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
326     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
327     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
328     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
329 
330     if (secondArg->IsBoolean()) {
331         bool enabled = secondArg->ToBoolean(vm)->Value();
332         GetArkUINodeModifiers()->getListModifier()->setListMaintainVisibleContentPosition(nativeNode, enabled);
333     } else {
334         GetArkUINodeModifiers()->getListModifier()->resetListMaintainVisibleContentPosition(nativeNode);
335     }
336 
337     return panda::JSValueRef::Undefined(vm);
338 }
339 
ResetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)340 ArkUINativeModuleValue ListBridge::ResetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
341 {
342     EcmaVM* vm = runtimeCallInfo->GetVM();
343     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
344     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
345     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
346     GetArkUINodeModifiers()->getListModifier()->resetListMaintainVisibleContentPosition(nativeNode);
347     return panda::JSValueRef::Undefined(vm);
348 }
349 
SetListStackFromEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)350 ArkUINativeModuleValue ListBridge::SetListStackFromEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
351 {
352     EcmaVM* vm = runtimeCallInfo->GetVM();
353     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
354     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
355     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
356     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
357 
358     if (secondArg->IsBoolean()) {
359         bool enabled = secondArg->ToBoolean(vm)->Value();
360         GetArkUINodeModifiers()->getListModifier()->setListStackFromEnd(nativeNode, enabled);
361     } else {
362         GetArkUINodeModifiers()->getListModifier()->resetListStackFromEnd(nativeNode);
363     }
364 
365     return panda::JSValueRef::Undefined(vm);
366 }
367 
ResetListStackFromEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)368 ArkUINativeModuleValue ListBridge::ResetListStackFromEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
369 {
370     EcmaVM* vm = runtimeCallInfo->GetVM();
371     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
372     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
373     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
374     GetArkUINodeModifiers()->getListModifier()->resetListStackFromEnd(nativeNode);
375     return panda::JSValueRef::Undefined(vm);
376 }
377 
SetListNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)378 ArkUINativeModuleValue ListBridge::SetListNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
379 {
380     EcmaVM* vm = runtimeCallInfo->GetVM();
381     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
382     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
383     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
384     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
385 
386     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
387     int32_t forward = 0;
388     int32_t backward = 0;
389     if (!secondArg->IsUndefined()) {
390         forward = secondArg->Int32Value(vm);
391     }
392     if (!thirdArg->IsUndefined()) {
393         backward = thirdArg->Int32Value(vm);
394     }
395 
396     if (forward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
397         forward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
398         forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
399     }
400 
401     if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
402         backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
403         backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
404     }
405 
406     GetArkUINodeModifiers()->getListModifier()->setListNestedScroll(nativeNode, forward, backward);
407 
408     return panda::JSValueRef::Undefined(vm);
409 }
410 
ResetListNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)411 ArkUINativeModuleValue ListBridge::ResetListNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
412 {
413     EcmaVM* vm = runtimeCallInfo->GetVM();
414     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
415     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
416     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
417     GetArkUINodeModifiers()->getListModifier()->resetListNestedScroll(nativeNode);
418     return panda::JSValueRef::Undefined(vm);
419 }
420 
SetListScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)421 ArkUINativeModuleValue ListBridge::SetListScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
422 {
423     EcmaVM* vm = runtimeCallInfo->GetVM();
424     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
425     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
426     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
427     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
428     if (secondArg->IsUndefined()) {
429         GetArkUINodeModifiers()->getListModifier()->resetListScrollBar(nativeNode);
430     } else {
431         int32_t barState = secondArg->ToNumber(vm)->Value();
432         GetArkUINodeModifiers()->getListModifier()->setListScrollBar(nativeNode, barState);
433     }
434 
435     return panda::JSValueRef::Undefined(vm);
436 }
437 
ResetListScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)438 ArkUINativeModuleValue ListBridge::ResetListScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
439 {
440     EcmaVM* vm = runtimeCallInfo->GetVM();
441     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
442     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
443     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
444     GetArkUINodeModifiers()->getListModifier()->resetListScrollBar(nativeNode);
445 
446     return panda::JSValueRef::Undefined(vm);
447 }
448 
SetListScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)449 ArkUINativeModuleValue ListBridge::SetListScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
450 {
451     EcmaVM* vm = runtimeCallInfo->GetVM();
452     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
453     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
454     Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
455     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
456 
457     CalcDimension scrollBarWidth;
458     if (!ArkTSUtils::ParseJsDimension(vm, scrollBarArg, scrollBarWidth, DimensionUnit::VP) || scrollBarArg->IsNull() ||
459         scrollBarArg->IsUndefined() || (scrollBarArg->IsString(vm) && scrollBarWidth.ToString().empty()) ||
460         LessNotEqual(scrollBarWidth.Value(), 0.0) || scrollBarWidth.Unit() == DimensionUnit::PERCENT) {
461         GetArkUINodeModifiers()->getListModifier()->resetListScrollBarWidth(nativeNode);
462     } else {
463         GetArkUINodeModifiers()->getListModifier()->setListScrollBarWidth(
464             nativeNode, scrollBarWidth.ToString().c_str());
465     }
466     return panda::JSValueRef::Undefined(vm);
467 }
468 
ResetListScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)469 ArkUINativeModuleValue ListBridge::ResetListScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
470 {
471     EcmaVM* vm = runtimeCallInfo->GetVM();
472     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
473     Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
474     auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
475     GetArkUINodeModifiers()->getListModifier()->resetListScrollBarWidth(nativeNode);
476     return panda::JSValueRef::Undefined(vm);
477 }
478 
SetListScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)479 ArkUINativeModuleValue ListBridge::SetListScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
480 {
481     EcmaVM* vm = runtimeCallInfo->GetVM();
482     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
483     Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
484     Local<JSValueRef> argColor = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
485     auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
486     std::string color = "";
487     if (!ArkTSUtils::ParseJsString(vm, argColor, color) || argColor->IsUndefined() || color.empty()) {
488         GetArkUINodeModifiers()->getListModifier()->resetListScrollBarColor(nativeNode);
489     } else {
490         GetArkUINodeModifiers()->getListModifier()->setListScrollBarColor(nativeNode, color.c_str());
491     }
492     return panda::JSValueRef::Undefined(vm);
493 }
494 
ResetListScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)495 ArkUINativeModuleValue ListBridge::ResetListScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
496 {
497     EcmaVM* vm = runtimeCallInfo->GetVM();
498     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
499     Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
500     auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
501     GetArkUINodeModifiers()->getListModifier()->resetListScrollBarColor(nativeNode);
502     return panda::JSValueRef::Undefined(vm);
503 }
504 
SetAlignListItem(ArkUIRuntimeCallInfo * runtimeCallInfo)505 ArkUINativeModuleValue ListBridge::SetAlignListItem(ArkUIRuntimeCallInfo* runtimeCallInfo)
506 {
507     EcmaVM* vm = runtimeCallInfo->GetVM();
508     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
509     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
510     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
511     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
512     int32_t listItemAlign = secondArg->Int32Value(vm);
513     GetArkUINodeModifiers()->getListModifier()->setAlignListItem(nativeNode, listItemAlign);
514 
515     return panda::JSValueRef::Undefined(vm);
516 }
517 
ResetAlignListItem(ArkUIRuntimeCallInfo * runtimeCallInfo)518 ArkUINativeModuleValue ListBridge::ResetAlignListItem(ArkUIRuntimeCallInfo* runtimeCallInfo)
519 {
520     EcmaVM* vm = runtimeCallInfo->GetVM();
521     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
522     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
523     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
524     GetArkUINodeModifiers()->getListModifier()->resetAlignListItem(nativeNode);
525     return panda::JSValueRef::Undefined(vm);
526 }
527 
SetScrollSnapAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)528 ArkUINativeModuleValue ListBridge::SetScrollSnapAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
529 {
530     EcmaVM* vm = runtimeCallInfo->GetVM();
531     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
532     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
533     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
534     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
535     if (secondArg->IsUndefined()) {
536         GetArkUINodeModifiers()->getListModifier()->resetScrollSnapAlign(nativeNode);
537     } else {
538         int32_t scrollSnapAlign = secondArg->Int32Value(vm);
539         GetArkUINodeModifiers()->getListModifier()->setScrollSnapAlign(nativeNode, scrollSnapAlign);
540     }
541 
542     return panda::JSValueRef::Undefined(vm);
543 }
544 
ResetScrollSnapAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)545 ArkUINativeModuleValue ListBridge::ResetScrollSnapAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
546 {
547     EcmaVM* vm = runtimeCallInfo->GetVM();
548     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
549     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
550     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
551     GetArkUINodeModifiers()->getListModifier()->resetScrollSnapAlign(nativeNode);
552     return panda::JSValueRef::Undefined(vm);
553 }
554 
SetContentStartOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)555 ArkUINativeModuleValue ListBridge::SetContentStartOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
556 {
557     EcmaVM* vm = runtimeCallInfo->GetVM();
558     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
559     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
560     Local<JSValueRef> startOffsetArg = runtimeCallInfo->GetCallArgRef(1);
561     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
562     double startOffset = 0.0;
563     ArkTSUtils::ParseJsDouble(vm, startOffsetArg, startOffset);
564 
565     GetArkUINodeModifiers()->getListModifier()->setContentStartOffset(nativeNode, startOffset);
566 
567     return panda::JSValueRef::Undefined(vm);
568 }
569 
ResetContentStartOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)570 ArkUINativeModuleValue ListBridge::ResetContentStartOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
571 {
572     EcmaVM* vm = runtimeCallInfo->GetVM();
573     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
574     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
575     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
576     GetArkUINodeModifiers()->getListModifier()->resetContentStartOffset(nativeNode);
577 
578     return panda::JSValueRef::Undefined(vm);
579 }
580 
SetContentEndOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)581 ArkUINativeModuleValue ListBridge::SetContentEndOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
582 {
583     EcmaVM* vm = runtimeCallInfo->GetVM();
584     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
585     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
586     Local<JSValueRef> endOffsetArg = runtimeCallInfo->GetCallArgRef(1);
587     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
588     double endOffset = 0.0;
589     ArkTSUtils::ParseJsDouble(vm, endOffsetArg, endOffset);
590 
591     GetArkUINodeModifiers()->getListModifier()->setContentEndOffset(nativeNode, endOffset);
592 
593     return panda::JSValueRef::Undefined(vm);
594 }
595 
ResetContentEndOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)596 ArkUINativeModuleValue ListBridge::ResetContentEndOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
597 {
598     EcmaVM* vm = runtimeCallInfo->GetVM();
599     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
600     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
601     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
602     GetArkUINodeModifiers()->getListModifier()->resetContentEndOffset(nativeNode);
603 
604     return panda::JSValueRef::Undefined(vm);
605 }
606 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)607 ArkUINativeModuleValue ListBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
608 {
609     EcmaVM* vm = runtimeCallInfo->GetVM();
610     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
611     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
612     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
613     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
614     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
615     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_3);
616     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_4);
617     if (dividerStrokeWidthArgs->IsUndefined() && dividerStartMarginArgs->IsUndefined() &&
618         dividerEndMarginArgs->IsUndefined() && colorArg->IsUndefined()) {
619         GetArkUINodeModifiers()->getListModifier()->listResetDivider(nativeNode);
620         return panda::JSValueRef::Undefined(vm);
621     }
622 
623     CalcDimension dividerStrokeWidth;
624     CalcDimension dividerStartMargin;
625     CalcDimension dividerEndMargin;
626     uint32_t color;
627     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
628     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
629     auto context = frameNode->GetContext();
630     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
631     auto themeManager = context->GetThemeManager();
632     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
633     auto listTheme = themeManager->GetTheme<ListTheme>();
634     CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
635 
636     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, dividerStrokeWidthArgs, dividerStrokeWidth) ||
637         LessNotEqual(dividerStrokeWidth.Value(), 0.0f) || dividerStrokeWidth.Unit() == DimensionUnit::PERCENT) {
638         dividerStrokeWidth.Reset();
639     }
640     Color colorObj;
641     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
642         color = listTheme->GetDividerColor().GetValue();
643     } else {
644         color = colorObj.GetValue();
645     }
646     if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerStartMarginArgs, dividerStartMargin) ||
647         LessNotEqual(dividerStartMargin.Value(), 0.0f) || dividerStartMargin.Unit() == DimensionUnit::PERCENT) {
648         dividerStartMargin.Reset();
649     }
650     if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerEndMarginArgs, dividerEndMargin) ||
651         LessNotEqual(dividerEndMargin.Value(), 0.0f) || dividerEndMargin.Unit() == DimensionUnit::PERCENT) {
652         dividerEndMargin.Reset();
653     }
654     uint32_t size = ARG_LENGTH;
655     ArkUI_Float32 values[size];
656     int32_t units[size];
657     values[LIST_ARG_INDEX_0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
658     values[LIST_ARG_INDEX_1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
659     values[LIST_ARG_INDEX_2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
660     units[LIST_ARG_INDEX_0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
661     units[LIST_ARG_INDEX_1] = static_cast<int32_t>(dividerStartMargin.Unit());
662     units[LIST_ARG_INDEX_2] = static_cast<int32_t>(dividerEndMargin.Unit());
663     GetArkUINodeModifiers()->getListModifier()->listSetDivider(nativeNode, color, values, units, size);
664 
665     return panda::JSValueRef::Undefined(vm);
666 }
667 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)668 ArkUINativeModuleValue ListBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
669 {
670     EcmaVM* vm = runtimeCallInfo->GetVM();
671     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
672     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
673     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
674     GetArkUINodeModifiers()->getListModifier()->listResetDivider(nativeNode);
675     return panda::JSValueRef::Undefined(vm);
676 }
677 
SetChainAnimationOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)678 ArkUINativeModuleValue ListBridge::SetChainAnimationOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
679 {
680     EcmaVM* vm = runtimeCallInfo->GetVM();
681     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
682     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
683     Local<JSValueRef> minSpaceArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
684     Local<JSValueRef> maxSpaceArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
685     Local<JSValueRef> conductivityArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_3);
686     Local<JSValueRef> intensityArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_4);
687     Local<JSValueRef> edgeEffectArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_5);
688     Local<JSValueRef> stiffnessArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_6);
689     Local<JSValueRef> dampingArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_7);
690 
691     CalcDimension minSpace;
692     CalcDimension maxSpace;
693 
694     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
695     if (minSpaceArgs->IsUndefined() && maxSpaceArgs->IsUndefined() && conductivityArgs->IsUndefined() &&
696         intensityArgs->IsUndefined() && edgeEffectArgs->IsUndefined() && stiffnessArgs->IsUndefined() &&
697         dampingArgs->IsUndefined()) {
698         GetArkUINodeModifiers()->getListModifier()->resetChainAnimationOptions(nativeNode);
699         return panda::JSValueRef::Undefined(vm);
700     } else {
701         RefPtr<ListTheme> listTheme = ArkTSUtils::GetTheme<ListTheme>();
702         CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
703 
704         minSpace = listTheme->GetChainMinSpace();
705         maxSpace = listTheme->GetChainMaxSpace();
706         ArkUIChainAnimationOptionsType chainAnimationOptions;
707 
708         double conductivity;
709         double intensity;
710 
711         chainAnimationOptions.conductivity = listTheme->GetChainConductivity();
712         chainAnimationOptions.intensity = listTheme->GetChainIntensity();
713         chainAnimationOptions.edgeEffect = 0;
714         chainAnimationOptions.stiffness = listTheme->GetChainStiffness();
715         chainAnimationOptions.damping = listTheme->GetChainDamping();
716 
717         ArkTSUtils::ParseJsDimension(vm, minSpaceArgs, minSpace, DimensionUnit::VP);
718         ArkTSUtils::ParseJsDimension(vm, maxSpaceArgs, maxSpace, DimensionUnit::VP);
719         ArkTSUtils::ParseJsDouble(vm, conductivityArgs, conductivity);
720         chainAnimationOptions.conductivity = static_cast<ArkUI_Float32>(conductivity);
721 
722         ArkTSUtils::ParseJsDouble(vm, intensityArgs, intensity);
723         chainAnimationOptions.intensity = static_cast<ArkUI_Float32>(intensity);
724 
725         if (edgeEffectArgs->IsNumber()) {
726             chainAnimationOptions.edgeEffect = edgeEffectArgs->ToNumber(vm)->Value();
727         }
728 
729         double stiffness;
730         double damping;
731 
732         ArkTSUtils::ParseJsDouble(vm, stiffnessArgs, stiffness);
733         chainAnimationOptions.stiffness = static_cast<ArkUI_Float32>(stiffness);
734 
735         ArkTSUtils::ParseJsDouble(vm, dampingArgs, damping);
736         chainAnimationOptions.damping = static_cast<ArkUI_Float32>(damping);
737 
738         chainAnimationOptions.minSpace = minSpace.Value();
739         chainAnimationOptions.minSpaceUnits = static_cast<int32_t>(minSpace.Unit());
740         chainAnimationOptions.maxSpace = maxSpace.Value();
741         chainAnimationOptions.maxSpaceUnits = static_cast<int32_t>(maxSpace.Unit());
742 
743         GetArkUINodeModifiers()->getListModifier()->setChainAnimationOptions(nativeNode, &chainAnimationOptions);
744     }
745 
746     return panda::JSValueRef::Undefined(vm);
747 }
748 
ResetChainAnimationOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)749 ArkUINativeModuleValue ListBridge::ResetChainAnimationOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
750 {
751     EcmaVM* vm = runtimeCallInfo->GetVM();
752     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
753     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
754     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
755     GetArkUINodeModifiers()->getListModifier()->resetChainAnimationOptions(nativeNode);
756     return panda::JSValueRef::Undefined(vm);
757 }
758 
SetListChildrenMainSize(ArkUIRuntimeCallInfo * runtimeCallInfo)759 ArkUINativeModuleValue ListBridge::SetListChildrenMainSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
760 {
761     EcmaVM* vm = runtimeCallInfo->GetVM();
762     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
763     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
764     // 2: argument count.
765     if (info.Length() != 2 || !(info[1]->IsObject())) {
766         return panda::JSValueRef::Undefined(vm);
767     }
768     JSList::SetChildrenMainSize(Framework::JSRef<Framework::JSObject>::Cast(info[1]));
769 
770     return panda::JSValueRef::Undefined(vm);
771 }
772 
ResetListChildrenMainSize(ArkUIRuntimeCallInfo * runtimeCallInfo)773 ArkUINativeModuleValue ListBridge::ResetListChildrenMainSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
774 {
775     EcmaVM* vm = runtimeCallInfo->GetVM();
776     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
777     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
778     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
779     GetArkUINodeModifiers()->getListModifier()->resetListChildrenMainSize(nativeNode);
780 
781     return panda::JSValueRef::Undefined(vm);
782 }
783 
SetInitialIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)784 ArkUINativeModuleValue ListBridge::SetInitialIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
785 {
786     EcmaVM* vm = runtimeCallInfo->GetVM();
787     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
788     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
789     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
790     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
791     int32_t index = secondArg->ToNumber(vm)->Value();
792     GetArkUINodeModifiers()->getListModifier()->setInitialIndex(nativeNode, index);
793     return panda::JSValueRef::Undefined(vm);
794 }
795 
ResetInitialIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)796 ArkUINativeModuleValue ListBridge::ResetInitialIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
797 {
798     EcmaVM* vm = runtimeCallInfo->GetVM();
799     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
800     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
801     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
802     GetArkUINodeModifiers()->getListModifier()->resetInitialIndex(nativeNode);
803     return panda::JSValueRef::Undefined(vm);
804 }
805 
SetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)806 ArkUINativeModuleValue ListBridge::SetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
807 {
808     EcmaVM* vm = runtimeCallInfo->GetVM();
809     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
810     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
811     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
812     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
813     float space = secondArg->ToNumber(vm)->Value();
814     GetArkUINodeModifiers()->getListModifier()->setListSpace(nativeNode, space);
815     return panda::JSValueRef::Undefined(vm);
816 }
817 
ResetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)818 ArkUINativeModuleValue ListBridge::ResetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
819 {
820     EcmaVM* vm = runtimeCallInfo->GetVM();
821     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
822     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
823     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
824     GetArkUINodeModifiers()->getListModifier()->resetListSpace(nativeNode);
825     return panda::JSValueRef::Undefined(vm);
826 }
827 
SetInitialScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)828 ArkUINativeModuleValue ListBridge::SetInitialScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
829 {
830     EcmaVM* vm = runtimeCallInfo->GetVM();
831     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
832     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
833     Framework::JSRef<Framework::JSVal> args = info[1];
834     if (args->IsObject()) {
835         Framework::JSScroller* scroller =
836             Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSScroller>();
837         RefPtr<Framework::JSScroller> jsScroller = Referenced::Claim(scroller);
838         jsScroller->SetInstanceId(Container::CurrentId());
839         SetScroller(runtimeCallInfo, jsScroller);
840     }
841     return panda::JSValueRef::Undefined(vm);
842 }
843 
ResetInitialScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)844 ArkUINativeModuleValue ListBridge::ResetInitialScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
845 {
846     EcmaVM* vm = runtimeCallInfo->GetVM();
847     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
848     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
849     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
850     GetArkUINodeModifiers()->getListModifier()->resetInitialScroller(nativeNode);
851     return panda::JSValueRef::Undefined(vm);
852 }
853 
SetScroller(ArkUIRuntimeCallInfo * runtimeCallInfo,RefPtr<Framework::JSScroller> jsScroller)854 void ListBridge::SetScroller(ArkUIRuntimeCallInfo* runtimeCallInfo, RefPtr<Framework::JSScroller> jsScroller)
855 {
856     if (jsScroller) {
857         EcmaVM* vm = runtimeCallInfo->GetVM();
858         Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
859         auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
860         RefPtr<ScrollControllerBase> listController = ListModel::GetInstance()->CreateScrollController();
861         jsScroller->SetController(listController);
862         auto proxy = jsScroller->GetScrollBarProxy();
863         if (!proxy) {
864             proxy = AceType::MakeRefPtr<NG::ScrollBarProxy>();
865             jsScroller->SetScrollBarProxy(proxy);
866         }
867         auto controller = reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(listController));
868         auto proxyPtr = reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(proxy));
869         GetArkUINodeModifiers()->getListModifier()->setInitialScroller(nativeNode, controller, proxyPtr);
870     }
871 }
872 
SetOnScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)873 ArkUINativeModuleValue ListBridge::SetOnScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
874 {
875     EcmaVM *vm = runtimeCallInfo->GetVM();
876     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
877     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
878     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
879     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
880     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
881         GetArkUINodeModifiers()->getListModifier()->resetOnListScrollIndex(nativeNode);
882         return panda::JSValueRef::Undefined(vm);
883     }
884     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
885     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
886     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
887 
888     std::function<void(int32_t, int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
889                                                            const int32_t start, const int32_t end,
890                                                            const int32_t center) {
891         panda::LocalScope pandaScope(vm);
892         panda::TryCatch trycatch(vm);
893         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
894 
895         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, start);
896         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, end);
897         panda::Local<panda::NumberRef> centerParam = panda::NumberRef::New(vm, center);
898         // 3: Array length
899         panda::Local<panda::JSValueRef> params[3] = { startParam, endParam, centerParam };
900         func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
901     };
902     GetArkUINodeModifiers()->getListModifier()->setOnListScrollIndexCallBack(
903         nativeNode, reinterpret_cast<void*>(&callback));
904     return panda::JSValueRef::Undefined(vm);
905 }
906 
SetListItemIndex(const EcmaVM * vm,const ListItemIndex indexInfo)907 Local<panda::ObjectRef> SetListItemIndex(const EcmaVM* vm, const ListItemIndex indexInfo)
908 {
909     const char* keys[] = { "index", "itemIndexInGroup", "itemGroupArea" };
910     auto indexInGroup = panda::NumberRef::Undefined(vm);
911     if (indexInfo.indexInGroup != -1) {
912         indexInGroup = panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.indexInGroup));
913     }
914     auto area = panda::NumberRef::Undefined(vm);
915     if (indexInfo.area != -1) {
916         area = panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.area));
917     }
918     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.index)), indexInGroup,
919         area };
920     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
921 }
922 
SetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo * runtimeCallInfo)923 ArkUINativeModuleValue ListBridge::SetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
924 {
925     EcmaVM *vm = runtimeCallInfo->GetVM();
926     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
927     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
928     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
929     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
930     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
931         GetArkUINodeModifiers()->getListModifier()->resetOnScrollVisibleContentChange(nativeNode);
932         return panda::JSValueRef::Undefined(vm);
933     }
934     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
935     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
936     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
937 
938     std::function<void(ListItemIndex, ListItemIndex)> callback =
939         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const ListItemIndex start, const ListItemIndex end) {
940         panda::LocalScope pandaScope(vm);
941         panda::TryCatch trycatch(vm);
942         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
943 
944         auto startParam = SetListItemIndex(vm, start);
945         auto endParam = SetListItemIndex(vm, end);
946         startParam->SetNativePointerFieldCount(vm, 1);
947         startParam->SetNativePointerField(vm, 0, static_cast<void*>(&startParam));
948         endParam->SetNativePointerFieldCount(vm, 1);
949         endParam->SetNativePointerField(vm, 0, static_cast<void*>(&endParam));
950         // 2: Array length
951         panda::Local<panda::JSValueRef> params[2] = { startParam, endParam };
952         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
953     };
954     GetArkUINodeModifiers()->getListModifier()->setOnScrollVisibleContentChange(
955         nativeNode, reinterpret_cast<void*>(&callback));
956     return panda::JSValueRef::Undefined(vm);
957 }
958 
SetOnItemMove(ArkUIRuntimeCallInfo * runtimeCallInfo)959 ArkUINativeModuleValue ListBridge::SetOnItemMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
960 {
961     EcmaVM *vm = runtimeCallInfo->GetVM();
962     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
963     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
964     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
965     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
966     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
967         GetArkUINodeModifiers()->getListModifier()->resetOnItemMove(nativeNode);
968         return panda::JSValueRef::Undefined(vm);
969     }
970     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
971     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
972     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
973 
974     std::function<bool(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
975                                                          int32_t start, int32_t end) -> bool {
976         panda::LocalScope pandaScope(vm);
977         panda::TryCatch trycatch(vm);
978         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
979 
980         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, start);
981         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, end);
982         // 2: Array length
983         panda::Local<panda::JSValueRef> params[2] = { startParam, endParam};
984         auto result =  func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
985         if (result->IsBoolean()) {
986             return result->ToBoolean(vm)->Value();
987         }
988         return false;
989     };
990     GetArkUINodeModifiers()->getListModifier()->setOnItemMove(
991         nativeNode, reinterpret_cast<void*>(&callback));
992     return panda::JSValueRef::Undefined(vm);
993 }
994 
SetOnItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)995 ArkUINativeModuleValue ListBridge::SetOnItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
996 {
997     EcmaVM *vm = runtimeCallInfo->GetVM();
998     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
999     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1000     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1001     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1002     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1003 
1004     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1005     if (!info[1]->IsFunction()) {
1006         return panda::JSValueRef::Undefined(vm);
1007     }
1008 
1009     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1010     std::function<RefPtr<AceType>(const ItemDragInfo&, int32_t)> callback =
1011         [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1012             const ItemDragInfo& dragInfo, int32_t itemIndex) -> RefPtr<AceType> {
1013         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx, nullptr);
1014         panda::LocalScope pandaScope(vm);
1015         panda::TryCatch trycatch(vm);
1016 
1017         auto ret = func->ItemDragStartExecute(dragInfo, itemIndex);
1018         if (!ret->IsFunction()) {
1019             return nullptr;
1020         }
1021 
1022         auto builderFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(ret));
1023         if (!builderFunc) {
1024             return nullptr;
1025         }
1026         // use another VSP instance while executing the builder function
1027         ViewStackModel::GetInstance()->NewScope();
1028         {
1029             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1030             builderFunc->Execute();
1031         }
1032         return ViewStackModel::GetInstance()->Finish();
1033     };
1034     GetArkUINodeModifiers()->getListModifier()->setOnItemDragStart(nativeNode, reinterpret_cast<void*>(&callback));
1035     return panda::JSValueRef::Undefined(vm);
1036 }
1037 
SetOnItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1038 ArkUINativeModuleValue ListBridge::SetOnItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1039 {
1040     EcmaVM *vm = runtimeCallInfo->GetVM();
1041     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1042     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1043     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1044     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1045     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1046 
1047     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1048     if (!info[1]->IsFunction()) {
1049         return panda::JSValueRef::Undefined(vm);
1050     }
1051     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1052 
1053     std::function<void(const ItemDragInfo&)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1054                                                       execCtx = info.GetExecutionContext()](
1055                                                       const ItemDragInfo& dragInfo) {
1056         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1057         panda::LocalScope pandaScope(vm);
1058         panda::TryCatch trycatch(vm);
1059 
1060         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1061         func->ItemDragEnterExecute(dragInfo);
1062     };
1063     GetArkUINodeModifiers()->getListModifier()->setOnItemDragEnter(nativeNode, reinterpret_cast<void*>(&callback));
1064     return panda::JSValueRef::Undefined(vm);
1065 }
1066 
SetOnItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1067 ArkUINativeModuleValue ListBridge::SetOnItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1068 {
1069     EcmaVM *vm = runtimeCallInfo->GetVM();
1070     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1071     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
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         return panda::JSValueRef::Undefined(vm);
1079     }
1080     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1081 
1082     std::function<void(const ItemDragInfo&, int32_t, int32_t)> callback =
1083         [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1084             const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) {
1085             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1086             panda::LocalScope pandaScope(vm);
1087             panda::TryCatch trycatch(vm);
1088 
1089             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1090             func->ItemDragMoveExecute(dragInfo, itemIndex, insertIndex);
1091         };
1092     GetArkUINodeModifiers()->getListModifier()->setOnItemDragMove(
1093         nativeNode, reinterpret_cast<void*>(&callback));
1094     return panda::JSValueRef::Undefined(vm);
1095 }
1096 
SetOnItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1097 ArkUINativeModuleValue ListBridge::SetOnItemDragLeave(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     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1103     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1104     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1105 
1106     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1107     if (!info[1]->IsFunction()) {
1108         return panda::JSValueRef::Undefined(vm);
1109     }
1110     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1111 
1112     std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc)](
1113                                const ItemDragInfo& dragInfo, int32_t itemIndex) {
1114         panda::LocalScope pandaScope(vm);
1115         panda::TryCatch trycatch(vm);
1116 
1117         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1118         func->ItemDragLeaveExecute(dragInfo, itemIndex);
1119     };
1120     GetArkUINodeModifiers()->getListModifier()->setOnItemDragLeave(nativeNode, reinterpret_cast<void*>(&callback));
1121     return panda::JSValueRef::Undefined(vm);
1122 }
1123 
SetOnItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1124 ArkUINativeModuleValue ListBridge::SetOnItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1125 {
1126     EcmaVM *vm = runtimeCallInfo->GetVM();
1127     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1128     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1129     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1130     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1131     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1132 
1133     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1134     if (!info[1]->IsFunction()) {
1135         return panda::JSValueRef::Undefined(vm);
1136     }
1137     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1138 
1139     std::function<void(const ItemDragInfo&, int32_t, int32_t, bool)> callback =
1140         [vm, frameNode, func = std::move(jsOnDragFunc)](
1141             const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) {
1142             panda::LocalScope pandaScope(vm);
1143             panda::TryCatch trycatch(vm);
1144 
1145             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1146             func->ItemDropExecute(dragInfo, itemIndex, insertIndex, isSuccess);
1147         };
1148     GetArkUINodeModifiers()->getListModifier()->setOnItemDrop(nativeNode, reinterpret_cast<void*>(&callback));
1149     return panda::JSValueRef::Undefined(vm);
1150 }
1151 
SetOnListScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1152 ArkUINativeModuleValue ListBridge::SetOnListScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1153 {
1154     EcmaVM *vm = runtimeCallInfo->GetVM();
1155     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1156     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1157     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1158     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1159     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1160         GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStart(nativeNode);
1161         return panda::JSValueRef::Undefined(vm);
1162     }
1163     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1164     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1165     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1166 
1167     std::function<void()> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1168         panda::LocalScope pandaScope(vm);
1169         panda::TryCatch trycatch(vm);
1170         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1171         func->Call(vm, func.ToLocal(), nullptr, 0);
1172     };
1173     GetArkUINodeModifiers()->getListModifier()->setOnListScrollStartCallBack(
1174         nativeNode, reinterpret_cast<void*>(&callback));
1175     return panda::JSValueRef::Undefined(vm);
1176 }
1177 
SetOnListScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1178 ArkUINativeModuleValue ListBridge::SetOnListScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1179 {
1180     EcmaVM *vm = runtimeCallInfo->GetVM();
1181     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1182     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1183     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1184     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1185     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1186         GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStop(nativeNode);
1187         return panda::JSValueRef::Undefined(vm);
1188     }
1189     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1190     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1191     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1192     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1193         panda::LocalScope pandaScope(vm);
1194         panda::TryCatch trycatch(vm);
1195         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1196         func->Call(vm, func.ToLocal(), nullptr, 0);
1197     };
1198     GetArkUINodeModifiers()->getListModifier()->setOnListScrollStopCallBack(
1199         nativeNode, reinterpret_cast<void*>(&callback));
1200     return panda::JSValueRef::Undefined(vm);
1201 }
1202 
SetOnListScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)1203 ArkUINativeModuleValue ListBridge::SetOnListScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1204 {
1205     EcmaVM* vm = runtimeCallInfo->GetVM();
1206     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1207     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1208     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1209     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1210     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1211         GetArkUINodeModifiers()->getListModifier()->resetOnListScrollFrameBegin(nativeNode);
1212         return panda::JSValueRef::Undefined(vm);
1213     }
1214     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1215     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1216     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1217     std::function<ScrollFrameResult(Dimension, ScrollState)> callback = [vm, frameNode,
1218         func = panda::CopyableGlobal(vm, func)](Dimension offset, ScrollState state) -> ScrollFrameResult {
1219         panda::LocalScope pandaScope(vm);
1220         panda::TryCatch trycatch(vm);
1221         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1222 
1223         panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
1224             vm, static_cast<double>(offset.ConvertToVp()));
1225         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
1226          // 2: Array length
1227         panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
1228         auto value = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1229 
1230         OHOS::Ace::ScrollFrameResult scrollRes { .offset = offset };
1231         if (value->IsNumber()) {
1232             scrollRes.offset = Dimension(value->ToNumber(vm)->Value(), DimensionUnit::VP);
1233         }
1234         if (value->IsObject(vm)) {
1235             auto resultObj = value->ToObject(vm);
1236             panda::Local<panda::JSValueRef> remain = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm,
1237                 "offsetRemain"));
1238             if (remain->IsNumber()) {
1239                 scrollRes.offset = Dimension(remain->ToNumber(vm)->Value(), DimensionUnit::VP);
1240             }
1241         }
1242         return scrollRes;
1243     };
1244     GetArkUINodeModifiers()->getListModifier()->setOnListScrollFrameBeginCallBack(
1245         nativeNode, reinterpret_cast<void*>(&callback));
1246     return panda::JSValueRef::Undefined(vm);
1247 }
1248 
SetOnListWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1249 ArkUINativeModuleValue ListBridge::SetOnListWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1250 {
1251     EcmaVM* vm = runtimeCallInfo->GetVM();
1252     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1253     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1254     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1255     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1256     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1257         GetArkUINodeModifiers()->getListModifier()->resetOnListWillScroll(nativeNode);
1258         return panda::JSValueRef::Undefined(vm);
1259     }
1260     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1261     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1262     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1263     std::function<ScrollFrameResult(CalcDimension, ScrollState, ScrollSource)> callback =
1264         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1265             const CalcDimension& scrollOffset, const ScrollState& scrollState, ScrollSource scrollSource) {
1266         panda::LocalScope pandaScope(vm);
1267         panda::TryCatch trycatch(vm);
1268         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1269 
1270         panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
1271             vm, static_cast<double>(scrollOffset.ConvertToVp()));
1272         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollState));
1273         panda::Local<panda::NumberRef> sourceParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollSource));
1274         // 3: Array length
1275         panda::Local<panda::JSValueRef> params[3] = { offsetParam, stateParam, sourceParam };
1276         auto result = func->Call(vm, func.ToLocal(), params, 3); // 4: Array length
1277         ScrollFrameResult scrollRes { .offset = scrollOffset };
1278 
1279         if (result->IsObject(vm)) {
1280             auto resultObj = result->ToObject(vm);
1281             panda::Local<panda::JSValueRef> dxRemainValue =
1282                     resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "offsetRemain"));
1283             if (dxRemainValue->IsNumber()) {
1284                 scrollRes.offset = Dimension(dxRemainValue->ToNumber(vm)->Value(), DimensionUnit::VP);
1285             }
1286         }
1287         return scrollRes;
1288     };
1289     GetArkUINodeModifiers()->getListModifier()->setOnListWillScrollCallBack(
1290         nativeNode, reinterpret_cast<void*>(&callback));
1291     return panda::JSValueRef::Undefined(vm);
1292 }
1293 
SetOnListDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1294 ArkUINativeModuleValue ListBridge::SetOnListDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1295 {
1296     EcmaVM* vm = runtimeCallInfo->GetVM();
1297     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1298     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1299     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1300     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1301     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1302         GetArkUINodeModifiers()->getListModifier()->resetOnListDidScroll(nativeNode);
1303         return panda::JSValueRef::Undefined(vm);
1304     }
1305     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1306     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1307     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1308     std::function<void(Dimension, ScrollState)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1309                             const CalcDimension& scrollOffset, const ScrollState& scrollState) {
1310         panda::LocalScope pandaScope(vm);
1311         panda::TryCatch trycatch(vm);
1312         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1313 
1314         panda::Local<panda::NumberRef> offsetParam =
1315             panda::NumberRef::New(vm, static_cast<double>(scrollOffset.ConvertToVp()));
1316         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollState));
1317         // 2: Array length
1318         panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
1319         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1320     };
1321     GetArkUINodeModifiers()->getListModifier()->setOnListDidScrollCallBack(
1322         nativeNode, reinterpret_cast<void*>(&callback));
1323     return panda::JSValueRef::Undefined(vm);
1324 }
1325 
SetOnListReachStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1326 ArkUINativeModuleValue ListBridge::SetOnListReachStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1327 {
1328     EcmaVM* vm = runtimeCallInfo->GetVM();
1329     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1330     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1331     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1332     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1333     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1334         GetArkUINodeModifiers()->getListModifier()->resetOnListReachStart(nativeNode);
1335         return panda::JSValueRef::Undefined(vm);
1336     }
1337     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1338     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1339     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1340     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1341         panda::LocalScope pandaScope(vm);
1342         panda::TryCatch trycatch(vm);
1343         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1344         func->Call(vm, func.ToLocal(), nullptr, 0);
1345     };
1346 
1347     GetArkUINodeModifiers()->getListModifier()->setOnListReachStartCallBack(
1348         nativeNode, reinterpret_cast<void*>(&callback));
1349     return panda::JSValueRef::Undefined(vm);
1350 }
1351 
SetOnListReachEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1352 ArkUINativeModuleValue ListBridge::SetOnListReachEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1353 {
1354     EcmaVM* vm = runtimeCallInfo->GetVM();
1355     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1356     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1357     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1358     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1359     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1360         GetArkUINodeModifiers()->getListModifier()->resetOnListReachEnd(nativeNode);
1361         return panda::JSValueRef::Undefined(vm);
1362     }
1363     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1364     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1365     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1366     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1367         panda::LocalScope pandaScope(vm);
1368         panda::TryCatch trycatch(vm);
1369         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1370         func->Call(vm, func.ToLocal(), nullptr, 0);
1371     };
1372 
1373     GetArkUINodeModifiers()->getListModifier()->setOnListReachEndCallBack(
1374         nativeNode, reinterpret_cast<void*>(&callback));
1375     return panda::JSValueRef::Undefined(vm);
1376 }
1377 
ResetOnScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)1378 ArkUINativeModuleValue ListBridge::ResetOnScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
1379 {
1380     EcmaVM* vm = runtimeCallInfo->GetVM();
1381     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1382     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1383     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1384     GetArkUINodeModifiers()->getListModifier()->resetOnListScrollIndex(nativeNode);
1385     return panda::JSValueRef::Undefined(vm);
1386 }
1387 
ResetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1388 ArkUINativeModuleValue ListBridge::ResetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1389 {
1390     EcmaVM* vm = runtimeCallInfo->GetVM();
1391     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1392     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1393     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1394     GetArkUINodeModifiers()->getListModifier()->resetOnScrollVisibleContentChange(nativeNode);
1395     return panda::JSValueRef::Undefined(vm);
1396 }
1397 
ResetOnItemMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1398 ArkUINativeModuleValue ListBridge::ResetOnItemMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1399 {
1400     EcmaVM* vm = runtimeCallInfo->GetVM();
1401     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1402     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1403     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1404     GetArkUINodeModifiers()->getListModifier()->resetOnItemMove(nativeNode);
1405     return panda::JSValueRef::Undefined(vm);
1406 }
1407 
ResetOnItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1408 ArkUINativeModuleValue ListBridge::ResetOnItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1409 {
1410     EcmaVM* vm = runtimeCallInfo->GetVM();
1411     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1412     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1413     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1414     GetArkUINodeModifiers()->getListModifier()->resetOnItemDragStart(nativeNode);
1415     return panda::JSValueRef::Undefined(vm);
1416 }
1417 
ResetOnItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1418 ArkUINativeModuleValue ListBridge::ResetOnItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1419 {
1420     EcmaVM* vm = runtimeCallInfo->GetVM();
1421     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1422     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1423     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1424     GetArkUINodeModifiers()->getListModifier()->resetOnItemDragEnter(nativeNode);
1425     return panda::JSValueRef::Undefined(vm);
1426 }
1427 
ResetOnItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1428 ArkUINativeModuleValue ListBridge::ResetOnItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1429 {
1430     EcmaVM* vm = runtimeCallInfo->GetVM();
1431     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1432     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1433     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1434     GetArkUINodeModifiers()->getListModifier()->resetOnItemDragMove(nativeNode);
1435     return panda::JSValueRef::Undefined(vm);
1436 }
1437 
ResetOnItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1438 ArkUINativeModuleValue ListBridge::ResetOnItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1439 {
1440     EcmaVM* vm = runtimeCallInfo->GetVM();
1441     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1442     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1443     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1444     GetArkUINodeModifiers()->getListModifier()->resetOnItemDragLeave(nativeNode);
1445     return panda::JSValueRef::Undefined(vm);
1446 }
1447 
ResetOnItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1448 ArkUINativeModuleValue ListBridge::ResetOnItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1449 {
1450     EcmaVM* vm = runtimeCallInfo->GetVM();
1451     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1452     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1453     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1454     GetArkUINodeModifiers()->getListModifier()->resetOnItemDrop(nativeNode);
1455     return panda::JSValueRef::Undefined(vm);
1456 }
1457 
ResetOnListScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1458 ArkUINativeModuleValue ListBridge::ResetOnListScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1459 {
1460     EcmaVM* vm = runtimeCallInfo->GetVM();
1461     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1462     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1463     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1464     GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStart(nativeNode);
1465     return panda::JSValueRef::Undefined(vm);
1466 }
1467 
ResetOnListScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1468 ArkUINativeModuleValue ListBridge::ResetOnListScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1469 {
1470     EcmaVM* vm = runtimeCallInfo->GetVM();
1471     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1472     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1473     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1474     GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStop(nativeNode);
1475     return panda::JSValueRef::Undefined(vm);
1476 }
1477 
ResetOnListScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)1478 ArkUINativeModuleValue ListBridge::ResetOnListScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1479 {
1480     EcmaVM* vm = runtimeCallInfo->GetVM();
1481     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1482     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1483     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1484     GetArkUINodeModifiers()->getListModifier()->resetOnListScrollFrameBegin(nativeNode);
1485     return panda::JSValueRef::Undefined(vm);
1486 }
1487 
ResetOnListWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1488 ArkUINativeModuleValue ListBridge::ResetOnListWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1489 {
1490     EcmaVM* vm = runtimeCallInfo->GetVM();
1491     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1492     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1493     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1494     GetArkUINodeModifiers()->getListModifier()->resetOnListWillScroll(nativeNode);
1495     return panda::JSValueRef::Undefined(vm);
1496 }
1497 
ResetOnListDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1498 ArkUINativeModuleValue ListBridge::ResetOnListDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1499 {
1500     EcmaVM* vm = runtimeCallInfo->GetVM();
1501     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1502     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1503     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1504     GetArkUINodeModifiers()->getListModifier()->resetOnListDidScroll(nativeNode);
1505     return panda::JSValueRef::Undefined(vm);
1506 }
1507 
ResetOnListReachStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1508 ArkUINativeModuleValue ListBridge::ResetOnListReachStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1509 {
1510     EcmaVM* vm = runtimeCallInfo->GetVM();
1511     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1512     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1513     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1514     GetArkUINodeModifiers()->getListModifier()->resetOnListReachStart(nativeNode);
1515     return panda::JSValueRef::Undefined(vm);
1516 }
1517 
ResetOnListReachEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1518 ArkUINativeModuleValue ListBridge::ResetOnListReachEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1519 {
1520     EcmaVM* vm = runtimeCallInfo->GetVM();
1521     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1522     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1523     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1524     GetArkUINodeModifiers()->getListModifier()->resetOnListReachEnd(nativeNode);
1525     return panda::JSValueRef::Undefined(vm);
1526 }
1527 } // namespace OHOS::Ace::NG