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