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_item_group_bridge.h"
16 #include "core/components_ng/pattern/list/list_item_group_model_ng.h"
17 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
18 #include "frameworks/bridge/declarative_frontend/jsview/js_list_item_group.h"
19 using namespace OHOS::Ace::Framework;
20 
21 namespace OHOS::Ace::NG {
22 constexpr int32_t NODE_INDEX = 0;
23 constexpr int32_t STROKE_WIDTH_INDEX = 1;
24 constexpr int32_t COLOR_INDEX = 2;
25 constexpr int32_t START_MARGIN_INDEX = 3;
26 constexpr int32_t END_MARGIN_INDEX = 4;
27 
28 constexpr int32_t ARG_GROUP_LENGTH = 3;
29 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)30 ArkUINativeModuleValue ListItemGroupBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
31 {
32     EcmaVM* vm = runtimeCallInfo->GetVM();
33     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
34     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
35     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
36     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(STROKE_WIDTH_INDEX);
37     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(COLOR_INDEX);
38     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(START_MARGIN_INDEX);
39     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(END_MARGIN_INDEX);
40     if (dividerStrokeWidthArgs->IsUndefined() && dividerStartMarginArgs->IsUndefined() &&
41         dividerEndMarginArgs->IsUndefined() && colorArg->IsUndefined()) {
42         GetArkUINodeModifiers()->getListItemGroupModifier()->listItemGroupResetDivider(nativeNode);
43         return panda::JSValueRef::Undefined(vm);
44     }
45 
46     CalcDimension dividerStrokeWidth;
47     CalcDimension dividerStartMargin;
48     CalcDimension dividerEndMargin;
49     uint32_t color;
50     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
51     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
52     auto context = frameNode->GetContext();
53     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
54     auto themeManager = context->GetThemeManager();
55     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
56     auto listTheme = themeManager->GetTheme<ListTheme>();
57     CHECK_NULL_RETURN(listTheme, panda::NativePointerRef::New(vm, nullptr));
58 
59     if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerStrokeWidthArgs, dividerStrokeWidth, true) ||
60         LessNotEqual(dividerStrokeWidth.Value(), 0.0f) || dividerStrokeWidth.Unit() == DimensionUnit::PERCENT) {
61         dividerStrokeWidth.Reset();
62     }
63 
64     Color colorObj;
65     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
66         color = listTheme->GetDividerColor().GetValue();
67     } else {
68         color = colorObj.GetValue();
69     }
70     if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerStartMarginArgs, dividerStartMargin) ||
71         LessNotEqual(dividerStartMargin.Value(), 0.0f) || dividerStartMargin.Unit() == DimensionUnit::PERCENT) {
72         dividerStartMargin.Reset();
73     }
74     if (!ArkTSUtils::ParseJsDimensionVp(vm, dividerEndMarginArgs, dividerEndMargin) ||
75         LessNotEqual(dividerEndMargin.Value(), 0.0f) || dividerEndMargin.Unit() == DimensionUnit::PERCENT) {
76         dividerEndMargin.Reset();
77     }
78     uint32_t size = ARG_GROUP_LENGTH;
79     ArkUI_Float32 values[size];
80     int32_t units[size];
81     values[NODE_INDEX] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
82     values[STROKE_WIDTH_INDEX] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
83     values[COLOR_INDEX] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
84     units[NODE_INDEX] = static_cast<int32_t>(dividerStrokeWidth.Unit());
85     units[STROKE_WIDTH_INDEX] = static_cast<int32_t>(dividerStartMargin.Unit());
86     units[COLOR_INDEX] = static_cast<int32_t>(dividerEndMargin.Unit());
87     GetArkUINodeModifiers()->getListItemGroupModifier()->listItemGroupSetDivider(
88         nativeNode, color, values, units, size);
89 
90     return panda::JSValueRef::Undefined(vm);
91 }
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)92 ArkUINativeModuleValue ListItemGroupBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
93 {
94     EcmaVM* vm = runtimeCallInfo->GetVM();
95     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
96     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
97     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
98     GetArkUINodeModifiers()->getListItemGroupModifier()->listItemGroupResetDivider(nativeNode);
99     return panda::JSValueRef::Undefined(vm);
100 }
101 
SetChildrenMainSize(ArkUIRuntimeCallInfo * runtimeCallInfo)102 ArkUINativeModuleValue ListItemGroupBridge::SetChildrenMainSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
103 {
104     EcmaVM* vm = runtimeCallInfo->GetVM();
105     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
106     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
107     // 2: argument count.
108     if (info.Length() != 2 || !(info[1]->IsObject())) {
109         return panda::JSValueRef::Undefined(vm);
110     }
111     JSListItemGroup::SetChildrenMainSize(Framework::JSRef<Framework::JSObject>::Cast(info[1]));
112 
113     return panda::JSValueRef::Undefined(vm);
114 }
115 
ResetChildrenMainSize(ArkUIRuntimeCallInfo * runtimeCallInfo)116 ArkUINativeModuleValue ListItemGroupBridge::ResetChildrenMainSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
117 {
118     EcmaVM* vm = runtimeCallInfo->GetVM();
119     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
120     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
121     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
122     GetArkUINodeModifiers()->getListItemGroupModifier()->resetListItemGroupChildrenMainSize(nativeNode);
123 
124     return panda::JSValueRef::Undefined(vm);
125 }
126 
SetListItemGroupInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)127 ArkUINativeModuleValue ListItemGroupBridge::SetListItemGroupInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
128 {
129     EcmaVM* vm = runtimeCallInfo->GetVM();
130     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
131     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
132     Local<JSValueRef> spaceArg = runtimeCallInfo->GetCallArgRef(1); //1 is index of space
133     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(2); //2 is index of style
134     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
135 
136     double space = 0.0;
137     if (spaceArg->IsObject(vm) || !ArkTSUtils::ParseJsDouble(vm, spaceArg, space) || LessNotEqual(space, 0.0)) {
138         space = 0.0;
139     }
140     GetArkUINodeModifiers()->getListItemGroupModifier()->setListItemGroupSpace(nativeNode, space);
141 
142     if (styleArg->IsUndefined() || styleArg->IsNull() || !styleArg->IsNumber()) {
143         GetArkUINodeModifiers()->getListItemGroupModifier()->resetListItemGroupStyle(nativeNode);
144     } else {
145         uint32_t style = styleArg->Uint32Value(vm);
146         if (style < static_cast<uint32_t>(V2::ListItemGroupStyle::NONE) ||
147             style > static_cast<uint32_t>(V2::ListItemGroupStyle::CARD)) {
148             style = static_cast<uint32_t>(V2::ListItemGroupStyle::NONE);
149         }
150         GetArkUINodeModifiers()->getListItemGroupModifier()->setListItemGroupStyle(nativeNode, style);
151     }
152 
153     return panda::JSValueRef::Undefined(vm);
154 }
155 
ResetListItemGroupInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)156 ArkUINativeModuleValue ListItemGroupBridge::ResetListItemGroupInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
157 {
158     EcmaVM* vm = runtimeCallInfo->GetVM();
159     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
160     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
161     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
162     GetArkUINodeModifiers()->getListItemGroupModifier()->resetListItemGroupSpace(nativeNode);
163     GetArkUINodeModifiers()->getListItemGroupModifier()->resetListItemGroupStyle(nativeNode);
164 
165     return panda::JSValueRef::Undefined(vm);
166 }
167 } // namespace OHOS::Ace::NG