1 /*
2  * Copyright (c) 2021-2022 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_BOX_BOX_BASE_COMPONENT_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BOX_BOX_BASE_COMPONENT_H
18 
19 #include <string>
20 
21 #include "base/geometry/animatable_dimension.h"
22 #include "base/image/pixel_map.h"
23 #include "core/components/box/mask.h"
24 #include "core/components/common/layout/align_declaration.h"
25 #include "core/components/common/layout/grid_column_info.h"
26 #include "core/components/common/layout/grid_layout_info.h"
27 #include "core/components/common/properties/alignment.h"
28 #include "core/components/common/properties/clip_path.h"
29 #include "core/components/common/properties/edge.h"
30 #include "core/pipeline/base/component.h"
31 #include "core/pipeline/base/component_group.h"
32 #include "core/pipeline/base/measurable.h"
33 #include "core/pipeline/base/sole_child_component.h"
34 
35 namespace OHOS::Ace {
36 
37 constexpr uint32_t PERCENT_FLAG_USE_VIEW_PORT = 1;
38 
39 // A component can box other components.
40 class BoxBaseComponent : public SoleChildComponent, public Measurable {
41     DECLARE_ACE_TYPE(BoxBaseComponent, SoleChildComponent, Measurable);
42 
43 public:
GetAlignment()44     const Alignment& GetAlignment() const
45     {
46         return align_;
47     }
48 
GetConstraints()49     const LayoutParam& GetConstraints() const
50     {
51         return constraints_;
52     }
53 
GetPadding()54     const Edge& GetPadding() const
55     {
56         return padding_;
57     }
58 
GetMargin()59     const Edge& GetMargin() const
60     {
61         return margin_;
62     }
63 
GetAdditionalPadding()64     const Edge& GetAdditionalPadding() const
65     {
66         return additionalPadding_;
67     }
68 
GetWidthDimension()69     const AnimatableDimension& GetWidthDimension() const
70     {
71         return GetWidth();
72     }
73 
GetHeightDimension()74     const AnimatableDimension& GetHeightDimension() const
75     {
76         return GetHeight();
77     }
78 
GetFlex()79     BoxFlex GetFlex() const
80     {
81         return flex_;
82     }
83 
GetDeliverMinToChild()84     bool GetDeliverMinToChild() const
85     {
86         return deliverMinToChild_;
87     }
88 
GetScrollPage()89     bool GetScrollPage() const
90     {
91         return scrollPage_;
92     }
93 
GetPercentFlag()94     uint32_t GetPercentFlag() const
95     {
96         return percentFlag_;
97     }
98 
GetLayoutInBoxFlag()99     bool GetLayoutInBoxFlag() const
100     {
101         return layoutInBox_;
102     }
103 
SetAlignment(const Alignment & alignment)104     void SetAlignment(const Alignment& alignment)
105     {
106         align_ = alignment;
107     }
108 
SetConstraints(const LayoutParam & constraints)109     void SetConstraints(const LayoutParam& constraints)
110     {
111         if (!constraints.IsWidthValid() || !constraints.IsHeightValid()) {
112             return;
113         }
114         constraints_ = constraints;
115     }
116 
SetMargin(const Edge & margin)117     void SetMargin(const Edge& margin)
118     {
119         // Margin need to support negative number.
120         margin_ = margin;
121     }
122 
123     void SetPadding(const Edge& padding, const Edge& additionalPadding = Edge())
124     {
125         if (padding.IsValid()) {
126             // Padding not support negative number.
127             padding_ = padding;
128         }
129         if (additionalPadding.IsValid()) {
130             additionalPadding_ = additionalPadding;
131         }
132     }
133 
SetFlex(BoxFlex flex)134     void SetFlex(BoxFlex flex)
135     {
136         flex_ = flex;
137     }
138 
SetDeliverMinToChild(bool deliverMinToChild)139     void SetDeliverMinToChild(bool deliverMinToChild)
140     {
141         deliverMinToChild_ = deliverMinToChild;
142     }
143 
SetScrollPage(bool scrollPage)144     void SetScrollPage(bool scrollPage)
145     {
146         scrollPage_ = scrollPage;
147     }
148 
SetPercentFlag(uint32_t flag)149     void SetPercentFlag(uint32_t flag)
150     {
151         percentFlag_ = flag;
152     }
153 
SetLayoutInBoxFlag(bool layoutInBox)154     void SetLayoutInBoxFlag(bool layoutInBox)
155     {
156         layoutInBox_ = layoutInBox;
157     }
158 
SetAspectRatio(double aspectRatio)159     void SetAspectRatio(double aspectRatio)
160     {
161         aspectRatio_ = AnimatableDimension(aspectRatio);
162     }
163 
SetAspectRatio(double aspectRatio,AnimationOption option)164     void SetAspectRatio(double aspectRatio, AnimationOption option)
165     {
166         aspectRatio_ = AnimatableDimension(aspectRatio, DimensionUnit::PX, option);
167     }
168 
GetAspectRatio()169     AnimatableDimension GetAspectRatio() const
170     {
171         return aspectRatio_;
172     }
173 
SetMinWidth(const CalcDimension & minWidth)174     void SetMinWidth(const CalcDimension& minWidth)
175     {
176         minWidth_ = minWidth;
177     }
178 
GetMinWidth()179     const CalcDimension& GetMinWidth() const
180     {
181         return minWidth_;
182     }
183 
SetMinHeight(const CalcDimension & minHeight)184     void SetMinHeight(const CalcDimension& minHeight)
185     {
186         minHeight_ = minHeight;
187     }
188 
GetMinHeight()189     const CalcDimension& GetMinHeight() const
190     {
191         return minHeight_;
192     }
193 
SetMaxWidth(const CalcDimension & maxWidth)194     void SetMaxWidth(const CalcDimension& maxWidth)
195     {
196         maxWidth_ = maxWidth;
197     }
198 
GetMaxWidth()199     const CalcDimension& GetMaxWidth() const
200     {
201         return maxWidth_;
202     }
203 
SetMaxHeight(const CalcDimension & maxHeight)204     void SetMaxHeight(const CalcDimension& maxHeight)
205     {
206         maxHeight_ = maxHeight;
207     }
208 
GetMaxHeight()209     const CalcDimension& GetMaxHeight() const
210     {
211         return maxHeight_;
212     }
213 
GetGridLayoutInfo()214     const RefPtr<GridLayoutInfo>& GetGridLayoutInfo() const
215     {
216         return gridLayoutInfo_;
217     }
218 
SetGridLayoutInfo(const RefPtr<GridLayoutInfo> & gridLayoutInfo)219     void SetGridLayoutInfo(const RefPtr<GridLayoutInfo>& gridLayoutInfo)
220     {
221         gridLayoutInfo_ = gridLayoutInfo;
222     }
223 
GetGridColumnInfoBuilder()224     RefPtr<GridColumnInfo::Builder> GetGridColumnInfoBuilder()
225     {
226         if (!gridColumnInfoBuilder_) {
227             gridColumnInfoBuilder_ = AceType::MakeRefPtr<GridColumnInfo::Builder>();
228         }
229         return gridColumnInfoBuilder_;
230     }
231 
OnWrap()232     void OnWrap() override
233     {
234         if (gridColumnInfoBuilder_) {
235             SetGridLayoutInfo(gridColumnInfoBuilder_->Build());
236             gridColumnInfoBuilder_ = nullptr;
237         }
238     }
239 
SetUseLiteStyle(bool flag)240     void SetUseLiteStyle(bool flag)
241     {
242         useLiteStyle_ = flag;
243     }
244 
UseLiteStyle()245     bool UseLiteStyle() const
246     {
247         return useLiteStyle_;
248     }
249 
SetOverflow(Overflow overflow)250     void SetOverflow(Overflow overflow)
251     {
252         overflow_ = overflow;
253     }
254 
GetOverflow()255     Overflow GetOverflow() const
256     {
257         return overflow_;
258     }
259 
GetClipPath()260     const RefPtr<ClipPath>& GetClipPath() const
261     {
262         return clipPath_;
263     }
264 
SetClipPath(const RefPtr<ClipPath> & clipPath)265     void SetClipPath(const RefPtr<ClipPath>& clipPath)
266     {
267         clipPath_ = clipPath;
268     }
GetMask()269     const RefPtr<Mask>& GetMask() const
270     {
271         return mask_;
272     }
273 
SetMask(const std::string & image,const BackgroundImageSize & size,const BackgroundImagePosition & position)274     void SetMask(const std::string& image, const BackgroundImageSize& size, const BackgroundImagePosition& position)
275     {
276         if (!image.empty()) {
277             if (!mask_) {
278                 mask_ = Mask::Create();
279             }
280             if (mask_) {
281                 mask_->SetMaskImage(image);
282                 mask_->SetMaskSize(size);
283                 mask_->SetMaskPosition(position);
284             }
285         }
286     }
287 
SetMask(const RefPtr<MaskPath> & maskPath)288     void SetMask(const RefPtr<MaskPath>& maskPath)
289     {
290         if (!mask_) {
291             mask_ = Mask::Create();
292         }
293         if (mask_) {
294             mask_->SetMask(maskPath);
295         }
296     }
297 
GetBoxSizing()298     BoxSizing GetBoxSizing() const
299     {
300         return boxSizing_;
301     }
302 
SetBoxSizing(BoxSizing boxSizing)303     void SetBoxSizing(BoxSizing boxSizing)
304     {
305         boxSizing_ = boxSizing;
306     }
307 
SetAlignDeclarationPtr(AlignDeclarationPtr alignPtr)308     void SetAlignDeclarationPtr(AlignDeclarationPtr alignPtr)
309     {
310         alignPtr_ = alignPtr;
311     }
312 
GetAlignDeclarationPtr()313     AlignDeclarationPtr GetAlignDeclarationPtr() const
314     {
315         return alignPtr_;
316     }
317 
SetUseAlignSide(AlignDeclaration::Edge side)318     void SetUseAlignSide(AlignDeclaration::Edge side)
319     {
320         alignSide_ = side;
321     }
322 
GetUseAlignSide()323     AlignDeclaration::Edge GetUseAlignSide() const
324     {
325         return alignSide_;
326     }
327 
SetUseAlignOffset(const Dimension & offset)328     void SetUseAlignOffset(const Dimension& offset)
329     {
330         alignOffset_ = offset;
331     }
332 
GetUseAlignOffset()333     const Dimension& GetUseAlignOffset() const
334     {
335         return alignOffset_;
336     }
337 
IsUseAlign()338     bool IsUseAlign() const
339     {
340         return alignPtr_ != nullptr && alignSide_ != AlignDeclaration::Edge::AUTO;
341     }
342 
SetBoxClipFlag(bool boxClipFlag)343     void SetBoxClipFlag(bool boxClipFlag)
344     {
345         boxClipFlag_ = boxClipFlag;
346     }
347 
GetBoxClipFlag()348     bool GetBoxClipFlag() const
349     {
350         return boxClipFlag_;
351     }
352 
SetPixelMap(const RefPtr<PixelMap> & pixelMap)353     void SetPixelMap(const RefPtr<PixelMap>& pixelMap)
354     {
355         pixelMap_ = pixelMap;
356     }
357 
GetPixelMap()358     const RefPtr<PixelMap>& GetPixelMap() const
359     {
360         return pixelMap_;
361     }
362 
GetDisplayType()363     DisplayType GetDisplayType() const
364     {
365         return displayType_;
366     }
367 
SetDisplayType(DisplayType displayType)368     void SetDisplayType(DisplayType displayType)
369     {
370         displayType_ = displayType;
371     }
372 private:
373     Alignment align_;
374     LayoutParam constraints_ = LayoutParam(Size(), Size()); // no constraints when init
375     Edge padding_;
376     Edge margin_;
377     Edge additionalPadding_;
378     BoxFlex flex_ { BoxFlex::FLEX_NO };
379     bool deliverMinToChild_ = true;
380     bool scrollPage_ = false;
381     uint32_t percentFlag_ = 1;
382     bool layoutInBox_ = false;
383     AnimatableDimension aspectRatio_ = AnimatableDimension();
384     CalcDimension minWidth_ = Dimension();
385     CalcDimension minHeight_ = Dimension();
386     CalcDimension maxWidth_ = Dimension();
387     CalcDimension maxHeight_ = Dimension();
388     RefPtr<GridLayoutInfo> gridLayoutInfo_;
389     RefPtr<GridColumnInfo::Builder> gridColumnInfoBuilder_;
390     bool useLiteStyle_ = false;
391     Overflow overflow_ = Overflow::OBSERVABLE;
392     RefPtr<ClipPath> clipPath_;
393     RefPtr<Mask> mask_;
394     BoxSizing boxSizing_ = BoxSizing::BORDER_BOX;
395     bool boxClipFlag_ = false;
396     RefPtr<PixelMap> pixelMap_ = nullptr;
397 
398     AlignDeclarationPtr alignPtr_ = nullptr;
399     AlignDeclaration::Edge alignSide_ { AlignDeclaration::Edge::AUTO };
400     Dimension alignOffset_;
401     DisplayType displayType_ = DisplayType::NO_SETTING;
402 };
403 
404 } // namespace OHOS::Ace
405 
406 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BOX_BOX_BASE_COMPONENT_H
407