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