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 
SetListEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)269 ArkUINativeModuleValue ListBridge::SetListEdgeEffect(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     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
276 
277     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
278     int32_t effect = static_cast<int32_t>(EdgeEffect::SPRING);
279 
280     if (secondArg->IsUndefined() || secondArg->IsNull()) {
281         effect = static_cast<int32_t>(EdgeEffect::SPRING);
282     } else {
283         effect = secondArg->Int32Value(vm);
284     }
285     if (effect < static_cast<int32_t>(EdgeEffect::SPRING) || effect > static_cast<int32_t>(EdgeEffect::NONE)) {
286         effect = static_cast<int32_t>(EdgeEffect::SPRING);
287     }
288     if (thirdArg->IsUndefined() || thirdArg->IsNull()) {
289         GetArkUINodeModifiers()->getListModifier()->setListEdgeEffect(nativeNode, effect, false);
290     } else {
291         GetArkUINodeModifiers()->getListModifier()->setListEdgeEffect(
292             nativeNode, effect, thirdArg->ToBoolean(vm)->Value());
293     }
294     return panda::JSValueRef::Undefined(vm);
295 }
296 
ResetListEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)297 ArkUINativeModuleValue ListBridge::ResetListEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
298 {
299     EcmaVM* vm = runtimeCallInfo->GetVM();
300     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
301     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
302     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
303     GetArkUINodeModifiers()->getListModifier()->resetListEdgeEffect(nativeNode);
304     return panda::JSValueRef::Undefined(vm);
305 }
306 
SetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)307 ArkUINativeModuleValue ListBridge::SetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
308 {
309     EcmaVM* vm = runtimeCallInfo->GetVM();
310     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
311     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
312     Local<JSValueRef> fadingEdgeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
313     Local<JSValueRef> fadingEdgeLengthArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
314 
315     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
316     CalcDimension fadingEdgeLength = Dimension(32.0f, DimensionUnit::VP); // default value
317 
318     if (fadingEdgeArg->IsUndefined() || fadingEdgeArg->IsNull()) {
319         GetArkUINodeModifiers()->getListModifier()->resetListFadingEdge(nativeNode);
320     } else {
321         bool fadingEdge = fadingEdgeArg->ToBoolean(vm)->Value();
322         if (!fadingEdgeLengthArg->IsUndefined() && !fadingEdgeLengthArg->IsNull() &&
323             fadingEdgeLengthArg->IsObject(vm)) {
324             ArkTSUtils::ParseJsLengthMetrics(vm, fadingEdgeLengthArg, fadingEdgeLength);
325         }
326         GetArkUINodeModifiers()->getListModifier()->setListFadingEdge(
327             nativeNode, fadingEdge, fadingEdgeLength.Value(), static_cast<int32_t>(fadingEdgeLength.Unit()));
328     }
329     return panda::JSValueRef::Undefined(vm);
330 }
331 
ResetFadingEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)332 ArkUINativeModuleValue ListBridge::ResetFadingEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
333 {
334     EcmaVM* vm = runtimeCallInfo->GetVM();
335     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
336     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
337     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
338     GetArkUINodeModifiers()->getListModifier()->resetListFadingEdge(nativeNode);
339 
340     return panda::JSValueRef::Undefined(vm);
341 }
342 
SetListDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)343 ArkUINativeModuleValue ListBridge::SetListDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
344 {
345     EcmaVM* vm = runtimeCallInfo->GetVM();
346     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
347     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
348     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
349     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
350     if (secondArg->IsUndefined()) {
351         GetArkUINodeModifiers()->getListModifier()->resetListDirection(nativeNode);
352     } else {
353         int32_t direction = secondArg->ToNumber(vm)->Value();
354         GetArkUINodeModifiers()->getListModifier()->setListDirection(nativeNode, direction);
355     }
356 
357     return panda::JSValueRef::Undefined(vm);
358 }
ResetListDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)359 ArkUINativeModuleValue ListBridge::ResetListDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
360 {
361     EcmaVM* vm = runtimeCallInfo->GetVM();
362     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
363     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
364     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
365     GetArkUINodeModifiers()->getListModifier()->resetListDirection(nativeNode);
366 
367     return panda::JSValueRef::Undefined(vm);
368 }
369 
SetListFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)370 ArkUINativeModuleValue ListBridge::SetListFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
371 {
372     EcmaVM* vm = runtimeCallInfo->GetVM();
373     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
374     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
375     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
376 
377     double friction = -1.0;
378     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
379     if (secondArg->IsUndefined() || secondArg->IsNull() || !ArkTSUtils::ParseJsDouble(vm, secondArg, friction)) {
380         friction = -1.0;
381     }
382     GetArkUINodeModifiers()->getListModifier()->setListFriction(nativeNode, friction);
383     return panda::JSValueRef::Undefined(vm);
384 }
385 
ResetListFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)386 ArkUINativeModuleValue ListBridge::ResetListFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
387 {
388     EcmaVM* vm = runtimeCallInfo->GetVM();
389     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
390     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
391     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
392     GetArkUINodeModifiers()->getListModifier()->resetListFriction(nativeNode);
393     return panda::JSValueRef::Undefined(vm);
394 }
395 
SetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)396 ArkUINativeModuleValue ListBridge::SetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
397 {
398     EcmaVM* vm = runtimeCallInfo->GetVM();
399     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
400     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
401     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
402     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
403 
404     if (secondArg->IsBoolean()) {
405         bool enabled = secondArg->ToBoolean(vm)->Value();
406         GetArkUINodeModifiers()->getListModifier()->setListMaintainVisibleContentPosition(nativeNode, enabled);
407     } else {
408         GetArkUINodeModifiers()->getListModifier()->resetListMaintainVisibleContentPosition(nativeNode);
409     }
410 
411     return panda::JSValueRef::Undefined(vm);
412 }
413 
ResetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)414 ArkUINativeModuleValue ListBridge::ResetListMaintainVisibleContentPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
415 {
416     EcmaVM* vm = runtimeCallInfo->GetVM();
417     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
418     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
419     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
420     GetArkUINodeModifiers()->getListModifier()->resetListMaintainVisibleContentPosition(nativeNode);
421     return panda::JSValueRef::Undefined(vm);
422 }
423 
SetListNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)424 ArkUINativeModuleValue ListBridge::SetListNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
425 {
426     EcmaVM* vm = runtimeCallInfo->GetVM();
427     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
428     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
429     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
430     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
431 
432     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
433     int32_t forward = 0;
434     int32_t backward = 0;
435     if (!secondArg->IsUndefined()) {
436         forward = secondArg->Int32Value(vm);
437     }
438     if (!thirdArg->IsUndefined()) {
439         backward = thirdArg->Int32Value(vm);
440     }
441 
442     if (forward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
443         forward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
444         forward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
445     }
446 
447     if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
448         backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
449         backward = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
450     }
451 
452     GetArkUINodeModifiers()->getListModifier()->setListNestedScroll(nativeNode, forward, backward);
453 
454     return panda::JSValueRef::Undefined(vm);
455 }
456 
ResetListNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)457 ArkUINativeModuleValue ListBridge::ResetListNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
458 {
459     EcmaVM* vm = runtimeCallInfo->GetVM();
460     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
461     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
462     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
463     GetArkUINodeModifiers()->getListModifier()->resetListNestedScroll(nativeNode);
464     return panda::JSValueRef::Undefined(vm);
465 }
466 
SetListScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)467 ArkUINativeModuleValue ListBridge::SetListScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
468 {
469     EcmaVM* vm = runtimeCallInfo->GetVM();
470     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
471     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
472     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
473     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
474     if (secondArg->IsUndefined()) {
475         GetArkUINodeModifiers()->getListModifier()->resetListScrollBar(nativeNode);
476     } else {
477         int32_t barState = secondArg->ToNumber(vm)->Value();
478         GetArkUINodeModifiers()->getListModifier()->setListScrollBar(nativeNode, barState);
479     }
480 
481     return panda::JSValueRef::Undefined(vm);
482 }
483 
ResetListScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)484 ArkUINativeModuleValue ListBridge::ResetListScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
485 {
486     EcmaVM* vm = runtimeCallInfo->GetVM();
487     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
488     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
489     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
490     GetArkUINodeModifiers()->getListModifier()->resetListScrollBar(nativeNode);
491 
492     return panda::JSValueRef::Undefined(vm);
493 }
494 
SetListScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)495 ArkUINativeModuleValue ListBridge::SetListScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
496 {
497     EcmaVM* vm = runtimeCallInfo->GetVM();
498     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
499     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
500     Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
501     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
502 
503     CalcDimension scrollBarWidth;
504     if (!ArkTSUtils::ParseJsDimension(vm, scrollBarArg, scrollBarWidth, DimensionUnit::VP) || scrollBarArg->IsNull() ||
505         scrollBarArg->IsUndefined() || (scrollBarArg->IsString(vm) && scrollBarWidth.ToString().empty()) ||
506         LessNotEqual(scrollBarWidth.Value(), 0.0) || scrollBarWidth.Unit() == DimensionUnit::PERCENT) {
507         GetArkUINodeModifiers()->getListModifier()->resetListScrollBarWidth(nativeNode);
508     } else {
509         GetArkUINodeModifiers()->getListModifier()->setListScrollBarWidth(
510             nativeNode, scrollBarWidth.ToString().c_str());
511     }
512     return panda::JSValueRef::Undefined(vm);
513 }
514 
ResetListScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)515 ArkUINativeModuleValue ListBridge::ResetListScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
516 {
517     EcmaVM* vm = runtimeCallInfo->GetVM();
518     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
519     Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
520     auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
521     GetArkUINodeModifiers()->getListModifier()->resetListScrollBarWidth(nativeNode);
522     return panda::JSValueRef::Undefined(vm);
523 }
524 
SetListScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)525 ArkUINativeModuleValue ListBridge::SetListScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
526 {
527     EcmaVM* vm = runtimeCallInfo->GetVM();
528     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
529     Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
530     Local<JSValueRef> argColor = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
531     auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
532     std::string color = "";
533     if (!ArkTSUtils::ParseJsString(vm, argColor, color) || argColor->IsUndefined() || color.empty()) {
534         GetArkUINodeModifiers()->getListModifier()->resetListScrollBarColor(nativeNode);
535     } else {
536         GetArkUINodeModifiers()->getListModifier()->setListScrollBarColor(nativeNode, color.c_str());
537     }
538     return panda::JSValueRef::Undefined(vm);
539 }
540 
ResetListScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)541 ArkUINativeModuleValue ListBridge::ResetListScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
542 {
543     EcmaVM* vm = runtimeCallInfo->GetVM();
544     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
545     Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
546     auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
547     GetArkUINodeModifiers()->getListModifier()->resetListScrollBarColor(nativeNode);
548     return panda::JSValueRef::Undefined(vm);
549 }
550 
SetFlingSpeedLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)551 ArkUINativeModuleValue ListBridge::SetFlingSpeedLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
552 {
553     EcmaVM* vm = runtimeCallInfo->GetVM();
554     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
555     Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
556     Local<JSValueRef> argSpeed = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
557     auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
558     double limitSpeed = -1.0;
559     if (!ArkTSUtils::ParseJsDouble(vm, argSpeed, limitSpeed)) {
560         GetArkUINodeModifiers()->getListModifier()->resetListFlingSpeedLimit(nativeNode);
561     } else {
562         GetArkUINodeModifiers()->getListModifier()->setListFlingSpeedLimit(
563             nativeNode, static_cast<ArkUI_Float32>(limitSpeed));
564     }
565     return panda::JSValueRef::Undefined(vm);
566 }
567 
ResetFlingSpeedLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)568 ArkUINativeModuleValue ListBridge::ResetFlingSpeedLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
569 {
570     EcmaVM* vm = runtimeCallInfo->GetVM();
571     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
572     Local<JSValueRef> argNode = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
573     auto nativeNode = nodePtr(argNode->ToNativePointer(vm)->Value());
574     GetArkUINodeModifiers()->getListModifier()->resetListFlingSpeedLimit(nativeNode);
575     return panda::JSValueRef::Undefined(vm);
576 }
577 
SetAlignListItem(ArkUIRuntimeCallInfo * runtimeCallInfo)578 ArkUINativeModuleValue ListBridge::SetAlignListItem(ArkUIRuntimeCallInfo* runtimeCallInfo)
579 {
580     EcmaVM* vm = runtimeCallInfo->GetVM();
581     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
582     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
583     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
584     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
585     int32_t listItemAlign = secondArg->Int32Value(vm);
586     GetArkUINodeModifiers()->getListModifier()->setAlignListItem(nativeNode, listItemAlign);
587 
588     return panda::JSValueRef::Undefined(vm);
589 }
590 
ResetAlignListItem(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue ListBridge::ResetAlignListItem(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593     EcmaVM* vm = runtimeCallInfo->GetVM();
594     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
595     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
596     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
597     GetArkUINodeModifiers()->getListModifier()->resetAlignListItem(nativeNode);
598     return panda::JSValueRef::Undefined(vm);
599 }
600 
SetScrollSnapAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)601 ArkUINativeModuleValue ListBridge::SetScrollSnapAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
602 {
603     EcmaVM* vm = runtimeCallInfo->GetVM();
604     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
605     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
606     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
607     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
608     if (secondArg->IsUndefined()) {
609         GetArkUINodeModifiers()->getListModifier()->resetScrollSnapAlign(nativeNode);
610     } else {
611         int32_t scrollSnapAlign = secondArg->Int32Value(vm);
612         GetArkUINodeModifiers()->getListModifier()->setScrollSnapAlign(nativeNode, scrollSnapAlign);
613     }
614 
615     return panda::JSValueRef::Undefined(vm);
616 }
617 
ResetScrollSnapAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)618 ArkUINativeModuleValue ListBridge::ResetScrollSnapAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
619 {
620     EcmaVM* vm = runtimeCallInfo->GetVM();
621     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
622     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
623     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
624     GetArkUINodeModifiers()->getListModifier()->resetScrollSnapAlign(nativeNode);
625     return panda::JSValueRef::Undefined(vm);
626 }
627 
SetContentStartOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)628 ArkUINativeModuleValue ListBridge::SetContentStartOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
629 {
630     EcmaVM* vm = runtimeCallInfo->GetVM();
631     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
632     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
633     Local<JSValueRef> startOffsetArg = runtimeCallInfo->GetCallArgRef(1);
634     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
635     double startOffset = 0.0;
636     ArkTSUtils::ParseJsDouble(vm, startOffsetArg, startOffset);
637 
638     GetArkUINodeModifiers()->getListModifier()->setContentStartOffset(nativeNode, startOffset);
639 
640     return panda::JSValueRef::Undefined(vm);
641 }
642 
ResetContentStartOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)643 ArkUINativeModuleValue ListBridge::ResetContentStartOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
644 {
645     EcmaVM* vm = runtimeCallInfo->GetVM();
646     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
647     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
648     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
649     GetArkUINodeModifiers()->getListModifier()->resetContentStartOffset(nativeNode);
650 
651     return panda::JSValueRef::Undefined(vm);
652 }
653 
SetContentEndOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)654 ArkUINativeModuleValue ListBridge::SetContentEndOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
655 {
656     EcmaVM* vm = runtimeCallInfo->GetVM();
657     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
658     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
659     Local<JSValueRef> endOffsetArg = runtimeCallInfo->GetCallArgRef(1);
660     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
661     double endOffset = 0.0;
662     ArkTSUtils::ParseJsDouble(vm, endOffsetArg, endOffset);
663 
664     GetArkUINodeModifiers()->getListModifier()->setContentEndOffset(nativeNode, endOffset);
665 
666     return panda::JSValueRef::Undefined(vm);
667 }
668 
ResetContentEndOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue ListBridge::ResetContentEndOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
670 {
671     EcmaVM* vm = runtimeCallInfo->GetVM();
672     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
673     Local<JSValueRef> frameNodeArg = runtimeCallInfo->GetCallArgRef(0);
674     auto nativeNode = nodePtr(frameNodeArg->ToNativePointer(vm)->Value());
675     GetArkUINodeModifiers()->getListModifier()->resetContentEndOffset(nativeNode);
676 
677     return panda::JSValueRef::Undefined(vm);
678 }
679 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)680 ArkUINativeModuleValue ListBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
681 {
682     EcmaVM* vm = runtimeCallInfo->GetVM();
683     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
684     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
685     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
686     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
687     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
688     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_3);
689     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_4);
690     if (dividerStrokeWidthArgs->IsUndefined() && dividerStartMarginArgs->IsUndefined() &&
691         dividerEndMarginArgs->IsUndefined() && colorArg->IsUndefined()) {
692         GetArkUINodeModifiers()->getListModifier()->listResetDivider(nativeNode);
693         return panda::JSValueRef::Undefined(vm);
694     }
695 
696     CalcDimension dividerStrokeWidth;
697     CalcDimension dividerStartMargin;
698     CalcDimension dividerEndMargin;
699     uint32_t color;
700     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
701     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
702     auto context = frameNode->GetContext();
703     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
704     auto themeManager = context->GetThemeManager();
705     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
706     auto listTheme = themeManager->GetTheme<ListTheme>();
707     CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
708 
709     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, dividerStrokeWidthArgs, dividerStrokeWidth) ||
710         LessNotEqual(dividerStrokeWidth.Value(), 0.0f) || dividerStrokeWidth.Unit() == DimensionUnit::PERCENT) {
711         dividerStrokeWidth.Reset();
712     }
713     Color colorObj;
714     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
715         color = listTheme->GetDividerColor().GetValue();
716     } else {
717         color = colorObj.GetValue();
718     }
719     if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerStartMarginArgs, dividerStartMargin) ||
720         LessNotEqual(dividerStartMargin.Value(), 0.0f) || dividerStartMargin.Unit() == DimensionUnit::PERCENT) {
721         dividerStartMargin.Reset();
722     }
723     if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerEndMarginArgs, dividerEndMargin) ||
724         LessNotEqual(dividerEndMargin.Value(), 0.0f) || dividerEndMargin.Unit() == DimensionUnit::PERCENT) {
725         dividerEndMargin.Reset();
726     }
727     uint32_t size = ARG_LENGTH;
728     ArkUI_Float32 values[size];
729     int32_t units[size];
730     values[LIST_ARG_INDEX_0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
731     values[LIST_ARG_INDEX_1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
732     values[LIST_ARG_INDEX_2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
733     units[LIST_ARG_INDEX_0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
734     units[LIST_ARG_INDEX_1] = static_cast<int32_t>(dividerStartMargin.Unit());
735     units[LIST_ARG_INDEX_2] = static_cast<int32_t>(dividerEndMargin.Unit());
736     GetArkUINodeModifiers()->getListModifier()->listSetDivider(nativeNode, color, values, units, size);
737 
738     return panda::JSValueRef::Undefined(vm);
739 }
740 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)741 ArkUINativeModuleValue ListBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
742 {
743     EcmaVM* vm = runtimeCallInfo->GetVM();
744     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
745     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
746     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
747     GetArkUINodeModifiers()->getListModifier()->listResetDivider(nativeNode);
748     return panda::JSValueRef::Undefined(vm);
749 }
750 
SetChainAnimationOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)751 ArkUINativeModuleValue ListBridge::SetChainAnimationOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
752 {
753     EcmaVM* vm = runtimeCallInfo->GetVM();
754     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
755     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
756     Local<JSValueRef> minSpaceArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_1);
757     Local<JSValueRef> maxSpaceArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_2);
758     Local<JSValueRef> conductivityArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_3);
759     Local<JSValueRef> intensityArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_4);
760     Local<JSValueRef> edgeEffectArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_5);
761     Local<JSValueRef> stiffnessArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_6);
762     Local<JSValueRef> dampingArgs = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_7);
763 
764     CalcDimension minSpace;
765     CalcDimension maxSpace;
766 
767     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
768     if (minSpaceArgs->IsUndefined() && maxSpaceArgs->IsUndefined() && conductivityArgs->IsUndefined() &&
769         intensityArgs->IsUndefined() && edgeEffectArgs->IsUndefined() && stiffnessArgs->IsUndefined() &&
770         dampingArgs->IsUndefined()) {
771         GetArkUINodeModifiers()->getListModifier()->resetChainAnimationOptions(nativeNode);
772         return panda::JSValueRef::Undefined(vm);
773     } else {
774         RefPtr<ListTheme> listTheme = ArkTSUtils::GetTheme<ListTheme>();
775         CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
776 
777         minSpace = listTheme->GetChainMinSpace();
778         maxSpace = listTheme->GetChainMaxSpace();
779         ArkUIChainAnimationOptionsType chainAnimationOptions;
780 
781         double conductivity;
782         double intensity;
783 
784         chainAnimationOptions.conductivity = listTheme->GetChainConductivity();
785         chainAnimationOptions.intensity = listTheme->GetChainIntensity();
786         chainAnimationOptions.edgeEffect = 0;
787         chainAnimationOptions.stiffness = listTheme->GetChainStiffness();
788         chainAnimationOptions.damping = listTheme->GetChainDamping();
789 
790         ArkTSUtils::ParseJsDimension(vm, minSpaceArgs, minSpace, DimensionUnit::VP);
791         ArkTSUtils::ParseJsDimension(vm, maxSpaceArgs, maxSpace, DimensionUnit::VP);
792         ArkTSUtils::ParseJsDouble(vm, conductivityArgs, conductivity);
793         chainAnimationOptions.conductivity = static_cast<ArkUI_Float32>(conductivity);
794 
795         ArkTSUtils::ParseJsDouble(vm, intensityArgs, intensity);
796         chainAnimationOptions.intensity = static_cast<ArkUI_Float32>(intensity);
797 
798         if (edgeEffectArgs->IsNumber()) {
799             chainAnimationOptions.edgeEffect = edgeEffectArgs->ToNumber(vm)->Value();
800         }
801 
802         double stiffness;
803         double damping;
804 
805         ArkTSUtils::ParseJsDouble(vm, stiffnessArgs, stiffness);
806         chainAnimationOptions.stiffness = static_cast<ArkUI_Float32>(stiffness);
807 
808         ArkTSUtils::ParseJsDouble(vm, dampingArgs, damping);
809         chainAnimationOptions.damping = static_cast<ArkUI_Float32>(damping);
810 
811         chainAnimationOptions.minSpace = minSpace.Value();
812         chainAnimationOptions.minSpaceUnits = static_cast<int32_t>(minSpace.Unit());
813         chainAnimationOptions.maxSpace = maxSpace.Value();
814         chainAnimationOptions.maxSpaceUnits = static_cast<int32_t>(maxSpace.Unit());
815 
816         GetArkUINodeModifiers()->getListModifier()->setChainAnimationOptions(nativeNode, &chainAnimationOptions);
817     }
818 
819     return panda::JSValueRef::Undefined(vm);
820 }
821 
ResetChainAnimationOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)822 ArkUINativeModuleValue ListBridge::ResetChainAnimationOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
823 {
824     EcmaVM* vm = runtimeCallInfo->GetVM();
825     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
826     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
827     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
828     GetArkUINodeModifiers()->getListModifier()->resetChainAnimationOptions(nativeNode);
829     return panda::JSValueRef::Undefined(vm);
830 }
831 
SetListChildrenMainSize(ArkUIRuntimeCallInfo * runtimeCallInfo)832 ArkUINativeModuleValue ListBridge::SetListChildrenMainSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
833 {
834     EcmaVM* vm = runtimeCallInfo->GetVM();
835     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
836     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
837     // 2: argument count.
838     if (info.Length() != 2 || !(info[1]->IsObject())) {
839         return panda::JSValueRef::Undefined(vm);
840     }
841     JSList::SetChildrenMainSize(Framework::JSRef<Framework::JSObject>::Cast(info[1]));
842 
843     return panda::JSValueRef::Undefined(vm);
844 }
845 
ResetListChildrenMainSize(ArkUIRuntimeCallInfo * runtimeCallInfo)846 ArkUINativeModuleValue ListBridge::ResetListChildrenMainSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
847 {
848     EcmaVM* vm = runtimeCallInfo->GetVM();
849     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
850     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(LIST_ARG_INDEX_0);
851     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
852     GetArkUINodeModifiers()->getListModifier()->resetListChildrenMainSize(nativeNode);
853 
854     return panda::JSValueRef::Undefined(vm);
855 }
856 
SetInitialIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)857 ArkUINativeModuleValue ListBridge::SetInitialIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
858 {
859     EcmaVM* vm = runtimeCallInfo->GetVM();
860     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
861     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
862     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
863     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
864     int32_t index = secondArg->ToNumber(vm)->Value();
865     GetArkUINodeModifiers()->getListModifier()->setInitialIndex(nativeNode, index);
866     return panda::JSValueRef::Undefined(vm);
867 }
868 
ResetInitialIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)869 ArkUINativeModuleValue ListBridge::ResetInitialIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
870 {
871     EcmaVM* vm = runtimeCallInfo->GetVM();
872     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
873     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
874     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
875     GetArkUINodeModifiers()->getListModifier()->resetInitialIndex(nativeNode);
876     return panda::JSValueRef::Undefined(vm);
877 }
878 
SetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)879 ArkUINativeModuleValue ListBridge::SetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
880 {
881     EcmaVM* vm = runtimeCallInfo->GetVM();
882     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
883     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
884     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
885     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
886     float space = secondArg->ToNumber(vm)->Value();
887     GetArkUINodeModifiers()->getListModifier()->setListSpace(nativeNode, space);
888     return panda::JSValueRef::Undefined(vm);
889 }
890 
ResetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)891 ArkUINativeModuleValue ListBridge::ResetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
892 {
893     EcmaVM* vm = runtimeCallInfo->GetVM();
894     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
895     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
896     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
897     GetArkUINodeModifiers()->getListModifier()->resetListSpace(nativeNode);
898     return panda::JSValueRef::Undefined(vm);
899 }
900 
SetInitialScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)901 ArkUINativeModuleValue ListBridge::SetInitialScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
902 {
903     EcmaVM* vm = runtimeCallInfo->GetVM();
904     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
905     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
906     Framework::JSRef<Framework::JSVal> args = info[1];
907     if (args->IsObject()) {
908         Framework::JSScroller* scroller =
909             Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSScroller>();
910         RefPtr<Framework::JSScroller> jsScroller = Referenced::Claim(scroller);
911         jsScroller->SetInstanceId(Container::CurrentId());
912         SetScroller(runtimeCallInfo, jsScroller);
913     }
914     return panda::JSValueRef::Undefined(vm);
915 }
916 
ResetInitialScroller(ArkUIRuntimeCallInfo * runtimeCallInfo)917 ArkUINativeModuleValue ListBridge::ResetInitialScroller(ArkUIRuntimeCallInfo* runtimeCallInfo)
918 {
919     EcmaVM* vm = runtimeCallInfo->GetVM();
920     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
921     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
922     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
923     GetArkUINodeModifiers()->getListModifier()->resetInitialScroller(nativeNode);
924     return panda::JSValueRef::Undefined(vm);
925 }
926 
SetScroller(ArkUIRuntimeCallInfo * runtimeCallInfo,RefPtr<Framework::JSScroller> jsScroller)927 void ListBridge::SetScroller(ArkUIRuntimeCallInfo* runtimeCallInfo, RefPtr<Framework::JSScroller> jsScroller)
928 {
929     if (jsScroller) {
930         EcmaVM* vm = runtimeCallInfo->GetVM();
931         Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
932         auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
933         RefPtr<ScrollControllerBase> listController = ListModel::GetInstance()->CreateScrollController();
934         jsScroller->SetController(listController);
935         auto proxy = jsScroller->GetScrollBarProxy();
936         if (!proxy) {
937             proxy = AceType::MakeRefPtr<NG::ScrollBarProxy>();
938             jsScroller->SetScrollBarProxy(proxy);
939         }
940         auto controller = reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(listController));
941         auto proxyPtr = reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(proxy));
942         GetArkUINodeModifiers()->getListModifier()->setInitialScroller(nativeNode, controller, proxyPtr);
943     }
944 }
945 
SetOnScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)946 ArkUINativeModuleValue ListBridge::SetOnScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
947 {
948     EcmaVM *vm = runtimeCallInfo->GetVM();
949     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
950     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
951     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
952     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
953     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
954         GetArkUINodeModifiers()->getListModifier()->resetOnListScrollIndex(nativeNode);
955         return panda::JSValueRef::Undefined(vm);
956     }
957     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
958     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
959     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
960 
961     std::function<void(int32_t, int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
962                                                                   const int32_t start, const int32_t end,
963                                                                   const int32_t center) {
964         panda::LocalScope pandaScope(vm);
965         panda::TryCatch trycatch(vm);
966         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
967 
968         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, start);
969         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, end);
970         panda::Local<panda::NumberRef> centerParam = panda::NumberRef::New(vm, center);
971         // 3: Array length
972         panda::Local<panda::JSValueRef> params[3] = { startParam, endParam, centerParam };
973         func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
974     };
975     GetArkUINodeModifiers()->getListModifier()->setOnListScrollIndexCallBack(
976         nativeNode, reinterpret_cast<void*>(&callback));
977     return panda::JSValueRef::Undefined(vm);
978 }
979 
SetListItemIndex(const EcmaVM * vm,const ListItemIndex indexInfo)980 Local<panda::ObjectRef> SetListItemIndex(const EcmaVM* vm, const ListItemIndex indexInfo)
981 {
982     const char* keys[] = { "index", "itemIndexInGroup", "itemGroupArea" };
983     auto indexInGroup = panda::NumberRef::Undefined(vm);
984     if (indexInfo.indexInGroup != -1) {
985         indexInGroup = panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.indexInGroup));
986     }
987     auto area = panda::NumberRef::Undefined(vm);
988     if (indexInfo.area != -1) {
989         area = panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.area));
990     }
991     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(indexInfo.index)), indexInGroup,
992         area };
993     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
994 }
995 
SetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo * runtimeCallInfo)996 ArkUINativeModuleValue ListBridge::SetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
997 {
998     EcmaVM *vm = runtimeCallInfo->GetVM();
999     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1000     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1001     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1002     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1003     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1004         GetArkUINodeModifiers()->getListModifier()->resetOnScrollVisibleContentChange(nativeNode);
1005         return panda::JSValueRef::Undefined(vm);
1006     }
1007     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1008     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1009     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1010 
1011     std::function<void(ListItemIndex, ListItemIndex)> callback =
1012         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1013             const ListItemIndex start, const ListItemIndex end) {
1014         panda::LocalScope pandaScope(vm);
1015         panda::TryCatch trycatch(vm);
1016         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1017 
1018         auto startParam = SetListItemIndex(vm, start);
1019         auto endParam = SetListItemIndex(vm, end);
1020         startParam->SetNativePointerFieldCount(vm, 1);
1021         startParam->SetNativePointerField(vm, 0, static_cast<void*>(&startParam));
1022         endParam->SetNativePointerFieldCount(vm, 1);
1023         endParam->SetNativePointerField(vm, 0, static_cast<void*>(&endParam));
1024         // 2: Array length
1025         panda::Local<panda::JSValueRef> params[2] = { startParam, endParam };
1026         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1027     };
1028     GetArkUINodeModifiers()->getListModifier()->setOnScrollVisibleContentChange(
1029         nativeNode, reinterpret_cast<void*>(&callback));
1030     return panda::JSValueRef::Undefined(vm);
1031 }
1032 
SetOnItemMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1033 ArkUINativeModuleValue ListBridge::SetOnItemMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1034 {
1035     EcmaVM *vm = runtimeCallInfo->GetVM();
1036     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1037     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1038     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1039     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1040     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1041         GetArkUINodeModifiers()->getListModifier()->resetOnItemMove(nativeNode);
1042         return panda::JSValueRef::Undefined(vm);
1043     }
1044     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1045     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1046     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1047 
1048     std::function<bool(int32_t, int32_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1049                                                          int32_t start, int32_t end) -> bool {
1050         panda::LocalScope pandaScope(vm);
1051         panda::TryCatch trycatch(vm);
1052         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1053 
1054         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, start);
1055         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, end);
1056         // 2: Array length
1057         panda::Local<panda::JSValueRef> params[2] = { startParam, endParam};
1058         auto result =  func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1059         if (result->IsBoolean()) {
1060             return result->ToBoolean(vm)->Value();
1061         }
1062         return false;
1063     };
1064     GetArkUINodeModifiers()->getListModifier()->setOnItemMove(
1065         nativeNode, reinterpret_cast<void*>(&callback));
1066     return panda::JSValueRef::Undefined(vm);
1067 }
1068 
SetOnItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1069 ArkUINativeModuleValue ListBridge::SetOnItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1070 {
1071     EcmaVM *vm = runtimeCallInfo->GetVM();
1072     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1073     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1074     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1075     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1076     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1077 
1078     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1079     if (!info[1]->IsFunction()) {
1080         return panda::JSValueRef::Undefined(vm);
1081     }
1082 
1083     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1084     std::function<RefPtr<AceType>(const ItemDragInfo&, int32_t)> callback =
1085         [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1086             const ItemDragInfo& dragInfo, int32_t itemIndex) -> RefPtr<AceType> {
1087         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx, nullptr);
1088         panda::LocalScope pandaScope(vm);
1089         panda::TryCatch trycatch(vm);
1090 
1091         auto ret = func->ItemDragStartExecute(dragInfo, itemIndex);
1092         if (!ret->IsFunction()) {
1093             return nullptr;
1094         }
1095 
1096         auto builderFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSFunc>::Cast(ret));
1097         if (!builderFunc) {
1098             return nullptr;
1099         }
1100         // use another VSP instance while executing the builder function
1101         ViewStackModel::GetInstance()->NewScope();
1102         {
1103             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1104             builderFunc->Execute();
1105         }
1106         return ViewStackModel::GetInstance()->Finish();
1107     };
1108     GetArkUINodeModifiers()->getListModifier()->setOnItemDragStart(nativeNode, reinterpret_cast<void*>(&callback));
1109     return panda::JSValueRef::Undefined(vm);
1110 }
1111 
SetOnItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1112 ArkUINativeModuleValue ListBridge::SetOnItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1113 {
1114     EcmaVM *vm = runtimeCallInfo->GetVM();
1115     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1116     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1117     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1118     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1119     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1120 
1121     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1122     if (!info[1]->IsFunction()) {
1123         return panda::JSValueRef::Undefined(vm);
1124     }
1125     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1126 
1127     std::function<void(const ItemDragInfo&)> callback = [vm, frameNode, func = std::move(jsOnDragFunc),
1128                                                       execCtx = info.GetExecutionContext()](
1129                                                       const ItemDragInfo& dragInfo) {
1130         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1131         panda::LocalScope pandaScope(vm);
1132         panda::TryCatch trycatch(vm);
1133 
1134         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1135         func->ItemDragEnterExecute(dragInfo);
1136     };
1137     GetArkUINodeModifiers()->getListModifier()->setOnItemDragEnter(nativeNode, reinterpret_cast<void*>(&callback));
1138     return panda::JSValueRef::Undefined(vm);
1139 }
1140 
SetOnItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1141 ArkUINativeModuleValue ListBridge::SetOnItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1142 {
1143     EcmaVM *vm = runtimeCallInfo->GetVM();
1144     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1145     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1146     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1147     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1148     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1149 
1150     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1151     if (!info[1]->IsFunction()) {
1152         return panda::JSValueRef::Undefined(vm);
1153     }
1154     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1155 
1156     std::function<void(const ItemDragInfo&, int32_t, int32_t)> callback =
1157         [vm, frameNode, func = std::move(jsOnDragFunc), execCtx = info.GetExecutionContext()](
1158             const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex) {
1159             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1160             panda::LocalScope pandaScope(vm);
1161             panda::TryCatch trycatch(vm);
1162 
1163             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1164             func->ItemDragMoveExecute(dragInfo, itemIndex, insertIndex);
1165         };
1166     GetArkUINodeModifiers()->getListModifier()->setOnItemDragMove(
1167         nativeNode, reinterpret_cast<void*>(&callback));
1168     return panda::JSValueRef::Undefined(vm);
1169 }
1170 
SetOnItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1171 ArkUINativeModuleValue ListBridge::SetOnItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1172 {
1173     EcmaVM *vm = runtimeCallInfo->GetVM();
1174     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1175     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1176     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1177     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1178     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1179 
1180     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1181     if (!info[1]->IsFunction()) {
1182         return panda::JSValueRef::Undefined(vm);
1183     }
1184     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1185 
1186     std::function<void(const ItemDragInfo&, int32_t)> callback = [vm, frameNode, func = std::move(jsOnDragFunc)](
1187                                const ItemDragInfo& dragInfo, int32_t itemIndex) {
1188         panda::LocalScope pandaScope(vm);
1189         panda::TryCatch trycatch(vm);
1190 
1191         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1192         func->ItemDragLeaveExecute(dragInfo, itemIndex);
1193     };
1194     GetArkUINodeModifiers()->getListModifier()->setOnItemDragLeave(nativeNode, reinterpret_cast<void*>(&callback));
1195     return panda::JSValueRef::Undefined(vm);
1196 }
1197 
SetOnItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1198 ArkUINativeModuleValue ListBridge::SetOnItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1199 {
1200     EcmaVM *vm = runtimeCallInfo->GetVM();
1201     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1202     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1203     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1204     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1205     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1206 
1207     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1208     if (!info[1]->IsFunction()) {
1209         return panda::JSValueRef::Undefined(vm);
1210     }
1211     RefPtr<JsDragFunction> jsOnDragFunc = AceType::MakeRefPtr<JsDragFunction>(JSRef<JSFunc>::Cast(info[1]));
1212 
1213     std::function<void(const ItemDragInfo&, int32_t, int32_t, bool)> callback =
1214         [vm, frameNode, func = std::move(jsOnDragFunc)](
1215             const ItemDragInfo& dragInfo, int32_t itemIndex, int32_t insertIndex, bool isSuccess) {
1216             panda::LocalScope pandaScope(vm);
1217             panda::TryCatch trycatch(vm);
1218 
1219             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1220             func->ItemDropExecute(dragInfo, itemIndex, insertIndex, isSuccess);
1221         };
1222     GetArkUINodeModifiers()->getListModifier()->setOnItemDrop(nativeNode, reinterpret_cast<void*>(&callback));
1223     return panda::JSValueRef::Undefined(vm);
1224 }
1225 
SetOnListScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1226 ArkUINativeModuleValue ListBridge::SetOnListScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1227 {
1228     EcmaVM *vm = runtimeCallInfo->GetVM();
1229     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1230     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1231     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1232     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1233     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1234         GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStart(nativeNode);
1235         return panda::JSValueRef::Undefined(vm);
1236     }
1237     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1238     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1239     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1240 
1241     std::function<void()> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1242         panda::LocalScope pandaScope(vm);
1243         panda::TryCatch trycatch(vm);
1244         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1245         func->Call(vm, func.ToLocal(), nullptr, 0);
1246     };
1247     GetArkUINodeModifiers()->getListModifier()->setOnListScrollStartCallBack(
1248         nativeNode, reinterpret_cast<void*>(&callback));
1249     return panda::JSValueRef::Undefined(vm);
1250 }
1251 
SetOnListScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1252 ArkUINativeModuleValue ListBridge::SetOnListScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1253 {
1254     EcmaVM *vm = runtimeCallInfo->GetVM();
1255     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1256     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1257     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1258     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1259     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1260         GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStop(nativeNode);
1261         return panda::JSValueRef::Undefined(vm);
1262     }
1263     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1264     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1265     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1266     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1267         panda::LocalScope pandaScope(vm);
1268         panda::TryCatch trycatch(vm);
1269         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1270         func->Call(vm, func.ToLocal(), nullptr, 0);
1271     };
1272     GetArkUINodeModifiers()->getListModifier()->setOnListScrollStopCallBack(
1273         nativeNode, reinterpret_cast<void*>(&callback));
1274     return panda::JSValueRef::Undefined(vm);
1275 }
1276 
SetOnListScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)1277 ArkUINativeModuleValue ListBridge::SetOnListScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1278 {
1279     EcmaVM* vm = runtimeCallInfo->GetVM();
1280     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1281     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1282     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1283     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1284     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1285         GetArkUINodeModifiers()->getListModifier()->resetOnListScrollFrameBegin(nativeNode);
1286         return panda::JSValueRef::Undefined(vm);
1287     }
1288     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1289     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1290     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1291     std::function<ScrollFrameResult(Dimension, ScrollState)> callback = [vm, frameNode,
1292         func = panda::CopyableGlobal(vm, func)](Dimension offset, ScrollState state) -> ScrollFrameResult {
1293         panda::LocalScope pandaScope(vm);
1294         panda::TryCatch trycatch(vm);
1295         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1296 
1297         panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
1298             vm, static_cast<double>(offset.ConvertToVp()));
1299         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
1300          // 2: Array length
1301         panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
1302         auto value = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1303 
1304         OHOS::Ace::ScrollFrameResult scrollRes { .offset = offset };
1305         if (value->IsNumber()) {
1306             scrollRes.offset = Dimension(value->ToNumber(vm)->Value(), DimensionUnit::VP);
1307         }
1308         if (value->IsObject(vm)) {
1309             auto resultObj = value->ToObject(vm);
1310             panda::Local<panda::JSValueRef> remain = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm,
1311                 "offsetRemain"));
1312             if (remain->IsNumber()) {
1313                 scrollRes.offset = Dimension(remain->ToNumber(vm)->Value(), DimensionUnit::VP);
1314             }
1315         }
1316         return scrollRes;
1317     };
1318     GetArkUINodeModifiers()->getListModifier()->setOnListScrollFrameBeginCallBack(
1319         nativeNode, reinterpret_cast<void*>(&callback));
1320     return panda::JSValueRef::Undefined(vm);
1321 }
1322 
SetOnListWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1323 ArkUINativeModuleValue ListBridge::SetOnListWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1324 {
1325     EcmaVM* vm = runtimeCallInfo->GetVM();
1326     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1327     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1328     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1329     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1330     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1331         GetArkUINodeModifiers()->getListModifier()->resetOnListWillScroll(nativeNode);
1332         return panda::JSValueRef::Undefined(vm);
1333     }
1334     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1335     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1336     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1337     std::function<ScrollFrameResult(CalcDimension, ScrollState, ScrollSource)> callback =
1338     [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const CalcDimension& scrollOffset,
1339                                 const ScrollState& scrollState, ScrollSource scrollSource) {
1340         panda::LocalScope pandaScope(vm);
1341         panda::TryCatch trycatch(vm);
1342         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1343 
1344         panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
1345             vm, static_cast<double>(scrollOffset.ConvertToVp()));
1346         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollState));
1347         panda::Local<panda::NumberRef> sourceParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollSource));
1348         // 3: Array length
1349         panda::Local<panda::JSValueRef> params[3] = { offsetParam, stateParam, sourceParam };
1350         auto result = func->Call(vm, func.ToLocal(), params, 3); // 4: Array length
1351         ScrollFrameResult scrollRes { .offset = scrollOffset };
1352 
1353         if (result->IsObject(vm)) {
1354             auto resultObj = result->ToObject(vm);
1355             panda::Local<panda::JSValueRef> dxRemainValue =
1356                 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "offsetRemain"));
1357             if (dxRemainValue->IsNumber()) {
1358                 scrollRes.offset = Dimension(dxRemainValue->ToNumber(vm)->Value(), DimensionUnit::VP);
1359             }
1360         }
1361         return scrollRes;
1362     };
1363     GetArkUINodeModifiers()->getListModifier()->setOnListWillScrollCallBack(
1364         nativeNode, reinterpret_cast<void*>(&callback));
1365     return panda::JSValueRef::Undefined(vm);
1366 }
1367 
SetOnListDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1368 ArkUINativeModuleValue ListBridge::SetOnListDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1369 {
1370     EcmaVM* vm = runtimeCallInfo->GetVM();
1371     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1372     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1373     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1374     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1375     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1376         GetArkUINodeModifiers()->getListModifier()->resetOnListDidScroll(nativeNode);
1377         return panda::JSValueRef::Undefined(vm);
1378     }
1379     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1380     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1381     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1382     std::function<void(Dimension, ScrollState)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
1383                             const CalcDimension& scrollOffset, const ScrollState& scrollState) {
1384         panda::LocalScope pandaScope(vm);
1385         panda::TryCatch trycatch(vm);
1386         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1387 
1388         panda::Local<panda::NumberRef> offsetParam =
1389             panda::NumberRef::New(vm, static_cast<double>(scrollOffset.ConvertToVp()));
1390         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(scrollState));
1391         // 2: Array length
1392         panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
1393         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
1394     };
1395     GetArkUINodeModifiers()->getListModifier()->setOnListDidScrollCallBack(
1396         nativeNode, reinterpret_cast<void*>(&callback));
1397     return panda::JSValueRef::Undefined(vm);
1398 }
1399 
SetOnListReachStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1400 ArkUINativeModuleValue ListBridge::SetOnListReachStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1401 {
1402     EcmaVM* vm = runtimeCallInfo->GetVM();
1403     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1404     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1405     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1406     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1407     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1408         GetArkUINodeModifiers()->getListModifier()->resetOnListReachStart(nativeNode);
1409         return panda::JSValueRef::Undefined(vm);
1410     }
1411     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1412     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1413     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1414     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1415         panda::LocalScope pandaScope(vm);
1416         panda::TryCatch trycatch(vm);
1417         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1418         func->Call(vm, func.ToLocal(), nullptr, 0);
1419     };
1420 
1421     GetArkUINodeModifiers()->getListModifier()->setOnListReachStartCallBack(
1422         nativeNode, reinterpret_cast<void*>(&callback));
1423     return panda::JSValueRef::Undefined(vm);
1424 }
1425 
SetOnListReachEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1426 ArkUINativeModuleValue ListBridge::SetOnListReachEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1427 {
1428     EcmaVM* vm = runtimeCallInfo->GetVM();
1429     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1430     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1431     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1432     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1433     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1434         GetArkUINodeModifiers()->getListModifier()->resetOnListReachEnd(nativeNode);
1435         return panda::JSValueRef::Undefined(vm);
1436     }
1437     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1438     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1439     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1440     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1441         panda::LocalScope pandaScope(vm);
1442         panda::TryCatch trycatch(vm);
1443         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1444         func->Call(vm, func.ToLocal(), nullptr, 0);
1445     };
1446 
1447     GetArkUINodeModifiers()->getListModifier()->setOnListReachEndCallBack(
1448         nativeNode, reinterpret_cast<void*>(&callback));
1449     return panda::JSValueRef::Undefined(vm);
1450 }
1451 
ResetOnScrollIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)1452 ArkUINativeModuleValue ListBridge::ResetOnScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
1453 {
1454     EcmaVM* vm = runtimeCallInfo->GetVM();
1455     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1456     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1457     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1458     GetArkUINodeModifiers()->getListModifier()->resetOnListScrollIndex(nativeNode);
1459     return panda::JSValueRef::Undefined(vm);
1460 }
1461 
ResetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1462 ArkUINativeModuleValue ListBridge::ResetOnScrollVisibleContentChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1463 {
1464     EcmaVM* vm = runtimeCallInfo->GetVM();
1465     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1466     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1467     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1468     GetArkUINodeModifiers()->getListModifier()->resetOnScrollVisibleContentChange(nativeNode);
1469     return panda::JSValueRef::Undefined(vm);
1470 }
1471 
ResetOnItemMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1472 ArkUINativeModuleValue ListBridge::ResetOnItemMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1473 {
1474     EcmaVM* vm = runtimeCallInfo->GetVM();
1475     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1476     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1477     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1478     GetArkUINodeModifiers()->getListModifier()->resetOnItemMove(nativeNode);
1479     return panda::JSValueRef::Undefined(vm);
1480 }
1481 
ResetOnItemDragStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1482 ArkUINativeModuleValue ListBridge::ResetOnItemDragStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1483 {
1484     EcmaVM* vm = runtimeCallInfo->GetVM();
1485     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1486     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1487     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1488     GetArkUINodeModifiers()->getListModifier()->resetOnItemDragStart(nativeNode);
1489     return panda::JSValueRef::Undefined(vm);
1490 }
1491 
ResetOnItemDragEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)1492 ArkUINativeModuleValue ListBridge::ResetOnItemDragEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1493 {
1494     EcmaVM* vm = runtimeCallInfo->GetVM();
1495     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1496     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1497     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1498     GetArkUINodeModifiers()->getListModifier()->resetOnItemDragEnter(nativeNode);
1499     return panda::JSValueRef::Undefined(vm);
1500 }
1501 
ResetOnItemDragMove(ArkUIRuntimeCallInfo * runtimeCallInfo)1502 ArkUINativeModuleValue ListBridge::ResetOnItemDragMove(ArkUIRuntimeCallInfo* runtimeCallInfo)
1503 {
1504     EcmaVM* vm = runtimeCallInfo->GetVM();
1505     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1506     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1507     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1508     GetArkUINodeModifiers()->getListModifier()->resetOnItemDragMove(nativeNode);
1509     return panda::JSValueRef::Undefined(vm);
1510 }
1511 
ResetOnItemDragLeave(ArkUIRuntimeCallInfo * runtimeCallInfo)1512 ArkUINativeModuleValue ListBridge::ResetOnItemDragLeave(ArkUIRuntimeCallInfo* runtimeCallInfo)
1513 {
1514     EcmaVM* vm = runtimeCallInfo->GetVM();
1515     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1516     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1517     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1518     GetArkUINodeModifiers()->getListModifier()->resetOnItemDragLeave(nativeNode);
1519     return panda::JSValueRef::Undefined(vm);
1520 }
1521 
ResetOnItemDrop(ArkUIRuntimeCallInfo * runtimeCallInfo)1522 ArkUINativeModuleValue ListBridge::ResetOnItemDrop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1523 {
1524     EcmaVM* vm = runtimeCallInfo->GetVM();
1525     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1526     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1527     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1528     GetArkUINodeModifiers()->getListModifier()->resetOnItemDrop(nativeNode);
1529     return panda::JSValueRef::Undefined(vm);
1530 }
1531 
ResetOnListScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1532 ArkUINativeModuleValue ListBridge::ResetOnListScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1533 {
1534     EcmaVM* vm = runtimeCallInfo->GetVM();
1535     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1536     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1537     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1538     GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStart(nativeNode);
1539     return panda::JSValueRef::Undefined(vm);
1540 }
1541 
ResetOnListScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1542 ArkUINativeModuleValue ListBridge::ResetOnListScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1543 {
1544     EcmaVM* vm = runtimeCallInfo->GetVM();
1545     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1546     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1547     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1548     GetArkUINodeModifiers()->getListModifier()->resetOnListScrollStop(nativeNode);
1549     return panda::JSValueRef::Undefined(vm);
1550 }
1551 
ResetOnListScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)1552 ArkUINativeModuleValue ListBridge::ResetOnListScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1553 {
1554     EcmaVM* vm = runtimeCallInfo->GetVM();
1555     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1556     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1557     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1558     GetArkUINodeModifiers()->getListModifier()->resetOnListScrollFrameBegin(nativeNode);
1559     return panda::JSValueRef::Undefined(vm);
1560 }
1561 
ResetOnListWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1562 ArkUINativeModuleValue ListBridge::ResetOnListWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1563 {
1564     EcmaVM* vm = runtimeCallInfo->GetVM();
1565     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1566     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1567     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1568     GetArkUINodeModifiers()->getListModifier()->resetOnListWillScroll(nativeNode);
1569     return panda::JSValueRef::Undefined(vm);
1570 }
1571 
ResetOnListDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1572 ArkUINativeModuleValue ListBridge::ResetOnListDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1573 {
1574     EcmaVM* vm = runtimeCallInfo->GetVM();
1575     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1576     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1577     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1578     GetArkUINodeModifiers()->getListModifier()->resetOnListDidScroll(nativeNode);
1579     return panda::JSValueRef::Undefined(vm);
1580 }
1581 
ResetOnListReachStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1582 ArkUINativeModuleValue ListBridge::ResetOnListReachStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1583 {
1584     EcmaVM* vm = runtimeCallInfo->GetVM();
1585     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1586     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1587     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1588     GetArkUINodeModifiers()->getListModifier()->resetOnListReachStart(nativeNode);
1589     return panda::JSValueRef::Undefined(vm);
1590 }
1591 
ResetOnListReachEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1592 ArkUINativeModuleValue ListBridge::ResetOnListReachEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1593 {
1594     EcmaVM* vm = runtimeCallInfo->GetVM();
1595     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1596     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1597     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1598     GetArkUINodeModifiers()->getListModifier()->resetOnListReachEnd(nativeNode);
1599     return panda::JSValueRef::Undefined(vm);
1600 }
1601 } // namespace OHOS::Ace::NG