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 "core/interfaces/native/node/checkboxgroup_modifier.h"
16
17 #include "core/pipeline/base/element_register.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/base/view_abstract.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components_ng/pattern/checkboxgroup/checkboxgroup_model_ng.h"
22 #include "frameworks/core/components/checkable/checkable_theme.h"
23
24 namespace OHOS::Ace::NG {
25 static uint32_t ERROR_UINT_CODE = -1;
26 static const float ERROR_FLOAT_CODE = -1.0f;
27 static const int32_t ERROR_INT_CODE = -1;
28 static std::string groupNameValue;
29 const DimensionUnit DEFAULT_UNIT = DimensionUnit::VP;
SetCheckboxGroupSelectedColor(ArkUINodeHandle node,uint32_t color)30 void SetCheckboxGroupSelectedColor(ArkUINodeHandle node, uint32_t color)
31 {
32 auto* frameNode = reinterpret_cast<FrameNode*>(node);
33 CHECK_NULL_VOID(frameNode);
34 CheckBoxGroupModelNG::SetSelectedColor(frameNode, Color(color));
35 }
36
ResetCheckboxGroupSelectedColor(ArkUINodeHandle node)37 void ResetCheckboxGroupSelectedColor(ArkUINodeHandle node)
38 {
39 auto* frameNode = reinterpret_cast<FrameNode*>(node);
40 CHECK_NULL_VOID(frameNode);
41 auto context = frameNode->GetContext();
42 CHECK_NULL_VOID(context);
43 auto themeManager = context->GetThemeManager();
44 CHECK_NULL_VOID(themeManager);
45 auto checkBoxTheme = themeManager->GetTheme<CheckboxTheme>();
46 CheckBoxGroupModelNG::SetSelectedColor(frameNode, checkBoxTheme->GetActiveColor());
47 }
48
SetCheckboxGroupUnSelectedColor(ArkUINodeHandle node,uint32_t color)49 void SetCheckboxGroupUnSelectedColor(ArkUINodeHandle node, uint32_t color)
50 {
51 auto* frameNode = reinterpret_cast<FrameNode*>(node);
52 CHECK_NULL_VOID(frameNode);
53 CheckBoxGroupModelNG::SetUnSelectedColor(frameNode, Color(color));
54 }
55
ResetCheckboxGroupUnSelectedColor(ArkUINodeHandle node)56 void ResetCheckboxGroupUnSelectedColor(ArkUINodeHandle node)
57 {
58 auto* frameNode = reinterpret_cast<FrameNode*>(node);
59 CHECK_NULL_VOID(frameNode);
60 auto context = frameNode->GetContext();
61 CHECK_NULL_VOID(context);
62 auto themeManager = context->GetThemeManager();
63 CHECK_NULL_VOID(themeManager);
64 auto checkBoxTheme = themeManager->GetTheme<CheckboxTheme>();
65 CheckBoxGroupModelNG::SetUnSelectedColor(frameNode, checkBoxTheme->GetInactiveColor());
66 }
67
SetCheckboxGroupSelectAll(ArkUINodeHandle node,ArkUI_Bool isSelected)68 void SetCheckboxGroupSelectAll(ArkUINodeHandle node, ArkUI_Bool isSelected)
69 {
70 auto* frameNode = reinterpret_cast<FrameNode*>(node);
71 CHECK_NULL_VOID(frameNode);
72 CheckBoxGroupModelNG::SetSelectAll(frameNode, isSelected);
73 }
74
ResetCheckboxGroupSelectAll(ArkUINodeHandle node)75 void ResetCheckboxGroupSelectAll(ArkUINodeHandle node)
76 {
77 auto* frameNode = reinterpret_cast<FrameNode*>(node);
78 CHECK_NULL_VOID(frameNode);
79 CheckBoxGroupModelNG::SetSelectAll(frameNode, false);
80 }
81
SetCheckboxGroupWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)82 void SetCheckboxGroupWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
83 {
84 auto *frameNode = reinterpret_cast<FrameNode *>(node);
85 CHECK_NULL_VOID(frameNode);
86 auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
87 if (unitEnum == DimensionUnit::CALC) {
88 ViewAbstract::SetWidth(
89 frameNode, CalcLength(CalcLength(std::string(calcValue))));
90 } else {
91 ViewAbstract::SetWidth(frameNode, CalcLength(value, unitEnum));
92 }
93 }
94
ResetCheckboxGroupWidth(ArkUINodeHandle node)95 void ResetCheckboxGroupWidth(ArkUINodeHandle node)
96 {
97 auto* frameNode = reinterpret_cast<FrameNode*>(node);
98 CHECK_NULL_VOID(frameNode);
99 ViewAbstract::ClearWidthOrHeight(frameNode, true);
100 }
101
SetCheckboxGroupHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)102 void SetCheckboxGroupHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
103 {
104 auto *frameNode = reinterpret_cast<FrameNode *>(node);
105 CHECK_NULL_VOID(frameNode);
106 auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
107 if (unitEnum == DimensionUnit::CALC) {
108 ViewAbstract::SetHeight(
109 frameNode, CalcLength(CalcLength(std::string(calcValue))));
110 } else {
111 ViewAbstract::SetHeight(frameNode, CalcLength(value, unitEnum));
112 }
113 }
114
ResetCheckboxGroupHeight(ArkUINodeHandle node)115 void ResetCheckboxGroupHeight(ArkUINodeHandle node)
116 {
117 auto* frameNode = reinterpret_cast<FrameNode*>(node);
118 CHECK_NULL_VOID(frameNode);
119 ViewAbstract::ClearWidthOrHeight(frameNode, false);
120 }
121
SetCheckboxGroupMark(ArkUINodeHandle node,uint32_t color,ArkUI_Float32 sizeValue,ArkUI_Float32 widthValue)122 void SetCheckboxGroupMark(ArkUINodeHandle node, uint32_t color, ArkUI_Float32 sizeValue, ArkUI_Float32 widthValue)
123 {
124 auto* frameNode = reinterpret_cast<FrameNode*>(node);
125 CHECK_NULL_VOID(frameNode);
126 CheckBoxGroupModelNG::SetCheckMarkColor(frameNode, Color(color));
127
128 Dimension size = Dimension(sizeValue, DEFAULT_UNIT);
129 CheckBoxGroupModelNG::SetCheckMarkSize(frameNode, size);
130
131 Dimension width = Dimension(widthValue, DEFAULT_UNIT);
132 CheckBoxGroupModelNG::SetCheckMarkWidth(frameNode, width);
133 }
134
ResetCheckboxGroupMark(ArkUINodeHandle node)135 void ResetCheckboxGroupMark(ArkUINodeHandle node)
136 {
137 auto* frameNode = reinterpret_cast<FrameNode*>(node);
138 CHECK_NULL_VOID(frameNode);
139 auto context = frameNode->GetContext();
140 CHECK_NULL_VOID(context);
141 auto themeManager = context->GetThemeManager();
142 CHECK_NULL_VOID(themeManager);
143 auto checkBoxTheme = themeManager->GetTheme<CheckboxTheme>();
144
145 CheckBoxGroupModelNG::SetCheckMarkColor(frameNode, checkBoxTheme->GetPointColor());
146
147 Dimension size = Dimension(-1.0f);
148 CheckBoxGroupModelNG::SetCheckMarkSize(frameNode, size);
149
150 CheckBoxGroupModelNG::SetCheckMarkWidth(frameNode, checkBoxTheme->GetCheckStroke());
151 }
152
SetCheckboxGroupStyle(ArkUINodeHandle node,ArkUI_Int32 style)153 void SetCheckboxGroupStyle(ArkUINodeHandle node, ArkUI_Int32 style)
154 {
155 auto* frameNode = reinterpret_cast<FrameNode*>(node);
156 CHECK_NULL_VOID(frameNode);
157 CheckBoxGroupModelNG::SetCheckboxGroupStyle(frameNode, static_cast<CheckBoxStyle>(style));
158 }
159
ResetCheckboxGroupStyle(ArkUINodeHandle node)160 void ResetCheckboxGroupStyle(ArkUINodeHandle node)
161 {
162 auto* frameNode = reinterpret_cast<FrameNode*>(node);
163 CHECK_NULL_VOID(frameNode);
164 CheckBoxGroupModelNG::SetCheckboxGroupStyle(frameNode, CheckBoxStyle::CIRCULAR_STYLE);
165 }
166
SetCheckboxGroupName(ArkUINodeHandle node,ArkUI_CharPtr group)167 void SetCheckboxGroupName(ArkUINodeHandle node, ArkUI_CharPtr group)
168 {
169 CHECK_NULL_VOID(group);
170 auto* frameNode = reinterpret_cast<FrameNode*>(node);
171 CHECK_NULL_VOID(frameNode);
172 CheckBoxGroupModelNG::SetCheckboxGroupName(frameNode, std::string(group));
173 }
174
GetCheckboxGroupName(ArkUINodeHandle node)175 ArkUI_CharPtr GetCheckboxGroupName(ArkUINodeHandle node)
176 {
177 auto *frameNode = reinterpret_cast<FrameNode *>(node);
178 CHECK_NULL_RETURN(frameNode, "");
179 groupNameValue = CheckBoxGroupModelNG::GetCheckboxGroupName(frameNode);
180 return groupNameValue.c_str();
181 }
182
GetCheckboxGroupSelectAll(ArkUINodeHandle node)183 ArkUI_Bool GetCheckboxGroupSelectAll(ArkUINodeHandle node)
184 {
185 auto *frameNode = reinterpret_cast<FrameNode *>(node);
186 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
187 return static_cast<ArkUI_Bool>(CheckBoxGroupModelNG::GetSelect(frameNode));
188 }
189
GetCheckboxGroupSelectedColor(ArkUINodeHandle node)190 ArkUI_Uint32 GetCheckboxGroupSelectedColor(ArkUINodeHandle node)
191 {
192 auto *frameNode = reinterpret_cast<FrameNode *>(node);
193 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
194 return CheckBoxGroupModelNG::GetSelectedColor(frameNode).GetValue();
195 }
196
GetCheckboxGroupUnSelectedColor(ArkUINodeHandle node)197 ArkUI_Uint32 GetCheckboxGroupUnSelectedColor(ArkUINodeHandle node)
198 {
199 auto *frameNode = reinterpret_cast<FrameNode *>(node);
200 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
201 return CheckBoxGroupModelNG::GetUnSelectedColor(frameNode).GetValue();
202 }
203
GetCheckboxGroupMarkColor(ArkUINodeHandle node)204 ArkUI_Uint32 GetCheckboxGroupMarkColor(ArkUINodeHandle node)
205 {
206 auto *frameNode = reinterpret_cast<FrameNode *>(node);
207 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
208 return CheckBoxGroupModelNG::GetCheckMarkColor(frameNode).GetValue();
209 }
210
GetCheckboxGroupMarkSize(ArkUINodeHandle node)211 ArkUI_Float64 GetCheckboxGroupMarkSize(ArkUINodeHandle node)
212 {
213 auto *frameNode = reinterpret_cast<FrameNode *>(node);
214 CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
215 return CheckBoxGroupModelNG::GetCheckMarkSize(frameNode).Value();
216 }
217
GetCheckboxGroupMarkWidth(ArkUINodeHandle node)218 ArkUI_Float64 GetCheckboxGroupMarkWidth(ArkUINodeHandle node)
219 {
220 auto *frameNode = reinterpret_cast<FrameNode *>(node);
221 CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
222 return CheckBoxGroupModelNG::GetCheckMarkWidth(frameNode).Value();
223 }
224
GetCheckboxGroupStyle(ArkUINodeHandle node)225 ArkUI_Int32 GetCheckboxGroupStyle(ArkUINodeHandle node)
226 {
227 auto *frameNode = reinterpret_cast<FrameNode *>(node);
228 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
229 return static_cast<ArkUI_Int32>(CheckBoxGroupModelNG::GetCheckboxGroupStyle(frameNode));
230 }
231
232 namespace NodeModifier {
GetCheckboxGroupModifier()233 const ArkUICheckboxGroupModifier* GetCheckboxGroupModifier()
234 {
235 static const ArkUICheckboxGroupModifier modifier = { SetCheckboxGroupSelectedColor,
236 ResetCheckboxGroupSelectedColor, SetCheckboxGroupUnSelectedColor, ResetCheckboxGroupUnSelectedColor,
237 SetCheckboxGroupSelectAll, ResetCheckboxGroupSelectAll, SetCheckboxGroupWidth, ResetCheckboxGroupWidth,
238 SetCheckboxGroupHeight, ResetCheckboxGroupHeight, SetCheckboxGroupMark, ResetCheckboxGroupMark,
239 SetCheckboxGroupStyle, ResetCheckboxGroupStyle, SetCheckboxGroupName, GetCheckboxGroupName,
240 GetCheckboxGroupSelectAll, GetCheckboxGroupSelectedColor, GetCheckboxGroupUnSelectedColor,
241 GetCheckboxGroupMarkColor, GetCheckboxGroupMarkSize, GetCheckboxGroupMarkWidth, GetCheckboxGroupStyle };
242 return &modifier;
243 }
244
GetCJUICheckboxGroupModifier()245 const CJUICheckboxGroupModifier* GetCJUICheckboxGroupModifier()
246 {
247 static const CJUICheckboxGroupModifier modifier = { SetCheckboxGroupSelectedColor,
248 ResetCheckboxGroupSelectedColor, SetCheckboxGroupUnSelectedColor, ResetCheckboxGroupUnSelectedColor,
249 SetCheckboxGroupSelectAll, ResetCheckboxGroupSelectAll, SetCheckboxGroupWidth, ResetCheckboxGroupWidth,
250 SetCheckboxGroupHeight, ResetCheckboxGroupHeight, SetCheckboxGroupMark, ResetCheckboxGroupMark,
251 SetCheckboxGroupStyle, ResetCheckboxGroupStyle, SetCheckboxGroupName, GetCheckboxGroupName,
252 GetCheckboxGroupSelectAll, GetCheckboxGroupSelectedColor, GetCheckboxGroupUnSelectedColor,
253 GetCheckboxGroupMarkColor, GetCheckboxGroupMarkSize, GetCheckboxGroupMarkWidth, GetCheckboxGroupStyle };
254 return &modifier;
255 }
256
SetCheckboxGroupChange(ArkUINodeHandle node,void * extraParam)257 void SetCheckboxGroupChange(ArkUINodeHandle node, void* extraParam)
258 {
259 auto* frameNode = reinterpret_cast<FrameNode*>(node);
260 CHECK_NULL_VOID(frameNode);
261 auto onEvent = [node, extraParam](const BaseEventInfo* info) {
262 const auto* groupInfo = TypeInfoHelper::DynamicCast<CheckboxGroupResult>(info);
263 if (!groupInfo) {
264 return;
265 }
266 ArkUINodeEvent event;
267 event.kind = TEXT_INPUT;
268 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
269 event.textInputEvent.subKind = ON_CHECKBOX_GROUP_CHANGE;
270 std::vector<std::string> nameList = groupInfo->GetNameList();
271 std::string status = std::to_string(groupInfo->GetStatus());
272
273 std::string nodeEventStr;
274 if (!nameList.empty()) {
275 nodeEventStr.append("Name:");
276 for (auto nameStr : nameList) {
277 nodeEventStr.append(nameStr);
278 nodeEventStr.append(",");
279 }
280 nodeEventStr.pop_back();
281 nodeEventStr.append(";");
282 }
283
284 nodeEventStr.append("Status:" + status);
285 event.textInputEvent.nativeStringPtr = reinterpret_cast<intptr_t>(nodeEventStr.c_str());
286 SendArkUIAsyncEvent(&event);
287 };
288 CheckBoxGroupModelNG::SetOnChange(frameNode, std::move(onEvent));
289 }
290
ResetCheckboxGroupChange(ArkUINodeHandle node)291 void ResetCheckboxGroupChange(ArkUINodeHandle node)
292 {
293 auto* frameNode = reinterpret_cast<FrameNode*>(node);
294 CHECK_NULL_VOID(frameNode);
295 CheckBoxGroupModelNG::SetOnChange(frameNode, nullptr);
296 }
297 }
298 }
299