1 /*
2  * Copyright (c) 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 #include "core/components_ng/pattern/overlay/sheet_view.h"
17 
18 #include "base/geometry/axis.h"
19 #include "base/geometry/ng/offset_t.h"
20 #include "base/i18n/localization.h"
21 #include "base/utils/utils.h"
22 #include "core/common/ace_application_info.h"
23 #include "core/common/container.h"
24 #include "core/components/common/layout/constants.h"
25 #include "core/components/drag_bar/drag_bar_theme.h"
26 #include "core/components_ng/pattern/button/button_pattern.h"
27 #include "core/components_ng/pattern/image/image_pattern.h"
28 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
29 #include "core/components_ng/pattern/linear_layout/linear_layout_property.h"
30 #include "core/components_ng/pattern/overlay/sheet_drag_bar_paint_property.h"
31 #include "core/components_ng/pattern/overlay/sheet_drag_bar_pattern.h"
32 #include "core/components_ng/pattern/overlay/sheet_presentation_pattern.h"
33 #include "core/components_ng/pattern/overlay/sheet_presentation_property.h"
34 #include "core/components_ng/pattern/overlay/sheet_style.h"
35 #include "core/components_ng/pattern/scroll/scroll_pattern.h"
36 #include "core/components_ng/pattern/scrollable/scrollable_paint_property.h"
37 #include "core/components_ng/pattern/text/text_layout_property.h"
38 #include "core/components_ng/pattern/text/text_pattern.h"
39 #include "core/components_ng/property/measure_property.h"
40 #include "core/components_ng/property/measure_utils.h"
41 #include "core/components_v2/inspector/inspector_constants.h"
42 #include "core/pipeline/base/element_register.h"
43 #include "core/pipeline_ng/pipeline_context.h"
44 
45 namespace OHOS::Ace::NG {
46 namespace {
47 constexpr int32_t SHEET_DETENTS_TWO = 2;
48 constexpr int32_t SHEET_DETENTS_THREE = 3;
49 } // namespace
CreateSheetPage(int32_t targetId,std::string targetTag,RefPtr<UINode> builder,RefPtr<FrameNode> titleBuilder,std::function<void (const std::string &)> && callback,NG::SheetStyle & sheetStyle)50 RefPtr<FrameNode> SheetView::CreateSheetPage(int32_t targetId, std::string targetTag, RefPtr<UINode> builder,
51     RefPtr<FrameNode> titleBuilder, std::function<void(const std::string&)>&& callback, NG::SheetStyle& sheetStyle)
52 {
53     // create sheet node
54     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::SHEET_PAGE_TAG, targetId);
55     auto sheetNode = FrameNode::CreateFrameNode(V2::SHEET_PAGE_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
56         AceType::MakeRefPtr<SheetPresentationPattern>(targetId, targetTag, std::move(callback)));
57     sheetNode->SetDragHitTestBlock(true);
58     auto sheetLayoutProperty = sheetNode->GetLayoutProperty<SheetPresentationProperty>();
59     CHECK_NULL_RETURN(sheetLayoutProperty, nullptr);
60     sheetLayoutProperty->UpdateSheetStyle(sheetStyle);
61     auto eventConfirmHub = sheetNode->GetOrCreateGestureEventHub();
62     CHECK_NULL_RETURN(eventConfirmHub, nullptr);
63     eventConfirmHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(
64         [](const GestureEvent& /* info */) { TAG_LOGD(AceLogTag::ACE_SHEET, "The sheet hits the click event."); }));
65     auto operationColumn = CreateOperationColumnNode(titleBuilder, sheetStyle, sheetNode);
66     CHECK_NULL_RETURN(operationColumn, nullptr);
67     operationColumn->MountToParent(sheetNode);
68     auto scrollNode = CreateScrollNode();
69     CHECK_NULL_RETURN(scrollNode, nullptr);
70     builder->MountToParent(scrollNode);
71 
72     auto layoutProperty = scrollNode->GetLayoutProperty<ScrollLayoutProperty>();
73     scrollNode->MountToParent(sheetNode);
74     layoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
75     CreateCloseIconButtonNode(sheetNode, sheetStyle);
76     sheetNode->MarkModifyDone();
77     return sheetNode;
78 }
79 
CreateOperationColumnNode(RefPtr<FrameNode> titleBuilder,NG::SheetStyle & sheetStyle,RefPtr<FrameNode> sheetNode)80 RefPtr<FrameNode> SheetView::CreateOperationColumnNode(
81     RefPtr<FrameNode> titleBuilder, NG::SheetStyle& sheetStyle, RefPtr<FrameNode> sheetNode)
82 {
83     auto operationColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG,
84         ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<LinearLayoutPattern>(true));
85     CHECK_NULL_RETURN(operationColumn, nullptr);
86     auto layoutProps = operationColumn->GetLayoutProperty<LinearLayoutProperty>();
87     CHECK_NULL_RETURN(layoutProps, nullptr);
88     auto pipeline = PipelineContext::GetCurrentContext();
89     CHECK_NULL_RETURN(pipeline, nullptr);
90     auto sheetTheme = pipeline->GetTheme<SheetTheme>();
91     CHECK_NULL_RETURN(sheetTheme, nullptr);
92     MarginProperty margin;
93     margin.right = CalcLength(sheetTheme->GetTitleTextMargin());
94     margin.left = CalcLength(sheetTheme->GetTitleTextMargin());
95     layoutProps->UpdateMargin(margin);
96 
97     layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_CROSS_AXIS);
98     if (sheetStyle.isTitleBuilder.has_value() && pipeline->GetFontScale() == sheetTheme->GetSheetNormalScale()) {
99         layoutProps->UpdateUserDefinedIdealSize(
100             CalcSize(std::nullopt, CalcLength(SHEET_OPERATION_AREA_HEIGHT - SHEET_TITLE_AERA_MARGIN)));
101         if (sheetStyle.sheetTitle.has_value() && sheetStyle.sheetSubtitle.has_value()) {
102             layoutProps->UpdateUserDefinedIdealSize(
103                 CalcSize(std::nullopt, CalcLength(SHEET_OPERATION_AREA_HEIGHT_DOUBLE - SHEET_TITLE_AERA_MARGIN)));
104         }
105     }
106     CreateDragBarNode(titleBuilder, operationColumn, sheetStyle, sheetNode);
107     return operationColumn;
108 }
109 
CreateDragBarNode(const RefPtr<FrameNode> & titleBuilder,const RefPtr<FrameNode> & operationColumn,NG::SheetStyle & sheetStyle,const RefPtr<FrameNode> & sheetNode)110 void SheetView::CreateDragBarNode(const RefPtr<FrameNode>& titleBuilder, const RefPtr<FrameNode>& operationColumn,
111     NG::SheetStyle& sheetStyle, const RefPtr<FrameNode>& sheetNode)
112 {
113     auto dragBarNode = FrameNode::GetOrCreateFrameNode("SheetDragBar", ElementRegister::GetInstance()->MakeUniqueId(),
114         []() { return AceType::MakeRefPtr<SheetDragBarPattern>(); });
115     auto dragBarLayoutProperty = dragBarNode->GetLayoutProperty();
116     CHECK_NULL_VOID(dragBarLayoutProperty);
117     dragBarLayoutProperty->UpdateUserDefinedIdealSize(
118         CalcSize(CalcLength(SHEET_DRAG_BAR_WIDTH), CalcLength(SHEET_DRAG_BAR_HEIGHT)));
119     dragBarLayoutProperty->UpdateAlignment(Alignment::CENTER);
120     auto showDragIndicator = sheetStyle.showDragBar.value_or(true);
121     auto isSingleDetents = true;
122     if (sheetStyle.detents.size() == SHEET_DETENTS_TWO) {
123         isSingleDetents = sheetStyle.detents[0] == sheetStyle.detents[1];
124     } else if (sheetStyle.detents.size() == SHEET_DETENTS_THREE) {
125         isSingleDetents = sheetStyle.detents[0] == sheetStyle.detents[1] &&
126                           sheetStyle.detents[1] == sheetStyle.detents[SHEET_DETENTS_TWO];
127     }
128 
129     // 1、showDragBar && not single detents
130     // 2、has SystemTitleBar
131     // need set drag bar invisible to occupy place
132     if ((!isSingleDetents && showDragIndicator) || sheetStyle.isTitleBuilder.has_value()) {
133         dragBarLayoutProperty->UpdateVisibility(VisibleType::INVISIBLE);
134     } else {
135         dragBarLayoutProperty->UpdateVisibility(VisibleType::GONE);
136     }
137 
138     dragBarNode->MountToParent(operationColumn);
139     dragBarNode->MarkModifyDone();
140 
141     if (sheetStyle.isTitleBuilder.has_value()) {
142         auto titleColumn = BuildTitleColumn(sheetNode, sheetStyle);
143         if (titleColumn) {
144             if ((titleBuilder) && (sheetStyle.isTitleBuilder.value())) {
145                 titleColumn->AddChild(titleBuilder);
146                 titleBuilder->MarkModifyDone();
147             }
148             titleColumn->MountToParent(operationColumn);
149             titleColumn->GetRenderContext()->SetClipToBounds(true);
150             titleColumn->GetRenderContext()->UpdateClipEdge(true);
151         }
152     }
153 }
154 
CreateCloseIconButtonNode(RefPtr<FrameNode> sheetNode,NG::SheetStyle & sheetStyle)155 void SheetView::CreateCloseIconButtonNode(RefPtr<FrameNode> sheetNode, NG::SheetStyle& sheetStyle)
156 {
157     if (!Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
158         return;
159     }
160     auto buttonNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
161         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
162     CHECK_NULL_VOID(buttonNode);
163     auto buttonLayoutProperty = buttonNode->GetLayoutProperty<ButtonLayoutProperty>();
164     CHECK_NULL_VOID(buttonLayoutProperty);
165     auto pipeline = PipelineContext::GetCurrentContext();
166     CHECK_NULL_VOID(pipeline);
167     auto sheetTheme = pipeline->GetTheme<SheetTheme>();
168     CHECK_NULL_VOID(sheetTheme);
169     buttonNode->GetRenderContext()->UpdateBackgroundColor(sheetTheme->GetCloseIconColor());
170     buttonLayoutProperty->UpdateBorderRadius(
171         { SHEET_CLOSE_ICON_RADIUS, SHEET_CLOSE_ICON_RADIUS, SHEET_CLOSE_ICON_RADIUS, SHEET_CLOSE_ICON_RADIUS });
172     buttonLayoutProperty->UpdateUserDefinedIdealSize(
173         CalcSize(CalcLength(SHEET_CLOSE_ICON_WIDTH), CalcLength(SHEET_CLOSE_ICON_HEIGHT)));
174     buttonLayoutProperty->UpdateVisibility(VisibleType::GONE);
175     auto eventConfirmHub = buttonNode->GetOrCreateGestureEventHub();
176     CHECK_NULL_VOID(eventConfirmHub);
177     auto clickCallback = [weak = AceType::WeakClaim(AceType::RawPtr(sheetNode))](const GestureEvent& /* info */) {
178         auto sheet = weak.Upgrade();
179         CHECK_NULL_VOID(sheet);
180         auto sheetPattern = sheet->GetPattern<SheetPresentationPattern>();
181         CHECK_NULL_VOID(sheetPattern);
182         sheetPattern->SheetInteractiveDismiss(BindSheetDismissReason::CLOSE_BUTTON);
183     };
184     eventConfirmHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(clickCallback));
185     // make the close button focusable when press tab
186     auto focusHub = buttonNode->GetOrCreateFocusHub();
187     CHECK_NULL_VOID(focusHub);
188     focusHub->SetFocusDependence(FocusDependence::SELF);
189     buttonNode->MarkModifyDone();
190 
191     CreateCloseIconNode(buttonNode);
192     buttonNode->MountToParent(sheetNode);
193 
194     // set accessibilityProperty to sheet close button
195     auto accessibilityProperty = buttonNode->GetAccessibilityProperty<NG::AccessibilityProperty>();
196     CHECK_NULL_VOID(accessibilityProperty);
197     std::string message  = Localization::GetInstance()->GetEntryLetters("sheet.close");
198     accessibilityProperty->SetAccessibilityText(message);
199 }
200 
CreateCloseIconNode(RefPtr<FrameNode> buttonNode)201 void SheetView::CreateCloseIconNode(RefPtr<FrameNode> buttonNode)
202 {
203     auto pipeline = buttonNode->GetContext();
204     CHECK_NULL_VOID(pipeline);
205     auto sheetTheme = pipeline->GetTheme<SheetTheme>();
206     CHECK_NULL_VOID(sheetTheme);
207     RefPtr<FrameNode> iconNode;
208 
209     // when api >= 12, use symbol format image, else use image format.
210     if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
211         iconNode = FrameNode::CreateFrameNode(
212             V2::SYMBOL_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
213         CHECK_NULL_VOID(iconNode);
214         auto symbolLayoutProperty = iconNode->GetLayoutProperty<TextLayoutProperty>();
215         CHECK_NULL_VOID(symbolLayoutProperty);
216         uint32_t symbolId = sheetTheme->GetCloseIconSource();
217         symbolLayoutProperty->UpdateSymbolSourceInfo(SymbolSourceInfo{symbolId});
218         symbolLayoutProperty->UpdateFontSize(SHEET_CLOSE_ICON_IMAGE_HEIGHT);
219         symbolLayoutProperty->UpdateSymbolColorList({sheetTheme->GetCloseIconSymbolColor()});
220     } else {
221         iconNode = FrameNode::CreateFrameNode(
222             V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
223         CHECK_NULL_VOID(iconNode);
224         auto imageLayoutProperty = iconNode->GetLayoutProperty<ImageLayoutProperty>();
225         CHECK_NULL_VOID(imageLayoutProperty);
226         imageLayoutProperty->UpdateUserDefinedIdealSize(
227             CalcSize(CalcLength(SHEET_CLOSE_ICON_IMAGE_HEIGHT), CalcLength(SHEET_CLOSE_ICON_IMAGE_HEIGHT)));
228         imageLayoutProperty->UpdateImageFit(ImageFit::FILL);
229         ImageSourceInfo imageSourceInfo;
230         imageSourceInfo.SetResourceId(InternalResource::ResourceId::IC_CANCEL_SVG);
231         imageSourceInfo.SetFillColor(sheetTheme->GetCloseIconImageColor());
232         imageLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
233     }
234     iconNode->MarkModifyDone();
235     buttonNode->AddChild(iconNode);
236 }
237 
CreateScrollNode()238 RefPtr<FrameNode> SheetView::CreateScrollNode()
239 {
240     auto scroll = FrameNode::CreateFrameNode(
241         V2::SCROLL_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ScrollPattern>());
242     CHECK_NULL_RETURN(scroll, nullptr);
243     auto props = scroll->GetLayoutProperty<ScrollLayoutProperty>();
244     CHECK_NULL_RETURN(props, nullptr);
245     props->UpdateScrollEnabled(true);
246     props->UpdateAxis(Axis::VERTICAL);
247     auto paintProps = scroll->GetPaintProperty<ScrollablePaintProperty>();
248     CHECK_NULL_RETURN(paintProps, nullptr);
249     paintProps->UpdateScrollBarMode(DisplayMode::OFF);
250     auto pattern = scroll->GetPattern<ScrollablePattern>();
251     CHECK_NULL_RETURN(pattern, nullptr);
252     pattern->SetEdgeEffect(EdgeEffect::SPRING, false);
253     pattern->SetScrollToSafeAreaHelper(false);
254     props->UpdateAlignment(Alignment::TOP_CENTER);
255     if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
256         NestedScrollOptions nestedOpt = {
257             .forward = NestedScrollMode::PARENT_FIRST,
258             .backward = NestedScrollMode::SELF_FIRST,
259         };
260         pattern->SetNestedScroll(nestedOpt);
261     }
262     scroll->MarkModifyDone();
263     return scroll;
264 }
265 
BuildMainTitle(RefPtr<FrameNode> sheetNode,NG::SheetStyle & sheetStyle)266 RefPtr<FrameNode> SheetView::BuildMainTitle(RefPtr<FrameNode> sheetNode, NG::SheetStyle& sheetStyle)
267 {
268     auto pattern = sheetNode->GetPattern<SheetPresentationPattern>();
269     CHECK_NULL_RETURN(pattern, nullptr);
270     auto titleId = pattern->GetTitleId();
271     pattern->SetTitleId(titleId);
272     auto sheetTitle = FrameNode::CreateFrameNode(V2::TEXT_ETS_TAG, titleId, AceType::MakeRefPtr<TextPattern>());
273     CHECK_NULL_RETURN(sheetTitle, nullptr);
274     auto pipeline = PipelineContext::GetCurrentContext();
275     CHECK_NULL_RETURN(pipeline, nullptr);
276     auto sheetTheme = pipeline->GetTheme<SheetTheme>();
277     CHECK_NULL_RETURN(sheetTheme, nullptr);
278     auto titleProp = sheetTitle->GetLayoutProperty<TextLayoutProperty>();
279     CHECK_NULL_RETURN(titleProp, nullptr);
280     auto titleTextFontSize = sheetTheme->GetTitleTextFontSize();
281     titleTextFontSize.SetUnit(DimensionUnit::FP);
282     titleProp->UpdateMaxLines(SHEET_TITLE_MAX_LINES);
283     titleProp->UpdateTextOverflow(TextOverflow::ELLIPSIS);
284     titleProp->UpdateAdaptMaxFontSize(titleTextFontSize);
285     titleProp->UpdateAdaptMinFontSize(titleTextFontSize);
286     if (sheetStyle.sheetTitle.has_value()) {
287         titleProp->UpdateContent(sheetStyle.sheetTitle.value());
288     }
289     titleProp->UpdateMaxFontScale(sheetTheme->GetSheetMaxAgingScale());
290     titleProp->UpdateFontSize(titleTextFontSize);
291     titleProp->UpdateFontWeight(FontWeight::BOLD);
292     titleProp->UpdateTextColor(sheetTheme->GetTitleTextFontColor());
293 
294     auto titleRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
295         AceType::MakeRefPtr<LinearLayoutPattern>(false));
296     CHECK_NULL_RETURN(titleRow, nullptr);
297     auto titleRowProps = titleRow->GetLayoutProperty<LinearLayoutProperty>();
298     CHECK_NULL_RETURN(titleRowProps, nullptr);
299     titleRowProps->UpdateMainAxisAlign(FlexAlign::FLEX_START);
300     titleRowProps->UpdateMeasureType(MeasureType::MATCH_CONTENT);
301     sheetTitle->MountToParent(titleRow);
302     sheetTitle->MarkModifyDone();
303     return titleRow;
304 }
305 
BuildSubTitle(RefPtr<FrameNode> sheetNode,NG::SheetStyle & sheetStyle)306 RefPtr<FrameNode> SheetView::BuildSubTitle(RefPtr<FrameNode> sheetNode, NG::SheetStyle& sheetStyle)
307 {
308     auto pattern = sheetNode->GetPattern<SheetPresentationPattern>();
309     CHECK_NULL_RETURN(pattern, nullptr);
310     auto subtitleId = pattern->GetSubtitleId();
311     pattern->SetSubtitleId(subtitleId);
312     auto sheetSubtitle = FrameNode::CreateFrameNode(V2::TEXT_ETS_TAG, subtitleId, AceType::MakeRefPtr<TextPattern>());
313     CHECK_NULL_RETURN(sheetSubtitle, nullptr);
314     auto pipeline = PipelineContext::GetCurrentContext();
315     CHECK_NULL_RETURN(pipeline, nullptr);
316     auto sheetTheme = pipeline->GetTheme<SheetTheme>();
317     CHECK_NULL_RETURN(sheetTheme, nullptr);
318     auto titleProp = AceType::DynamicCast<TextLayoutProperty>(sheetSubtitle->GetLayoutProperty());
319     CHECK_NULL_RETURN(titleProp, nullptr);
320     auto titleTextFontSize = sheetTheme->GetSubtitleTextFontSize();
321     titleTextFontSize.SetUnit(DimensionUnit::VP);
322     titleProp->UpdateMaxLines(SHEET_TITLE_MAX_LINES);
323     titleProp->UpdateTextOverflow(TextOverflow::ELLIPSIS);
324     titleProp->UpdateAdaptMaxFontSize(titleTextFontSize);
325     titleProp->UpdateAdaptMinFontSize(titleTextFontSize);
326     if (sheetStyle.sheetSubtitle.has_value()) {
327         titleProp->UpdateContent(sheetStyle.sheetSubtitle.value());
328     }
329     titleProp->UpdateFontSize(titleTextFontSize);
330     titleProp->UpdateTextColor(sheetTheme->GetSubtitleTextFontColor());
331     PaddingProperty titlePadding;
332     titlePadding.top = CalcLength(sheetTheme->GetSubtitleTextMargin());
333     titleProp->UpdatePadding(titlePadding);
334 
335     auto subtitleRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
336         AceType::MakeRefPtr<LinearLayoutPattern>(false));
337     CHECK_NULL_RETURN(subtitleRow, nullptr);
338     auto subtitleRowProps = subtitleRow->GetLayoutProperty<LinearLayoutProperty>();
339     CHECK_NULL_RETURN(subtitleRowProps, nullptr);
340     subtitleRowProps->UpdateMainAxisAlign(FlexAlign::FLEX_START);
341     subtitleRowProps->UpdateMeasureType(MeasureType::MATCH_CONTENT);
342     sheetSubtitle->MountToParent(subtitleRow);
343     sheetSubtitle->MarkModifyDone();
344     return subtitleRow;
345 }
346 
SetTitleColumnMinSize(RefPtr<LayoutProperty> layoutProperty,const NG::SheetStyle & sheetStyle)347 void SheetView::SetTitleColumnMinSize(RefPtr<LayoutProperty> layoutProperty, const NG::SheetStyle& sheetStyle)
348 {
349     if (sheetStyle.sheetTitle.has_value()) {
350         layoutProperty->UpdateCalcMinSize(CalcSize(std::nullopt, CalcLength(SHEET_OPERATION_AREA_HEIGHT)));
351         if (sheetStyle.sheetSubtitle.has_value()) {
352             layoutProperty->UpdateCalcMinSize(CalcSize(
353                 std::nullopt, CalcLength(SHEET_OPERATION_AREA_HEIGHT_DOUBLE - SHEET_DOUBLE_TITLE_BOTTON_MARGIN)));
354         }
355     }
356 }
357 
BuildTitleColumn(RefPtr<FrameNode> sheetNode,NG::SheetStyle & sheetStyle)358 RefPtr<FrameNode> SheetView::BuildTitleColumn(RefPtr<FrameNode> sheetNode, NG::SheetStyle& sheetStyle)
359 {
360     auto titleColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
361         AceType::MakeRefPtr<LinearLayoutPattern>(true));
362     CHECK_NULL_RETURN(titleColumn, nullptr);
363     auto layoutProperty = titleColumn->GetLayoutProperty();
364     CHECK_NULL_RETURN(layoutProperty, nullptr);
365     SetTitleColumnMinSize(layoutProperty, sheetStyle);
366     auto pipeline = PipelineContext::GetCurrentContext();
367     CHECK_NULL_RETURN(pipeline, nullptr);
368     auto sheetTheme = pipeline->GetTheme<SheetTheme>();
369     CHECK_NULL_RETURN(sheetTheme, nullptr);
370     layoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_CROSS_AXIS);
371     bool isTitleCustombuilder = sheetStyle.isTitleBuilder.has_value() && sheetStyle.isTitleBuilder.value();
372     if (pipeline->GetFontScale() == sheetTheme->GetSheetNormalScale() || isTitleCustombuilder) {
373         layoutProperty->UpdateUserDefinedIdealSize(CalcSize(std::nullopt, CalcLength(SHEET_OPERATION_AREA_HEIGHT)));
374     }
375     MarginProperty margin;
376     margin.top = CalcLength(SHEET_TITLE_AERA_MARGIN);
377     margin.bottom = CalcLength(SHEET_DOUBLE_TITLE_BOTTON_MARGIN);
378     layoutProperty->UpdateMargin(margin);
379     auto columnProps = titleColumn->GetLayoutProperty<LinearLayoutProperty>();
380     CHECK_NULL_RETURN(columnProps, nullptr);
381     columnProps->UpdateCrossAxisAlign(FlexAlign::FLEX_START);
382     if (sheetStyle.sheetTitle.has_value()) {
383         auto titleRow = BuildMainTitle(sheetNode, sheetStyle);
384         CHECK_NULL_RETURN(titleRow, nullptr);
385         titleRow->MountToParent(titleColumn);
386         MarginProperty titleMargin;
387         titleMargin.top = CalcLength(SHEET_DOUBLE_TITLE_TOP_PADDING);
388         auto titleProp = titleRow->GetLayoutProperty();
389         CHECK_NULL_RETURN(titleProp, nullptr);
390         titleProp->UpdateMargin(titleMargin);
391         if (sheetStyle.sheetSubtitle.has_value()) {
392             auto subtitleRow = BuildSubTitle(sheetNode, sheetStyle);
393             CHECK_NULL_RETURN(subtitleRow, nullptr);
394             subtitleRow->MountToParent(titleColumn);
395             if (pipeline->GetFontScale() == sheetTheme->GetSheetNormalScale()) {
396                 layoutProperty->UpdateUserDefinedIdealSize(
397                     CalcSize(std::nullopt,
398                         CalcLength(SHEET_OPERATION_AREA_HEIGHT_DOUBLE - SHEET_DOUBLE_TITLE_BOTTON_MARGIN)));
399             }
400         }
401     } else if (sheetStyle.isTitleBuilder.has_value()) {
402         auto isCustomBuilder = sheetStyle.isTitleBuilder.value();
403 
404         // When title is custombuilder, set FlexAlign to CENTER.
405         if (isCustomBuilder) {
406             columnProps->UpdateMainAxisAlign(FlexAlign::CENTER);
407         }
408     }
409     return titleColumn;
410 }
411 } // namespace OHOS::Ace::NG
412