• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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