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