1 /*
2  * Copyright (c) 2022-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 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_CALENDAR_CALENDAR_MONTH_PATTERN_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_CALENDAR_CALENDAR_MONTH_PATTERN_H
18 
19 #include <optional>
20 
21 #include "base/geometry/axis.h"
22 #include "base/memory/referenced.h"
23 #include "core/components/calendar/calendar_data_adapter.h"
24 #include "core/components/common/layout/constants.h"
25 #include "core/components_ng/pattern/calendar/calendar_event_hub.h"
26 #include "core/components_ng/pattern/calendar/calendar_layout_algorithm.h"
27 #include "core/components_ng/pattern/calendar/calendar_paint_method.h"
28 #include "core/components_ng/pattern/calendar/calendar_paint_property.h"
29 #include "core/components_ng/pattern/pattern.h"
30 #include "core/components_ng/render/paint_property.h"
31 
32 namespace OHOS::Ace::NG {
33 
34 class CalendarMonthPattern : public Pattern {
35     DECLARE_ACE_TYPE(CalendarMonthPattern, Pattern);
36 
37 public:
38     CalendarMonthPattern() = default;
39     ~CalendarMonthPattern() override;
40 
CreatePaintProperty()41     RefPtr<PaintProperty> CreatePaintProperty() override
42     {
43         return MakeRefPtr<CalendarPaintProperty>();
44     }
45 
CreateEventHub()46     RefPtr<EventHub> CreateEventHub() override
47     {
48         return MakeRefPtr<CalendarEventHub>();
49     }
50 
CreateLayoutAlgorithm()51     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override
52     {
53         return MakeRefPtr<CalendarLayoutAlgorithm>();
54     }
55 
CreateNodePaintMethod()56     RefPtr<NodePaintMethod> CreateNodePaintMethod() override
57     {
58         if (AceApplicationInfo::GetInstance().IsAccessibilityEnabled()) {
59             InitCurrentVirtualNode();
60         }
61         return MakeRefPtr<CalendarPaintMethod>(obtainedMonth_, calendarDay_, isCalendarDialog_);
62     }
63 
GetMonthData()64     const ObtainedMonth& GetMonthData() const
65     {
66         return obtainedMonth_;
67     }
68 
SetMonthData(const ObtainedMonth & obtainedMonth,MonthState monthState)69     void SetMonthData(const ObtainedMonth& obtainedMonth, MonthState monthState)
70     {
71         obtainedMonth_ = obtainedMonth;
72         monthState_ = monthState;
73     }
74 
GetCalendarDay()75     const CalendarDay& GetCalendarDay() const
76     {
77         return calendarDay_;
78     }
79 
SetCalendarDay(const CalendarDay & calendarDay)80     void SetCalendarDay(const CalendarDay& calendarDay)
81     {
82         calendarDay_ = calendarDay;
83         if (monthState_ == MonthState::CUR_MONTH && !obtainedMonth_.days.empty()) {
84             for (auto& day : obtainedMonth_.days) {
85                 if (day.month.year == calendarDay.month.year && day.month.month == calendarDay.month.month &&
86                     day.day == calendarDay.day) {
87                     day.focused = true;
88                 }
89             }
90         }
91     }
92 
IsCalendarDialog()93     bool IsCalendarDialog() const
94     {
95         return isCalendarDialog_;
96     }
97 
SetCalendarDialogFlag(bool isCalendarDialog)98     void SetCalendarDialogFlag(bool isCalendarDialog)
99     {
100         isCalendarDialog_ = isCalendarDialog;
101     }
102 
SetHoverState(bool state)103     void SetHoverState(bool state)
104     {
105         hoverState_ = state;
106     }
107 
GetHoverState()108     bool GetHoverState() const
109     {
110         return hoverState_;
111     }
112 
UpdateColRowSpace()113     void UpdateColRowSpace()
114     {
115         SetColRowSpace();
116     }
117 
SetIsFirstEnter(bool isFirstEnter)118     void SetIsFirstEnter(bool isFirstEnter)
119     {
120         isFirstEnter_ = isFirstEnter;
121     }
122 
123     void InitCurrentVirtualNode();
124 
125     void ClearCalendarVirtualNode();
126 
127     void ClearFocusCalendarDay();
128 
129 private:
130     void OnAttachToFrameNode() override;
131     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
132     void OnModifyDone() override;
133     void OnClick(Offset& localLocation, const ObtainedMonth& obtainedMonth);
134     void OnTouchEvent(const Offset& localLocation, bool isPressed);
135     void OnHoverEvent(const Offset& localLocation, bool state);
136     void InitClickEvent();
137     void InitTouchEvent();
138     void InitHoverEvent();
139     void SetColRowSpace();
140     int32_t JudgeArea(const Offset& offset);
141     Dimension GetDaySize(const RefPtr<CalendarTheme>& theme);
142     RefPtr<FrameNode> AddButtonNodeIntoVirtual(const CalendarDay& calendarDay);
143     void UpdateAccessibilityButtonNode(RefPtr<FrameNode> frameNode, int32_t index);
144     void UpdateButtonNodeWithoutTheme(RefPtr<FrameNode> frameNode, int32_t index);
145     void ModifyAccessibilityVirtualNode(const ObtainedMonth& currentData);
146     void ChangeVirtualNodeContent(const CalendarDay& calendarDay);
147     bool InitCalendarVirtualNode();
148     void InitVirtualButtonClickEvent(RefPtr<FrameNode> frameNode, int32_t index);
149     void SetVirtualNodeUserSelected(int32_t index);
150     void FireModifyAccessibilityVirtualNode(const ObtainedMonth& currentData);
151     void InitAccessibilityHoverEvent();
152     void HandleAccessibilityHoverEvent(bool state, AccessibilityHoverInfo& info);
153     void SetCalendarAccessibilityLevel(const std::string& level);
154     void InitializeCalendarAccessibility();
155     void ChangeVirtualNodeState(const CalendarDay& calendarDay);
156     void SetLineNodeSize(RefPtr<FrameNode> lineNode);
157     void SetFocusNode(int32_t index, bool isDeviceOrientation = false);
158     std::string GetDayStr(int32_t index);
159     bool isCalendarDialog_ = false;
160     bool hoverState_ = false;
161     bool isOnHover_ = false;
162     bool isFirstEnter_ = false;
163     int32_t selectedIndex_ = 0;
164     double margin_ = 0;
165     WeakPtr<FrameNode> lineNode_;
166     double dayHeight_ = 0;
167     double dayWidth_ = 0;
168     DeviceOrientation deviceOrientation_ = DeviceOrientation::ORIENTATION_UNDEFINED;
169     std::string selectedTxt_;
170     std::string disabledDesc_;
171     std::vector<RefPtr<AccessibilityProperty>> accessibilityPropertyVec_;
172     std::vector<RefPtr<FrameNode>> buttonAccessibilityNodeVec_;
173     std::shared_ptr<AccessibilitySAObserverCallback> accessibilitySAObserverCallback_;
174     bool isInitVirtualNode_ = false;
175     CalendarDay calendarDay_;
176     CalendarDay focusedCalendarDay_;
177     ObtainedMonth obtainedMonth_;
178     MonthState monthState_ = MonthState::CUR_MONTH;
179     RefPtr<ClickEvent> clickListener_;
180     RefPtr<TouchEventImpl> touchListener_;
181     RefPtr<InputEvent> hoverListener_;
182 
183     ACE_DISALLOW_COPY_AND_MOVE(CalendarMonthPattern);
184 };
185 } // namespace OHOS::Ace::NG
186 
187 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_CALENDAR_CALENDAR_MONTH_PATTERN_H