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