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_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_ALGORITHM_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_ALGORITHM_H
18 
19 #include "base/memory/referenced.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components_ng/layout/layout_algorithm.h"
22 #include "core/components_ng/layout/layout_wrapper.h"
23 #include "core/components_ng/pattern/pattern.h"
24 #include "core/components_ng/pattern/side_bar/side_bar_container_layout_property.h"
25 
26 namespace OHOS::Ace::NG {
27 
28 class ACE_EXPORT SideBarContainerLayoutAlgorithm : public LayoutAlgorithm {
29     DECLARE_ACE_TYPE(SideBarContainerLayoutAlgorithm, LayoutAlgorithm);
30 
31 public:
32     SideBarContainerLayoutAlgorithm() = default;
33     ~SideBarContainerLayoutAlgorithm() override = default;
34 
OnReset()35     void OnReset() override {}
36     void Measure(LayoutWrapper* layoutWrapper) override;
37     void Layout(LayoutWrapper* layoutWrapper) override;
38 
SetCurrentOffset(float offset)39     void SetCurrentOffset(float offset)
40     {
41         currentOffset_ = offset;
42     }
43 
SetSideBarStatus(SideBarStatus sideBarStatus)44     void SetSideBarStatus(SideBarStatus sideBarStatus)
45     {
46         sideBarStatus_ = sideBarStatus;
47     }
48 
GetSideBarStatus()49     SideBarStatus GetSideBarStatus() const
50     {
51         return sideBarStatus_;
52     }
53 
SetRealSideBarWidth(Dimension realSideBarWidth)54     void SetRealSideBarWidth(Dimension realSideBarWidth)
55     {
56         realSideBarWidthDimension_ = realSideBarWidth;
57     }
58 
GetRealSideBarWidth()59     Dimension GetRealSideBarWidth() const
60     {
61         return realSideBarWidthDimension_;
62     }
63 
SetRealDividerWidth(float realDividerWidth)64     void SetRealDividerWidth(float realDividerWidth)
65     {
66         realDividerWidth_ = realDividerWidth;
67     }
68 
GetRealDividerWidth()69     float GetRealDividerWidth() const
70     {
71         return realDividerWidth_;
72     }
73 
SetNeedInitRealSideBarWidth(bool needInitRealSideBarWidth)74     void SetNeedInitRealSideBarWidth(bool needInitRealSideBarWidth)
75     {
76         needInitRealSideBarWidth_ = needInitRealSideBarWidth;
77     }
78 
SetRealSideBarHeight(float realSideBarHeight)79     void SetRealSideBarHeight(float realSideBarHeight)
80     {
81         realSideBarHeight_ = realSideBarHeight;
82     }
83 
GetRealSideBarHeight()84     float GetRealSideBarHeight() const
85     {
86         return realSideBarHeight_;
87     }
88 
GetSideBarOffset()89     OffsetF GetSideBarOffset() const
90     {
91         return sideBarOffset_;
92     }
93 
GetSideBarContainerType()94     SideBarContainerType GetSideBarContainerType() const
95     {
96         return type_;
97     }
98 
SetSideBarContainerType(SideBarContainerType type)99     void SetSideBarContainerType(SideBarContainerType type)
100     {
101         type_ = type;
102     }
103 
SetControlButtonClick(bool value)104     void SetControlButtonClick(bool value)
105     {
106         isControlButtonClick_ = value;
107     }
108 
GetAdjustMaxSideBarWidth()109     Dimension GetAdjustMaxSideBarWidth() const
110     {
111         return adjustMaxSideBarWidth_;
112     }
113 
GetAdjustMinSideBarWidth()114     Dimension GetAdjustMinSideBarWidth() const
115     {
116         return adjustMinSideBarWidth_;
117     }
118 
SetMinSideBarWidth(float minSideBarWidth)119     void SetMinSideBarWidth(float minSideBarWidth)
120     {
121         minSideBarWidth_ = minSideBarWidth;
122     }
123 
SetMaxSideBarWidth(float maxSideBarWidth)124     void SetMaxSideBarWidth(float maxSideBarWidth)
125     {
126         maxSideBarWidth_ = maxSideBarWidth;
127     }
128 
SetMinContentWidth(float minContentWidth)129     void SetMinContentWidth(float minContentWidth)
130     {
131         minContentWidth_ = minContentWidth;
132     }
133 
SetTypeUpdateWidth(float typeUpdateWidth)134     void SetTypeUpdateWidth(float typeUpdateWidth)
135     {
136         typeUpdateWidth_ = typeUpdateWidth;
137     }
138 
SetPattern(const WeakPtr<Pattern> & pattern)139     void SetPattern(const WeakPtr<Pattern>& pattern)
140     {
141         pattern_ = pattern;
142     }
143 
SetControlImageWidth(const Dimension & width)144     void SetControlImageWidth(const Dimension& width)
145     {
146         controlImageWidth_ = width;
147     }
148 
SetControlImageHeight(const Dimension & height)149     void SetControlImageHeight(const Dimension& height)
150     {
151         controlImageHeight_ = height;
152     }
153 
SetPreSideBarWidth(Dimension value)154     void SetPreSideBarWidth(Dimension value)
155     {
156         preSideBarWidth_ = value;
157     }
158 
GetPreSideBarWidth()159     Dimension GetPreSideBarWidth() const
160     {
161         return preSideBarWidth_;
162     }
163 
GetAutoHide()164     bool GetAutoHide() const
165     {
166         return autoHide_;
167     }
168 
169 private:
170     void MeasureControlButton(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty,
171         const RefPtr<LayoutWrapper>& buttonLayoutWrapper, float parentWidth);
172     void MeasureSideBar(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty,
173         const RefPtr<LayoutWrapper>& sideBarLayoutWrapper);
174     void MeasureSideBarContent(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty,
175         const RefPtr<LayoutWrapper>& contentLayoutWrapper, float parentWidth);
176     void MeasureDivider(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty,
177         const RefPtr<LayoutWrapper>& dividerLayoutWrapper, float parentWidth);
178     void LayoutControlButton(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& buttonLayoutWrapper);
179     void LayoutSideBar(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& sideBarLayoutWrapper);
180     void LayoutSideBarContent(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& contentLayoutWrapper);
181     void LayoutDivider(LayoutWrapper* layoutWrapper, const RefPtr<LayoutWrapper>& dividerLayoutWrapper);
182     void InitRealSideBarWidth(LayoutWrapper* layoutWrapper, float parentWidth);
183     void AutoMode(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, float parentWidth);
184     void AutoChangeSideBarWidth(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, float parentWidth);
185     void UpdateDefaultValueByVersion();
186     SideBarPosition GetSideBarPositionWithRtl(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty);
187     void AdjustMinAndMaxSideBarWidth(LayoutWrapper* layoutWrapper);
188     RefPtr<LayoutWrapper> GetSideBarLayoutWrapper(LayoutWrapper* layoutWrapper) const;
189     void GetAllPropertyValue(const RefPtr<SideBarContainerLayoutProperty>& layoutProperty, float parentWidth);
190     void InitSideBarWidth(float parentWidth);
191     void MeasureRealSideBarWidth(float parentWidth);
192     void MeasureTypeUpdateWidth();
193     void MeasureRealPropertyValue(bool setMinSideBarWidth, bool setMaxSideBarWidth, bool setSideBarWidth,
194         bool setMinContentWidth, float paretWidth);
195 
196     float currentOffset_ = 0.0f;
197     float realSideBarWidth_ = -1.0f;
198     float realSideBarHeight_ = 0.0f;
199     float realDividerWidth_ = 0.0f;
200     float minContentWidth_ = -1.0f;
201     float minSideBarWidth_ = -1.0f;
202     float maxSideBarWidth_ = -1.0f;
203 
204     float defaultRealSideBarWidth_ = 0.0f;
205     float defaultMinSideBarWidth_ = 0.0f;
206     float defaultMaxSideBarWidth_ = 0.0f;
207     float defaultMinContentWidth_ = 0.0f;
208     float typeUpdateWidth_ = 0.0f;
209     WeakPtr<Pattern> pattern_;
210     SideBarStatus sideBarStatus_ = SideBarStatus::SHOW;
211     bool needInitRealSideBarWidth_ = true;
212     OffsetF sideBarOffset_;
213     SideBarContainerType type_ = SideBarContainerType::EMBED;
214     bool isControlButtonClick_ = false;
215     bool autoHide_ = false;
216 
217     Dimension adjustMaxSideBarWidth_;
218     Dimension adjustMinSideBarWidth_;
219     Dimension controlImageWidth_;
220     Dimension controlImageHeight_;
221     Dimension realSideBarWidthDimension_;
222     Dimension preSideBarWidth_;
223 
224     ACE_DISALLOW_COPY_AND_MOVE(SideBarContainerLayoutAlgorithm);
225 };
226 
227 } // namespace OHOS::Ace::NG
228 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SIDE_BAR_SIDE_BAR_CONTAINER_LAYOUT_ALGORITHM_H
229