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_PATTERNS_SIDE_BAR_SIDE_BAR_CONTAINER_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SIDE_BAR_SIDE_BAR_CONTAINER_PATTERN_H 18 19 #include "core/components/common/layout/constants.h" 20 #include "core/components_ng/pattern/pattern.h" 21 #include "core/components_ng/pattern/side_bar/side_bar_container_event_hub.h" 22 #include "core/components_ng/pattern/side_bar/side_bar_container_layout_algorithm.h" 23 #include "core/components_ng/pattern/side_bar/side_bar_container_layout_property.h" 24 #include "core/components_ng/pattern/side_bar/side_bar_theme.h" 25 26 namespace OHOS::Ace::NG { 27 28 enum class SideBarAnimationDirection { 29 LTR, 30 RTL, 31 }; 32 class SideBarContainerPattern : public Pattern { 33 DECLARE_ACE_TYPE(SideBarContainerPattern, Pattern); 34 35 public: 36 SideBarContainerPattern() = default; 37 ~SideBarContainerPattern() override = default; 38 IsAtomicNode()39 bool IsAtomicNode() const override 40 { 41 return false; 42 } 43 IsEnableMatchParent()44 bool IsEnableMatchParent() override 45 { 46 return true; 47 } 48 IsEnableFix()49 bool IsEnableFix() override 50 { 51 return true; 52 } 53 IsEnableChildrenMatchParent()54 bool IsEnableChildrenMatchParent() override 55 { 56 return true; 57 } 58 CreateLayoutProperty()59 RefPtr<LayoutProperty> CreateLayoutProperty() override 60 { 61 return MakeRefPtr<SideBarContainerLayoutProperty>(); 62 } 63 CreateLayoutAlgorithm()64 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override 65 { 66 auto layoutAlgorithm = MakeRefPtr<SideBarContainerLayoutAlgorithm>(); 67 layoutAlgorithm->SetCurrentOffset(currentOffset_); 68 layoutAlgorithm->SetSideBarStatus(sideBarStatus_); 69 layoutAlgorithm->SetNeedInitRealSideBarWidth(needInitRealSideBarWidth_); 70 layoutAlgorithm->SetRealSideBarWidth(realSideBarWidth_); 71 layoutAlgorithm->SetPreSideBarWidth(preSidebarWidth_); 72 layoutAlgorithm->SetRealSideBarHeight(realSideBarHeight_); 73 layoutAlgorithm->SetRealDividerWidth(realDividerWidth_); 74 layoutAlgorithm->SetControlButtonClick(isControlButtonClick_); 75 auto layoutProperty = GetLayoutProperty<SideBarContainerLayoutProperty>(); 76 if (layoutProperty) { 77 layoutAlgorithm->SetSideBarContainerType(type_); 78 } 79 layoutAlgorithm->SetMinSideBarWidth(minSideBarWidth_); 80 layoutAlgorithm->SetMaxSideBarWidth(maxSideBarWidth_); 81 layoutAlgorithm->SetMinContentWidth(minContentWidth_); 82 layoutAlgorithm->SetTypeUpdateWidth(typeUpdateWidth_); 83 layoutAlgorithm->SetControlImageWidth(controlImageWidth_); 84 layoutAlgorithm->SetControlImageHeight(controlImageHeight_); 85 auto host = GetHost(); 86 auto sideBarContainerPattern = host->GetPattern<SideBarContainerPattern>(); 87 layoutAlgorithm->SetPattern(AceType::WeakClaim(AceType::RawPtr(sideBarContainerPattern))); 88 return layoutAlgorithm; 89 } 90 CreateEventHub()91 RefPtr<EventHub> CreateEventHub() override 92 { 93 return MakeRefPtr<SideBarContainerEventHub>(); 94 } 95 SetSideBarStatus(SideBarStatus sideBarStatus)96 void SetSideBarStatus(SideBarStatus sideBarStatus) 97 { 98 sideBarStatus_ = sideBarStatus; 99 showSideBar_ = sideBarStatus_ == SideBarStatus::SHOW; 100 SetAccessibilityEvent(); 101 } 102 SetHasControlButton(bool hasControlButton)103 void SetHasControlButton(bool hasControlButton) 104 { 105 hasControlButton_ = hasControlButton; 106 } 107 HasControlButton()108 bool HasControlButton() const 109 { 110 return hasControlButton_; 111 } 112 MarkNeedInitRealSideBarWidth(bool value)113 void MarkNeedInitRealSideBarWidth(bool value) 114 { 115 needInitRealSideBarWidth_ = value; 116 } 117 118 void OnColorConfigurationUpdate() override; 119 SetControlButtonClick(bool value)120 void SetControlButtonClick(bool value) 121 { 122 isControlButtonClick_ = value; 123 } 124 SetRightToLeftMode(bool value)125 void SetRightToLeftMode(bool value) 126 { 127 isRightToLeft_ = value; 128 } 129 GetFocusPattern()130 FocusPattern GetFocusPattern() const override 131 { 132 return { FocusType::SCOPE, true }; 133 } 134 GetScopeFocusAlgorithm()135 ScopeFocusAlgorithm GetScopeFocusAlgorithm() override 136 { 137 return { false, true, ScopeType::OTHERS }; 138 } 139 140 RefPtr<NodePaintMethod> CreateNodePaintMethod() override; 141 void InitControlButtonTouchEvent(const RefPtr<GestureEventHub>& gestureHub); 142 void InitDividerMouseEvent(const RefPtr<InputEventHub>& inputHub); 143 void UpdateSideBarPosition(float value); SetMinSideBarWidth(float minSideBarWidth)144 void SetMinSideBarWidth(float minSideBarWidth) 145 { 146 minSideBarWidth_ = minSideBarWidth; 147 } SetMaxSideBarWidth(float maxSideBarWidth)148 void SetMaxSideBarWidth(float maxSideBarWidth) 149 { 150 maxSideBarWidth_ = maxSideBarWidth; 151 } SetMinContentWidth(float minContentWidth)152 void SetMinContentWidth(float minContentWidth) 153 { 154 minContentWidth_ = minContentWidth; 155 } SetTypeUpdateWidth(float typeUpdateWidth)156 void SetTypeUpdateWidth(float typeUpdateWidth) 157 { 158 typeUpdateWidth_ = typeUpdateWidth; 159 } 160 void GetControlImageSize(Dimension& width, Dimension& height); 161 GetShowSideBar()162 bool GetShowSideBar() const 163 { 164 return showSideBar_; 165 } 166 SetImageInfo(ImageSourceInfo imageInfo)167 void SetImageInfo(ImageSourceInfo imageInfo) 168 { 169 imageInfo_ = imageInfo; 170 } 171 GetIsInDividerDrag()172 bool GetIsInDividerDrag() const 173 { 174 return isInDividerDrag_; 175 } 176 177 bool OnThemeScopeUpdate(int32_t themeScopeId) override; 178 InitToolBarManager()179 void InitToolBarManager() 180 { 181 if (!toolbarManager_) { 182 auto pipeline = GetHost()->GetContext(); 183 CHECK_NULL_VOID(pipeline); 184 toolbarManager_ = pipeline->GetToolbarManager(); 185 UpdateSideBarStatus(); 186 UpdateSideBarColorToToolbarManager(); 187 } 188 } 189 GetToolBarManager()190 RefPtr<ToolbarManager> GetToolBarManager() 191 { 192 return toolbarManager_; 193 } 194 195 private: 196 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override; 197 void OnAttachToFrameNode() override; 198 void OnDetachFromFrameNode(FrameNode* frameNode) override; 199 void OnModifyDone() override; 200 void UpdateAnimDir(); 201 void DoAnimation(); 202 void CreateAnimation(); 203 void FireChangeEvent(bool isShow); 204 void UpdateControlButtonIcon(); 205 void CreateAndMountNodes(); 206 void CreateAndMountDivider(const RefPtr<NG::FrameNode>& parentNode); 207 void CreateAndMountControlButton(const RefPtr<NG::FrameNode>& parentNode); 208 RefPtr<FrameNode> CreateControlButton(const RefPtr<SideBarTheme>& sideBarTheme); 209 RefPtr<FrameNode> CreateControlImage(const RefPtr<SideBarTheme>& sideBarTheme, 210 const RefPtr<FrameNode>& parentNode); 211 void InitPanEvent(const RefPtr<GestureEventHub>& gestureHub); 212 void HandleDragStart(); 213 void HandleDragUpdate(float xOffset); 214 void HandleDragEnd(); 215 void FireSideBarWidthChangeEvent(); 216 void HandlePanEventEnd(); 217 void OnUpdateShowSideBar(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty); 218 void OnUpdateShowControlButton( 219 const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, const RefPtr<FrameNode>& host); 220 void OnUpdateShowDivider( 221 const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, const RefPtr<FrameNode>& host); 222 void OnUpdateSideBarAndContent(const RefPtr<FrameNode>& host); 223 void OnDividerMouseEvent(MouseInfo& info); 224 void OnHover(bool isHover); 225 void AddDividerHotZoneRect(const RefPtr<SideBarContainerLayoutAlgorithm>& layoutAlgorithm); 226 SideBarPosition GetSideBarPositionWithRtl(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty); 227 RefPtr<FrameNode> GetSideBarNode(const RefPtr<FrameNode>& host) const; 228 RefPtr<FrameNode> GetFirstFrameNode(const RefPtr<UINode>& host) const; 229 RefPtr<FrameNode> GetSideBarNodeOrFirstChild() const; 230 RefPtr<FrameNode> GetControlButtonNode() const; 231 RefPtr<FrameNode> GetContentNode(const RefPtr<FrameNode>& host) const; 232 RefPtr<FrameNode> GetControlImageNode() const; 233 RefPtr<FrameNode> GetDividerNode() const; 234 std::optional<float> DimensionConvertToPx(const Dimension& value) const; 235 Dimension ConvertPxToPercent(float value) const; 236 void UpdateDividerShadow() const; 237 void SetSideBarActive(bool isActive, bool onlyJsActive) const; 238 void OnLanguageConfigurationUpdate() override; 239 void OnWindowSizeChanged(int32_t width, int32_t height, WindowSizeChangeReason type) override; 240 void RegisterElementInfoCallBack(const RefPtr<FrameNode>& buttonNode); 241 void SetAccessibilityEvent(); 242 void InitImageErrorCallback(const RefPtr<SideBarTheme>& sideBarTheme, const RefPtr<FrameNode>& imgNode); 243 void SetMouseStyle(MouseFormat format); 244 void UpdateSideBarStatus(); 245 void SetSideBarWidthToolBarManager(bool isShow, float sideBarWidth, float dividerWidth); 246 void SideBarModifyDoneToolBarManager(); 247 void UpdateSideBarColorToToolbarManager(); 248 249 RefPtr<InputEvent> hoverEvent_; 250 RefPtr<InputEvent> dividerMouseEvent_; 251 RefPtr<ClickEvent> controlButtonClickEvent_; 252 RefPtr<InputEvent> controlButtonHoverEvent_; 253 RefPtr<PanEvent> panEvent_; 254 RefPtr<Animator> controller_; 255 RefPtr<CurveAnimation<float>> rightToLeftAnimation_; 256 RefPtr<CurveAnimation<float>> leftToRightAnimation_; 257 RefPtr<PanEvent> dragEvent_; 258 RefPtr<ToolbarManager> toolbarManager_; 259 260 float currentOffset_ = 0.0f; 261 float realDividerWidth_ = 0.0f; 262 SideBarStatus sideBarStatus_ = SideBarStatus::SHOW; 263 bool showSideBar_ = true; 264 bool needInitRealSideBarWidth_ = true; 265 RectF dragRect_; 266 bool hasControlButton_ = false; 267 SideBarAnimationDirection animDir_ = SideBarAnimationDirection::LTR; 268 bool isControlButtonClick_ = false; 269 bool hasInit_ = false; 270 bool autoHide_ = false; 271 bool inAnimation_ = false; 272 bool isRightToLeft_ = false; 273 bool isInDividerDrag_ = false; 274 bool isDividerDraggable_ = true; 275 bool userSetShowSideBar_ = true; 276 277 Dimension realSideBarWidth_ = -1.0_vp; 278 Dimension preSidebarWidth_; 279 Dimension userSetSidebarWidth_; 280 Dimension adjustMaxSideBarWidth_; 281 Dimension adjustMinSideBarWidth_; 282 SideBarContainerType type_ = SideBarContainerType::EMBED; 283 float minContentWidth_ = -1.0f; 284 float minSideBarWidth_ = -1.0f; 285 float maxSideBarWidth_ = -1.0f; 286 float typeUpdateWidth_ = 0.0f; 287 float realSideBarHeight_ = 0.0f; 288 Dimension controlImageWidth_; 289 Dimension controlImageHeight_; 290 291 ACE_DISALLOW_COPY_AND_MOVE(SideBarContainerPattern); 292 293 RefPtr<LongPressEvent> longPressEvent_; 294 GestureEventFunc longPressActionEnd_; 295 RefPtr<FrameNode> dialogNode_; 296 ImageSourceInfo imageInfo_; 297 void InitLongPressEvent(const RefPtr<FrameNode>& buttonNode); 298 void HandleLongPressEvent(); 299 void HandleLongPressActionEnd(); 300 void ShowDialogWithNode(); 301 bool isDialogShow_ = false; 302 }; 303 304 } // namespace OHOS::Ace::NG 305 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SIDE_BAR_SIDE_BAR_CONTAINER_PATTERN_H 306