1 /* 2 * Copyright (c) 2022-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 #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/picker/picker_data.h" 25 #include "core/components/common/layout/constants.h" 26 #include "core/components_ng/pattern/calendar/calendar_event_hub.h" 27 #include "core/components_ng/pattern/calendar/calendar_layout_algorithm.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 56 RefPtr<NodePaintMethod> CreateNodePaintMethod() override; 57 GetMonthData()58 const ObtainedMonth& GetMonthData() const 59 { 60 return obtainedMonth_; 61 } 62 SetMonthData(const ObtainedMonth & obtainedMonth,MonthState monthState)63 void SetMonthData(const ObtainedMonth& obtainedMonth, MonthState monthState) 64 { 65 obtainedMonth_ = obtainedMonth; 66 monthState_ = monthState; 67 } 68 GetCalendarDay()69 const CalendarDay& GetCalendarDay() const 70 { 71 return calendarDay_; 72 } 73 74 void SetCalendarDay(const CalendarDay& calendarDay); 75 SetStartDate(const PickerDate & startDate)76 void SetStartDate(const PickerDate& startDate) 77 { 78 startDate_ = startDate; 79 } 80 SetEndDate(const PickerDate & endDate)81 void SetEndDate(const PickerDate& endDate) 82 { 83 endDate_ = endDate; 84 } 85 SetMarkToday(bool markToday)86 void SetMarkToday(bool markToday) 87 { 88 markToday_ = markToday; 89 } 90 SetDisabledDateRange(const std::vector<std::pair<PickerDate,PickerDate>> & disabledDateRange)91 void SetDisabledDateRange(const std::vector<std::pair<PickerDate, PickerDate>>& disabledDateRange) 92 { 93 disabledDateRange_ = disabledDateRange; 94 } 95 IsCalendarDialog()96 bool IsCalendarDialog() const 97 { 98 return isCalendarDialog_; 99 } 100 SetCalendarDialogFlag(bool isCalendarDialog)101 void SetCalendarDialogFlag(bool isCalendarDialog) 102 { 103 isCalendarDialog_ = isCalendarDialog; 104 } 105 SetHoverState(bool state)106 void SetHoverState(bool state) 107 { 108 hoverState_ = state; 109 } 110 GetHoverState()111 bool GetHoverState() const 112 { 113 return hoverState_; 114 } 115 UpdateColRowSpace()116 void UpdateColRowSpace() 117 { 118 SetColRowSpace(); 119 } 120 SetIsFirstEnter(bool isFirstEnter)121 void SetIsFirstEnter(bool isFirstEnter) 122 { 123 isFirstEnter_ = isFirstEnter; 124 } 125 126 void InitCurrentVirtualNode(); 127 128 void ClearCalendarVirtualNode(); 129 130 void ClearFocusCalendarDay(); 131 132 void BeforeSyncGeometryProperties(const DirtySwapConfig& config) override; 133 134 Dimension GetDaySize(const RefPtr<CalendarTheme>& theme); 135 136 bool IsLargeSize(const RefPtr<CalendarTheme>& theme); 137 138 void InitFoldState(); 139 140 void FireIsFoldStatusChanged(); 141 142 void UpdateDayRadius(const CalcDimension& dayRadius); 143 144 private: 145 void OnAttachToFrameNode() override; 146 void OnColorConfigurationUpdate() override; 147 void OnLanguageConfigurationUpdate() override; 148 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override; 149 void OnModifyDone() override; 150 void OnClick(Offset& localLocation, const ObtainedMonth& obtainedMonth); 151 void OnTouchEvent(const Offset& localLocation, bool isPressed); 152 void OnHoverEvent(const Offset& localLocation, bool state); 153 void InitClickEvent(); 154 void InitTouchEvent(); 155 void InitHoverEvent(); 156 void SetColRowSpace(); 157 int32_t JudgeArea(const Offset& offset); 158 RefPtr<FrameNode> AddButtonNodeIntoVirtual(const CalendarDay& calendarDay); 159 void UpdateAccessibilityButtonNode(RefPtr<FrameNode> frameNode, int32_t index); 160 void UpdateButtonNodeWithoutTheme(RefPtr<FrameNode> frameNode, int32_t index); 161 void ModifyAccessibilityVirtualNode(const ObtainedMonth& currentData); 162 void ChangeVirtualNodeContent(const CalendarDay& calendarDay); 163 bool InitCalendarVirtualNode(); 164 void InitVirtualButtonClickEvent(RefPtr<FrameNode> frameNode, int32_t index); 165 void SetVirtualNodeUserSelected(int32_t index); 166 void FireModifyAccessibilityVirtualNode(const ObtainedMonth& currentData); 167 void InitAccessibilityHoverEvent(); 168 void HandleAccessibilityHoverEvent(bool state, AccessibilityHoverInfo& info); 169 void SetCalendarAccessibilityLevel(const std::string& level); 170 void InitializeCalendarAccessibility(); 171 void ChangeVirtualNodeState(const CalendarDay& calendarDay); 172 void SetLineNodeSize(RefPtr<FrameNode> lineNode); 173 void SetFocusNode(int32_t index, bool isDeviceOrientation = false); 174 float GetWidth(const RefPtr<FrameNode>& host); 175 bool IsDateInRange(const CalendarDay& day); 176 std::string GetDayStr(int32_t index); 177 std::string GetTodayStr(); 178 bool isCalendarDialog_ = false; 179 bool hoverState_ = false; 180 bool isOnHover_ = false; 181 bool isFirstEnter_ = false; 182 int32_t selectedIndex_ = 0; 183 double margin_ = 0; 184 RefPtr<FrameNode> lineNode_; 185 double dayHeight_ = 0; 186 double dayWidth_ = 0; 187 double colSpace_ = 0; 188 DeviceOrientation deviceOrientation_ = DeviceOrientation::ORIENTATION_UNDEFINED; 189 std::string selectedTxt_; 190 std::string disabledDesc_; 191 FoldStatus currentFoldStatus_ = FoldStatus::UNKNOWN; 192 std::vector<RefPtr<AccessibilityProperty>> accessibilityPropertyVec_; 193 std::vector<RefPtr<FrameNode>> buttonAccessibilityNodeVec_; 194 std::shared_ptr<AccessibilitySAObserverCallback> accessibilitySAObserverCallback_; 195 bool isInitVirtualNode_ = false; 196 CalendarDay calendarDay_; 197 PickerDate startDate_; 198 PickerDate endDate_; 199 bool markToday_ = false; 200 std::vector<std::pair<PickerDate, PickerDate>> disabledDateRange_; 201 CalendarDay focusedCalendarDay_; 202 ObtainedMonth obtainedMonth_; 203 MonthState monthState_ = MonthState::CUR_MONTH; 204 RefPtr<ClickEvent> clickListener_; 205 RefPtr<TouchEventImpl> touchListener_; 206 RefPtr<InputEvent> hoverListener_; 207 208 ACE_DISALLOW_COPY_AND_MOVE(CalendarMonthPattern); 209 }; 210 } // namespace OHOS::Ace::NG 211 212 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_CALENDAR_CALENDAR_MONTH_PATTERN_H 213