1 /*
2 * Copyright (c) 2023-2024 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
16 #include "core/interfaces/native/node/node_date_picker_modifier.h"
17
18 #include "bridge/common/utils/utils.h"
19 #include "core/components_ng/pattern/picker/datepicker_model_ng.h"
20 #include "core/pipeline_ng/pipeline_context.h"
21
22 namespace OHOS::Ace::NG {
23 namespace {
24 constexpr int32_t POS_0 = 0;
25 constexpr int32_t POS_1 = 1;
26 constexpr int32_t POS_2 = 2;
27 constexpr int YEAR_1900 = 1900;
28 constexpr int YEAR_1970 = 1970;
29 const char DEFAULT_DELIMITER = '|';
30 const int32_t ERROR_INT_CODE = -1;
31 thread_local std::string g_strValue;
32 const std::vector<OHOS::Ace::FontStyle> FONT_STYLES = { OHOS::Ace::FontStyle::NORMAL, OHOS::Ace::FontStyle::ITALIC };
33
GetPickerThemeByFrameNode(FrameNode * frameNode,RefPtr<PickerTheme> & theme)34 ArkUI_Bool GetPickerThemeByFrameNode(FrameNode* frameNode, RefPtr<PickerTheme>& theme)
35 {
36 CHECK_NULL_RETURN(frameNode, false);
37 auto pipeline = frameNode->GetContext();
38 CHECK_NULL_RETURN(pipeline, false);
39 auto themeManager = pipeline->GetThemeManager();
40 CHECK_NULL_RETURN(themeManager, false);
41 theme = themeManager->GetTheme<PickerTheme>();
42 CHECK_NULL_RETURN(theme, false);
43 return true;
44 }
45
InitDatePickerTextStyle(const char * fontInfo,uint32_t color,int32_t style,NG::PickerTextStyle & textStyle)46 void InitDatePickerTextStyle(const char* fontInfo, uint32_t color, int32_t style, NG::PickerTextStyle& textStyle)
47 {
48 std::vector<std::string> res;
49 std::string fontValues = std::string(fontInfo);
50 StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
51 textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
52 if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
53 textStyle.fontStyle = FONT_STYLES[style];
54 } else {
55 textStyle.fontStyle = FONT_STYLES[0];
56 }
57 textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
58 textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
59 textStyle.textColor = Color(color);
60 }
61
SetDatePickerTextStyleResObj(NG::PickerTextStyle & textStyle,void * fontSizeRawPtr,void * fontFamilyRawPtr,void * textColorRawPtr)62 void SetDatePickerTextStyleResObj(NG::PickerTextStyle& textStyle, void* fontSizeRawPtr, void* fontFamilyRawPtr,
63 void* textColorRawPtr)
64 {
65 auto* fontSizePtr = reinterpret_cast<ResourceObject*>(fontSizeRawPtr);
66 if (fontSizePtr) {
67 textStyle.fontSizeResObj = AceType::Claim(fontSizePtr);
68 }
69
70 auto* fontFamilyPtr = reinterpret_cast<ResourceObject*>(fontFamilyRawPtr);
71 if (fontFamilyPtr) {
72 textStyle.fontFamilyResObj = AceType::Claim(fontFamilyPtr);
73 }
74
75 auto* textColorPtr = reinterpret_cast<ResourceObject*>(textColorRawPtr);
76 if (textColorPtr) {
77 textStyle.textColorResObj = AceType::Claim(textColorPtr);
78 }
79 }
80
GetSelectedTextStyle(ArkUINodeHandle node)81 ArkUI_CharPtr GetSelectedTextStyle(ArkUINodeHandle node)
82 {
83 auto* frameNode = reinterpret_cast<FrameNode*>(node);
84 CHECK_NULL_RETURN(frameNode, "");
85 PickerTextStyle pickerTextStyle = DatePickerModelNG::getSelectedTextStyle(frameNode);
86 std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
87 if (fontFamilies.size() == 0) {
88 fontFamilies.emplace_back("HarmonyOS Sans");
89 }
90 std::string families;
91 //set index start
92 int index = 0;
93 for (auto& family : fontFamilies) {
94 families += family;
95 if (index != static_cast<int>(fontFamilies.size()) - 1) {
96 families += ",";
97 }
98 index++;
99 }
100 g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
101 g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
102 g_strValue =
103 g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
104 g_strValue = g_strValue + families + ";";
105 g_strValue = g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(FontStyle::NORMAL));
106 return g_strValue.c_str();
107 }
108
SetSelectedTextStyle(ArkUINodeHandle node,const char * fontInfo,uint32_t color,int32_t style)109 void SetSelectedTextStyle(ArkUINodeHandle node, const char* fontInfo, uint32_t color, int32_t style)
110 {
111 auto* frameNode = reinterpret_cast<FrameNode*>(node);
112 CHECK_NULL_VOID(frameNode);
113 RefPtr<PickerTheme> theme;
114 if (!GetPickerThemeByFrameNode(frameNode, theme)) {
115 return;
116 }
117 NG::PickerTextStyle textStyle;
118 InitDatePickerTextStyle(fontInfo, color, style, textStyle);
119 DatePickerModelNG::SetSelectedTextStyle(frameNode, theme, textStyle);
120 }
121
SetSelectedTextStyleWithResObj(ArkUINodeHandle node,const struct ArkUIPickerTextStyleStruct * textStyleStruct)122 void SetSelectedTextStyleWithResObj(ArkUINodeHandle node, const struct ArkUIPickerTextStyleStruct* textStyleStruct)
123 {
124 auto* frameNode = reinterpret_cast<FrameNode*>(node);
125 CHECK_NULL_VOID(frameNode);
126 RefPtr<PickerTheme> theme;
127 if (!GetPickerThemeByFrameNode(frameNode, theme)) {
128 return;
129 }
130 NG::PickerTextStyle textStyle;
131 textStyle.textColorSetByUser = textStyleStruct->textColorSetByUser;
132 InitDatePickerTextStyle(textStyleStruct->fontInfo, textStyleStruct->textColor, textStyleStruct->fontStyle,
133 textStyle);
134 SetDatePickerTextStyleResObj(textStyle, textStyleStruct->fontSizeRawPtr, textStyleStruct->fontFamilyRawPtr,
135 textStyleStruct->textColorRawPtr);
136 DatePickerModelNG::SetSelectedTextStyle(frameNode, theme, textStyle);
137 }
138
ResetSelectedTextStyle(ArkUINodeHandle node)139 void ResetSelectedTextStyle(ArkUINodeHandle node)
140 {
141 auto* frameNode = reinterpret_cast<FrameNode*>(node);
142 CHECK_NULL_VOID(frameNode);
143 auto pipeline = frameNode->GetContext();
144 CHECK_NULL_VOID(pipeline);
145 auto themeManager = pipeline->GetThemeManager();
146 CHECK_NULL_VOID(themeManager);
147 auto theme = themeManager->GetTheme<PickerTheme>();
148 CHECK_NULL_VOID(theme);
149
150 NG::PickerTextStyle textStyle;
151 auto selectedStyle = theme->GetOptionStyle(true, false);
152 textStyle.textColor = selectedStyle.GetTextColor();
153 textStyle.fontSize = selectedStyle.GetFontSize();
154 textStyle.fontWeight = selectedStyle.GetFontWeight();
155 DatePickerModelNG::SetSelectedTextStyle(frameNode, theme, textStyle);
156 }
157
GetDatePickerTextStyle(ArkUINodeHandle node)158 ArkUI_CharPtr GetDatePickerTextStyle(ArkUINodeHandle node)
159 {
160 auto* frameNode = reinterpret_cast<FrameNode*>(node);
161 CHECK_NULL_RETURN(frameNode, "");
162 PickerTextStyle pickerTextStyle = DatePickerModelNG::getNormalTextStyle(frameNode);
163 std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
164 std::string families;
165 if (fontFamilies.size() == 0) {
166 fontFamilies.emplace_back("HarmonyOS Sans");
167 }
168 //set index start
169 int index = 0;
170 for (auto& family : fontFamilies) {
171 families += family;
172 if (index != static_cast<int>(fontFamilies.size()) - 1) {
173 families += ",";
174 }
175 index++;
176 }
177 g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
178 g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
179 g_strValue =
180 g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
181 g_strValue = g_strValue + families + ";";
182 g_strValue = g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(FontStyle::NORMAL));
183 return g_strValue.c_str();
184 }
185
SetDatePickerTextStyle(ArkUINodeHandle node,const char * fontInfo,uint32_t color,int32_t style)186 void SetDatePickerTextStyle(ArkUINodeHandle node, const char* fontInfo, uint32_t color, int32_t style)
187 {
188 auto* frameNode = reinterpret_cast<FrameNode*>(node);
189 CHECK_NULL_VOID(frameNode);
190 RefPtr<PickerTheme> theme;
191 if (!GetPickerThemeByFrameNode(frameNode, theme)) {
192 return;
193 }
194 NG::PickerTextStyle textStyle;
195 InitDatePickerTextStyle(fontInfo, color, style, textStyle);
196 DatePickerModelNG::SetNormalTextStyle(frameNode, theme, textStyle);
197 }
198
SetDatePickerTextStyleWithResObj(ArkUINodeHandle node,const struct ArkUIPickerTextStyleStruct * textStyleStruct)199 void SetDatePickerTextStyleWithResObj(ArkUINodeHandle node, const struct ArkUIPickerTextStyleStruct* textStyleStruct)
200 {
201 auto* frameNode = reinterpret_cast<FrameNode*>(node);
202 CHECK_NULL_VOID(frameNode);
203 RefPtr<PickerTheme> theme;
204 if (!GetPickerThemeByFrameNode(frameNode, theme)) {
205 return;
206 }
207 NG::PickerTextStyle textStyle;
208 textStyle.textColorSetByUser = textStyleStruct->textColorSetByUser;
209 InitDatePickerTextStyle(textStyleStruct->fontInfo, textStyleStruct->textColor, textStyleStruct->fontStyle,
210 textStyle);
211 SetDatePickerTextStyleResObj(textStyle, textStyleStruct->fontSizeRawPtr, textStyleStruct->fontFamilyRawPtr,
212 textStyleStruct->textColorRawPtr);
213 DatePickerModelNG::SetNormalTextStyle(frameNode, theme, textStyle);
214 }
215
ResetDatePickerTextStyle(ArkUINodeHandle node)216 void ResetDatePickerTextStyle(ArkUINodeHandle node)
217 {
218 auto* frameNode = reinterpret_cast<FrameNode*>(node);
219 CHECK_NULL_VOID(frameNode);
220 auto pipeline = frameNode->GetContext();
221 CHECK_NULL_VOID(pipeline);
222 auto themeManager = pipeline->GetThemeManager();
223 CHECK_NULL_VOID(themeManager);
224 auto theme = themeManager->GetTheme<PickerTheme>();
225 CHECK_NULL_VOID(theme);
226
227 NG::PickerTextStyle textStyle;
228 auto normalStyle = theme->GetOptionStyle(false, false);
229 textStyle.textColor = normalStyle.GetTextColor();
230 textStyle.fontSize = normalStyle.GetFontSize();
231 textStyle.fontWeight = normalStyle.GetFontWeight();
232 DatePickerModelNG::SetNormalTextStyle(frameNode, theme, textStyle);
233 }
234
GetDisappearTextStyle(ArkUINodeHandle node)235 ArkUI_CharPtr GetDisappearTextStyle(ArkUINodeHandle node)
236 {
237 auto* frameNode = reinterpret_cast<FrameNode*>(node);
238 CHECK_NULL_RETURN(frameNode, "");
239 PickerTextStyle pickerTextStyle = DatePickerModelNG::getDisappearTextStyle(frameNode);
240 std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
241 std::string families;
242 if (fontFamilies.size() == 0) {
243 fontFamilies.emplace_back("HarmonyOS Sans");
244 }
245 //set index start
246 int index = 0;
247 for (auto& family : fontFamilies) {
248 families += family;
249 if (index != static_cast<int>(fontFamilies.size()) - 1) {
250 families += ",";
251 }
252 index++;
253 }
254 g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
255 g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
256 g_strValue =
257 g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
258 g_strValue = g_strValue + families + ";";
259 g_strValue = g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(FontStyle::NORMAL));
260 return g_strValue.c_str();
261 }
262
SetDisappearTextStyle(ArkUINodeHandle node,const char * fontInfo,uint32_t color,int32_t style)263 void SetDisappearTextStyle(ArkUINodeHandle node, const char* fontInfo, uint32_t color, int32_t style)
264 {
265 auto* frameNode = reinterpret_cast<FrameNode*>(node);
266 CHECK_NULL_VOID(frameNode);
267 RefPtr<PickerTheme> theme;
268 if (!GetPickerThemeByFrameNode(frameNode, theme)) {
269 return;
270 }
271 NG::PickerTextStyle textStyle;
272 InitDatePickerTextStyle(fontInfo, color, style, textStyle);
273 DatePickerModelNG::SetDisappearTextStyle(frameNode, theme, textStyle);
274 }
275
SetDisappearTextStyleWithResObj(ArkUINodeHandle node,const struct ArkUIPickerTextStyleStruct * textStyleStruct)276 void SetDisappearTextStyleWithResObj(ArkUINodeHandle node, const struct ArkUIPickerTextStyleStruct* textStyleStruct)
277 {
278 auto* frameNode = reinterpret_cast<FrameNode*>(node);
279 CHECK_NULL_VOID(frameNode);
280 RefPtr<PickerTheme> theme;
281 if (!GetPickerThemeByFrameNode(frameNode, theme)) {
282 return;
283 }
284 NG::PickerTextStyle textStyle;
285 textStyle.textColorSetByUser = textStyleStruct->textColorSetByUser;
286 InitDatePickerTextStyle(textStyleStruct->fontInfo, textStyleStruct->textColor, textStyleStruct->fontStyle,
287 textStyle);
288 SetDatePickerTextStyleResObj(textStyle, textStyleStruct->fontSizeRawPtr, textStyleStruct->fontFamilyRawPtr,
289 textStyleStruct->textColorRawPtr);
290 DatePickerModelNG::SetDisappearTextStyle(frameNode, theme, textStyle);
291 }
292
ResetDisappearTextStyle(ArkUINodeHandle node)293 void ResetDisappearTextStyle(ArkUINodeHandle node)
294 {
295 auto* frameNode = reinterpret_cast<FrameNode*>(node);
296 CHECK_NULL_VOID(frameNode);
297 auto pipeline = frameNode->GetContext();
298 CHECK_NULL_VOID(pipeline);
299 auto themeManager = pipeline->GetThemeManager();
300 CHECK_NULL_VOID(themeManager);
301 auto theme = themeManager->GetTheme<PickerTheme>();
302 CHECK_NULL_VOID(theme);
303
304 NG::PickerTextStyle textStyle;
305 auto disappearStyle = theme->GetDisappearOptionStyle();
306 textStyle.textColor = disappearStyle.GetTextColor();
307 textStyle.fontSize = disappearStyle.GetFontSize();
308 textStyle.fontWeight = disappearStyle.GetFontWeight();
309 DatePickerModelNG::SetDisappearTextStyle(frameNode, theme, textStyle);
310 }
311
GetLunar(ArkUINodeHandle node)312 ArkUI_Int32 GetLunar(ArkUINodeHandle node)
313 {
314 auto* frameNode = reinterpret_cast<FrameNode*>(node);
315 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
316 return DatePickerModelNG::getLunar(frameNode);
317 }
318
SetLunar(ArkUINodeHandle node,int lunar)319 void SetLunar(ArkUINodeHandle node, int lunar)
320 {
321 auto* frameNode = reinterpret_cast<FrameNode*>(node);
322 CHECK_NULL_VOID(frameNode);
323 DatePickerModelNG::SetShowLunar(frameNode, lunar);
324 }
325
ResetLunar(ArkUINodeHandle node)326 void ResetLunar(ArkUINodeHandle node)
327 {
328 auto* frameNode = reinterpret_cast<FrameNode*>(node);
329 CHECK_NULL_VOID(frameNode);
330 DatePickerModelNG::SetShowLunar(frameNode, false);
331 }
332
GetDatePickerBackgroundColor(ArkUINodeHandle node)333 ArkUI_Uint32 GetDatePickerBackgroundColor(ArkUINodeHandle node)
334 {
335 auto* frameNode = reinterpret_cast<FrameNode*>(node);
336 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
337 return DatePickerModelNG::getBackgroundColor(frameNode);
338 }
339
SetDatePickerBackgroundColor(ArkUINodeHandle node,uint32_t color)340 void SetDatePickerBackgroundColor(ArkUINodeHandle node, uint32_t color)
341 {
342 auto* frameNode = reinterpret_cast<FrameNode*>(node);
343 CHECK_NULL_VOID(frameNode);
344 DatePickerModelNG::SetBackgroundColor(frameNode, Color(color));
345 }
346
SetDatePickerBackgroundColorWithColorSpace(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_Int32 colorSpace)347 void SetDatePickerBackgroundColorWithColorSpace(
348 ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_Int32 colorSpace)
349 {
350 auto* frameNode = reinterpret_cast<FrameNode*>(node);
351 CHECK_NULL_VOID(frameNode);
352 Color backgroundColor { color };
353 if (ColorSpace::DISPLAY_P3 == colorSpace) {
354 backgroundColor.SetColorSpace(ColorSpace::DISPLAY_P3);
355 } else {
356 backgroundColor.SetColorSpace(ColorSpace::SRGB);
357 }
358 DatePickerModelNG::SetBackgroundColor(frameNode, backgroundColor);
359 }
360
ResetDatePickerBackgroundColor(ArkUINodeHandle node)361 void ResetDatePickerBackgroundColor(ArkUINodeHandle node)
362 {
363 auto* frameNode = reinterpret_cast<FrameNode*>(node);
364 CHECK_NULL_VOID(frameNode);
365 DatePickerModelNG::SetBackgroundColor(frameNode, Color(Color::TRANSPARENT));
366 }
367
GetStartDate(ArkUINodeHandle node)368 ArkUI_CharPtr GetStartDate(ArkUINodeHandle node)
369 {
370 auto* frameNode = reinterpret_cast<FrameNode*>(node);
371 CHECK_NULL_RETURN(frameNode, "");
372 LunarDate lunarDate = DatePickerModelNG::getStartDate(frameNode);
373 g_strValue = std::to_string(static_cast<uint32_t>(lunarDate.year)) + "-";
374 g_strValue = g_strValue + std::to_string(static_cast<uint32_t>(lunarDate.month)) + "-";
375 g_strValue = g_strValue + std::to_string(static_cast<uint32_t>(lunarDate.day));
376 return g_strValue.c_str();
377 }
378
SetStartDate(ArkUINodeHandle node,uint32_t year,uint32_t month,uint32_t day)379 void SetStartDate(ArkUINodeHandle node, uint32_t year, uint32_t month, uint32_t day)
380 {
381 auto* frameNode = reinterpret_cast<FrameNode*>(node);
382 CHECK_NULL_VOID(frameNode);
383 auto pickerDate = PickerDate(year, month, day);
384 if (pickerDate.GetYear() < YEAR_1900) {
385 pickerDate.SetYear(YEAR_1970);
386 pickerDate.SetMonth(1);
387 pickerDate.SetDay(1);
388 }
389 DatePickerModelNG::SetStartDate(frameNode, pickerDate);
390 }
391
ResetStartDate(ArkUINodeHandle node)392 void ResetStartDate(ArkUINodeHandle node)
393 {
394 auto* frameNode = reinterpret_cast<FrameNode*>(node);
395 CHECK_NULL_VOID(frameNode);
396 DatePickerModelNG::SetStartDate(frameNode, PickerDate(1970, 1, 1));
397 }
398
GetEndDate(ArkUINodeHandle node)399 ArkUI_CharPtr GetEndDate(ArkUINodeHandle node)
400 {
401 auto* frameNode = reinterpret_cast<FrameNode*>(node);
402 CHECK_NULL_RETURN(frameNode, "");
403 LunarDate lunarDate = DatePickerModelNG::getEndDate(frameNode);
404 g_strValue = std::to_string(static_cast<uint32_t>(lunarDate.year)) + "-";
405 g_strValue = g_strValue + std::to_string(static_cast<uint32_t>(lunarDate.month)) + "-";
406 g_strValue = g_strValue + std::to_string(static_cast<uint32_t>(lunarDate.day));
407 return g_strValue.c_str();
408 }
409
SetEndDate(ArkUINodeHandle node,uint32_t year,uint32_t month,uint32_t day)410 void SetEndDate(ArkUINodeHandle node, uint32_t year, uint32_t month, uint32_t day)
411 {
412 auto* frameNode = reinterpret_cast<FrameNode*>(node);
413 CHECK_NULL_VOID(frameNode);
414 DatePickerModelNG::SetEndDate(frameNode, PickerDate(year, month, day));
415 }
416
ResetEndDate(ArkUINodeHandle node)417 void ResetEndDate(ArkUINodeHandle node)
418 {
419 auto* frameNode = reinterpret_cast<FrameNode*>(node);
420 CHECK_NULL_VOID(frameNode);
421 DatePickerModelNG::SetEndDate(frameNode, PickerDate(2100, 12, 31));
422 }
423
GetSelectedDate(ArkUINodeHandle node)424 ArkUI_CharPtr GetSelectedDate(ArkUINodeHandle node)
425 {
426 auto* frameNode = reinterpret_cast<FrameNode*>(node);
427 CHECK_NULL_RETURN(frameNode, "");
428 LunarDate lunarDate = DatePickerModelNG::getSelectedDate(frameNode);
429 g_strValue = std::to_string(static_cast<uint32_t>(lunarDate.year)) + "-";
430 g_strValue = g_strValue + std::to_string(static_cast<uint32_t>(lunarDate.month)) + "-";
431 g_strValue = g_strValue + std::to_string(static_cast<uint32_t>(lunarDate.day));
432 return g_strValue.c_str();
433 }
434
SetSelectedDate(ArkUINodeHandle node,uint32_t year,uint32_t month,uint32_t day)435 void SetSelectedDate(ArkUINodeHandle node, uint32_t year, uint32_t month, uint32_t day)
436 {
437 auto* frameNode = reinterpret_cast<FrameNode*>(node);
438 CHECK_NULL_VOID(frameNode);
439 DatePickerModelNG::SetSelectedDate(frameNode, PickerDate(year, month, day));
440 }
441
ResetSelectedDate(ArkUINodeHandle node)442 void ResetSelectedDate(ArkUINodeHandle node)
443 {
444 auto* frameNode = reinterpret_cast<FrameNode*>(node);
445 CHECK_NULL_VOID(frameNode);
446 time_t now = time(nullptr);
447 auto currentTm = localtime(&now);
448 CHECK_NULL_VOID(currentTm);
449 PickerDate pickerDate(currentTm->tm_year + 1900, currentTm->tm_mon + 1, currentTm->tm_mday);
450
451 DatePickerModelNG::SetSelectedDate(frameNode, pickerDate);
452 }
453
SetDatePickerMode(ArkUINodeHandle node,int value)454 void SetDatePickerMode(ArkUINodeHandle node, int value)
455 {
456 auto *frameNode = reinterpret_cast<FrameNode *>(node);
457 CHECK_NULL_VOID(frameNode);
458 if (value < 0 || value > static_cast<int32_t>(DatePickerMode::MONTH_AND_DAY)) {
459 return;
460 }
461 DatePickerModelNG::SetMode(frameNode, static_cast<DatePickerMode>(value));
462 }
463
ResetDatePickerMode(ArkUINodeHandle node)464 void ResetDatePickerMode(ArkUINodeHandle node)
465 {
466 auto *frameNode = reinterpret_cast<FrameNode *>(node);
467 CHECK_NULL_VOID(frameNode);
468 DatePickerModelNG::SetMode(frameNode, DatePickerMode::DATE);
469 }
470
GetDatePickerMode(ArkUINodeHandle node)471 ArkUI_Int32 GetDatePickerMode(ArkUINodeHandle node)
472 {
473 auto *frameNode = reinterpret_cast<FrameNode *>(node);
474 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
475 return static_cast<int>(DatePickerModelNG::getMode(frameNode));
476 }
477
GetEnableHapticFeedback(ArkUINodeHandle node)478 ArkUI_Bool GetEnableHapticFeedback(ArkUINodeHandle node)
479 {
480 auto* frameNode = reinterpret_cast<FrameNode*>(node);
481 CHECK_NULL_RETURN(frameNode, true);
482 return DatePickerModelNG::GetEnableHapticFeedback(frameNode);
483 }
484
SetEnableHapticFeedback(ArkUINodeHandle node,int enableHapticFeedback)485 void SetEnableHapticFeedback(ArkUINodeHandle node, int enableHapticFeedback)
486 {
487 auto* frameNode = reinterpret_cast<FrameNode*>(node);
488 CHECK_NULL_VOID(frameNode);
489 DatePickerModelNG::SetEnableHapticFeedback(frameNode, enableHapticFeedback);
490 }
491
ResetEnableHapticFeedback(ArkUINodeHandle node)492 void ResetEnableHapticFeedback(ArkUINodeHandle node)
493 {
494 auto* frameNode = reinterpret_cast<FrameNode*>(node);
495 CHECK_NULL_VOID(frameNode);
496 DatePickerModelNG::SetEnableHapticFeedback(frameNode, true);
497 }
498
SetDatePickerDigitalCrownSensitivity(ArkUINodeHandle node,int32_t CrownSensitivity)499 void SetDatePickerDigitalCrownSensitivity(ArkUINodeHandle node, int32_t CrownSensitivity)
500 {
501 auto* frameNode = reinterpret_cast<FrameNode*>(node);
502 CHECK_NULL_VOID(frameNode);
503 DatePickerModelNG::SetDigitalCrownSensitivity(frameNode, CrownSensitivity);
504 }
505
ResetDatePickerDigitalCrownSensitivity(ArkUINodeHandle node)506 void ResetDatePickerDigitalCrownSensitivity(ArkUINodeHandle node)
507 {
508 auto* frameNode = reinterpret_cast<FrameNode*>(node);
509 CHECK_NULL_VOID(frameNode);
510 DatePickerModelNG::SetDigitalCrownSensitivity(frameNode, DEFAULT_CROWNSENSITIVITY);
511 }
512
GetCanLoop(ArkUINodeHandle node)513 ArkUI_Bool GetCanLoop(ArkUINodeHandle node)
514 {
515 auto* frameNode = reinterpret_cast<FrameNode*>(node);
516 CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
517 return DatePickerModelNG::GetCanLoop(frameNode);
518 }
519
SetCanLoop(ArkUINodeHandle node,int isLoop)520 void SetCanLoop(ArkUINodeHandle node, int isLoop)
521 {
522 auto* frameNode = reinterpret_cast<FrameNode*>(node);
523 CHECK_NULL_VOID(frameNode);
524 DatePickerModelNG::SetCanLoop(frameNode, isLoop);
525 }
526
ResetCanLoop(ArkUINodeHandle node)527 void ResetCanLoop(ArkUINodeHandle node)
528 {
529 auto* frameNode = reinterpret_cast<FrameNode*>(node);
530 CHECK_NULL_VOID(frameNode);
531 DatePickerModelNG::SetCanLoop(frameNode, true);
532 }
533
SetDatePickerOnDateChangeExt(ArkUINodeHandle node,void * callback)534 void SetDatePickerOnDateChangeExt(ArkUINodeHandle node, void* callback)
535 {
536 auto* frameNode = reinterpret_cast<FrameNode*>(node);
537 CHECK_NULL_VOID(frameNode);
538 auto onDateChange = reinterpret_cast<std::function<void(const BaseEventInfo*)>*>(callback);
539 DatePickerModelNG::SetOnDateChange(frameNode, std::move(*onDateChange));
540 }
541
ResetDatePickerOnDateChange(ArkUINodeHandle node)542 void ResetDatePickerOnDateChange(ArkUINodeHandle node)
543 {
544 auto* frameNode = reinterpret_cast<FrameNode*>(node);
545 CHECK_NULL_VOID(frameNode);
546 DatePickerModelNG::SetOnDateChange(frameNode, nullptr);
547 }
548
SetDatePickerOnChangeExt(ArkUINodeHandle node,void * callback)549 void SetDatePickerOnChangeExt(ArkUINodeHandle node, void* callback)
550 {
551 auto* frameNode = reinterpret_cast<FrameNode*>(node);
552 CHECK_NULL_VOID(frameNode);
553 auto onChange = reinterpret_cast<std::function<void(const BaseEventInfo*)>*>(callback);
554 DatePickerModelNG::SetOnChange(frameNode, std::move(*onChange));
555 }
556
ResetDatePickerOnChange(ArkUINodeHandle node)557 void ResetDatePickerOnChange(ArkUINodeHandle node)
558 {
559 auto* frameNode = reinterpret_cast<FrameNode*>(node);
560 CHECK_NULL_VOID(frameNode);
561 DatePickerModelNG::SetOnChange(frameNode, nullptr);
562 }
563
564 } // namespace
565
566 namespace NodeModifier {
GetDatePickerModifier()567 const ArkUIDatePickerModifier* GetDatePickerModifier()
568 {
569 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
570 static const ArkUIDatePickerModifier modifier = {
571 .getSelectedTextStyle = GetSelectedTextStyle,
572 .setSelectedTextStyle = SetSelectedTextStyle,
573 .setSelectedTextStyleWithResObj = SetSelectedTextStyleWithResObj,
574 .resetSelectedTextStyle = ResetSelectedTextStyle,
575 .getDatePickerTextStyle = GetDatePickerTextStyle,
576 .setDatePickerTextStyle = SetDatePickerTextStyle,
577 .setDatePickerTextStyleWithResObj = SetDatePickerTextStyleWithResObj,
578 .resetDatePickerTextStyle = ResetDatePickerTextStyle,
579 .getDisappearTextStyle = GetDisappearTextStyle,
580 .setDisappearTextStyle = SetDisappearTextStyle,
581 .setDisappearTextStyleWithResObj = SetDisappearTextStyleWithResObj,
582 .resetDisappearTextStyle = ResetDisappearTextStyle,
583 .getLunar = GetLunar,
584 .setLunar = SetLunar,
585 .resetLunar = ResetLunar,
586 .getStartDate = GetStartDate,
587 .setStartDate = SetStartDate,
588 .resetStartDate = ResetStartDate,
589 .getEndDate = GetEndDate,
590 .setEndDate = SetEndDate,
591 .resetEndDate = ResetEndDate,
592 .getSelectedDate = GetSelectedDate,
593 .setSelectedDate = SetSelectedDate,
594 .resetSelectedDate = ResetSelectedDate,
595 .getDatePickerBackgroundColor = GetDatePickerBackgroundColor,
596 .setDatePickerBackgroundColor = SetDatePickerBackgroundColor,
597 .setDatePickerBackgroundColorWithColorSpace = SetDatePickerBackgroundColorWithColorSpace,
598 .resetDatePickerBackgroundColor = ResetDatePickerBackgroundColor,
599 .getDatePickerMode = GetDatePickerMode,
600 .setDatePickerMode = SetDatePickerMode,
601 .resetDatePickerMode = ResetDatePickerMode,
602 .getEnableHapticFeedback = GetEnableHapticFeedback,
603 .setEnableHapticFeedback = SetEnableHapticFeedback,
604 .resetEnableHapticFeedback = ResetEnableHapticFeedback,
605 .setDatePickerDigitalCrownSensitivity = SetDatePickerDigitalCrownSensitivity,
606 .resetDatePickerDigitalCrownSensitivity = ResetDatePickerDigitalCrownSensitivity,
607 .getCanLoop = GetCanLoop,
608 .setCanLoop = SetCanLoop,
609 .resetCanLoop = ResetCanLoop,
610 .setDatePickerOnDateChange = SetDatePickerOnDateChangeExt,
611 .resetDatePickerOnDateChange = ResetDatePickerOnDateChange,
612 .setDatePickerOnChange = SetDatePickerOnChangeExt,
613 .resetDatePickerOnChange = ResetDatePickerOnChange,
614 };
615 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
616
617 return &modifier;
618 }
619
GetCJUIDatePickerModifier()620 const CJUIDatePickerModifier* GetCJUIDatePickerModifier()
621 {
622 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
623 static const CJUIDatePickerModifier modifier = {
624 .getSelectedTextStyle = GetSelectedTextStyle,
625 .setSelectedTextStyle = SetSelectedTextStyle,
626 .resetSelectedTextStyle = ResetSelectedTextStyle,
627 .getDatePickerTextStyle = GetDatePickerTextStyle,
628 .setDatePickerTextStyle = SetDatePickerTextStyle,
629 .resetDatePickerTextStyle = ResetDatePickerTextStyle,
630 .getDisappearTextStyle = GetDisappearTextStyle,
631 .setDisappearTextStyle = SetDisappearTextStyle,
632 .resetDisappearTextStyle = ResetDisappearTextStyle,
633 .getLunar = GetLunar,
634 .setLunar = SetLunar,
635 .resetLunar = ResetLunar,
636 .getStartDate = GetStartDate,
637 .setStartDate = SetStartDate,
638 .resetStartDate = ResetStartDate,
639 .getEndDate = GetEndDate,
640 .setEndDate = SetEndDate,
641 .resetEndDate = ResetEndDate,
642 .getSelectedDate = GetSelectedDate,
643 .setSelectedDate = SetSelectedDate,
644 .resetSelectedDate = ResetSelectedDate,
645 .getDatePickerBackgroundColor = GetDatePickerBackgroundColor,
646 .setDatePickerBackgroundColor = SetDatePickerBackgroundColor,
647 .setDatePickerBackgroundColorWithColorSpace = SetDatePickerBackgroundColorWithColorSpace,
648 .resetDatePickerBackgroundColor = ResetDatePickerBackgroundColor,
649 .getDatePickerMode = GetDatePickerMode,
650 .setDatePickerMode = SetDatePickerMode,
651 .resetDatePickerMode = ResetDatePickerMode,
652 .getEnableHapticFeedback = GetEnableHapticFeedback,
653 .setEnableHapticFeedback = SetEnableHapticFeedback,
654 .resetEnableHapticFeedback = ResetEnableHapticFeedback,
655 .getCanLoop = GetCanLoop,
656 .setCanLoop = SetCanLoop,
657 .resetCanLoop = ResetCanLoop,
658 };
659 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
660
661 return &modifier;
662 }
SetDatePickerOnDateChange(ArkUINodeHandle node,void * extraParam)663 void SetDatePickerOnDateChange(ArkUINodeHandle node, void* extraParam)
664 {
665 auto* frameNode = reinterpret_cast<FrameNode*>(node);
666 CHECK_NULL_VOID(frameNode);
667 auto onDateChange = [extraParam](const BaseEventInfo* info) {
668 ArkUINodeEvent event;
669 event.kind = COMPONENT_ASYNC_EVENT;
670 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
671 event.componentAsyncEvent.subKind = ON_DATE_PICKER_DATE_CHANGE;
672 const auto* eventInfo = TypeInfoHelper::DynamicCast<DatePickerChangeEvent>(info);
673 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(eventInfo->GetSelectedStr());
674 if (!argsPtr) {
675 event.componentAsyncEvent.data[0].i32 = 1970;
676 event.componentAsyncEvent.data[1].i32 = 1;
677 event.componentAsyncEvent.data[2].i32 = 1;
678 event.componentAsyncEvent.data[3].i32 = 0;
679 event.componentAsyncEvent.data[4].i32 = 0;
680 }
681 auto year = argsPtr->GetValue("year");
682 auto month = argsPtr->GetValue("month");
683 auto day = argsPtr->GetValue("day");
684 auto hour = argsPtr->GetValue("hour");
685 auto minute = argsPtr->GetValue("minute");
686 if (year && year->IsNumber()) {
687 event.componentAsyncEvent.data[0].i32 = year->GetInt();
688 }
689 if (month && month->IsNumber()) {
690 event.componentAsyncEvent.data[1].i32 = month->GetInt();
691 }
692 if (day && day->IsNumber()) {
693 event.componentAsyncEvent.data[2].i32 = day->GetInt();
694 }
695 if (hour && hour->IsNumber()) {
696 event.componentAsyncEvent.data[3].i32 = hour->GetInt();
697 }
698 if (minute && minute->IsNumber()) {
699 event.componentAsyncEvent.data[4].i32 = minute->GetInt();
700 }
701 SendArkUISyncEvent(&event);
702 };
703 DatePickerModelNG::SetOnDateChange(frameNode, std::move(onDateChange));
704 }
705 } // namespace NodeModifier
706 } // namespace OHOS::Ace::NG
707