1 /*
2  * Copyright (c) 2022-2024 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/grid/grid_model_ng.h"
17 
18 #include <regex>
19 
20 #include "base/utils/utils.h"
21 #include "core/components_ng/base/frame_node.h"
22 #include "core/components_ng/base/view_abstract.h"
23 #include "core/components_ng/base/view_stack_processor.h"
24 #include "core/components_ng/pattern/grid/grid_event_hub.h"
25 #include "core/components_ng/pattern/grid/grid_pattern.h"
26 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
27 #include "core/components_ng/pattern/scrollable/scrollable_model_ng.h"
28 #include "core/components_v2/inspector/inspector_constants.h"
29 #include "core/pipeline_ng/pipeline_context.h"
30 
31 namespace OHOS::Ace::NG {
32 
Create(const RefPtr<ScrollControllerBase> & positionController,const RefPtr<ScrollProxy> & scrollProxy)33 void GridModelNG::Create(const RefPtr<ScrollControllerBase>& positionController, const RefPtr<ScrollProxy>& scrollProxy)
34 {
35     auto* stack = ViewStackProcessor::GetInstance();
36     auto nodeId = stack->ClaimNodeId();
37     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::GRID_ETS_TAG, nodeId);
38     auto frameNode =
39         FrameNode::GetOrCreateFrameNode(V2::GRID_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<GridPattern>(); });
40     stack->Push(frameNode);
41     auto pattern = frameNode->GetPattern<GridPattern>();
42     CHECK_NULL_VOID(pattern);
43     if (positionController) {
44         auto controller = AceType::DynamicCast<ScrollableController>(positionController);
45         pattern->SetPositionController(controller);
46     }
47     if (scrollProxy) {
48         auto scrollBarProxy = AceType::DynamicCast<NG::ScrollBarProxy>(scrollProxy);
49         pattern->SetScrollBarProxy(scrollBarProxy);
50     }
51     pattern->AddScrollableFrameInfo(SCROLL_FROM_NONE);
52 }
53 
GetOrCreateController(FrameNode * frameNode)54 RefPtr<ScrollControllerBase> GridModelNG::GetOrCreateController(FrameNode* frameNode)
55 {
56     CHECK_NULL_RETURN(frameNode, nullptr);
57     auto pattern = frameNode->GetPattern<GridPattern>();
58     CHECK_NULL_RETURN(pattern, nullptr);
59     return pattern->GetOrCreatePositionController();
60 }
61 
Pop()62 void GridModelNG::Pop()
63 {
64     NG::ViewStackProcessor::GetInstance()->PopContainer();
65 }
66 
SetLayoutOptions(GridLayoutOptions options)67 void GridModelNG::SetLayoutOptions(GridLayoutOptions options)
68 {
69     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, LayoutOptions, options);
70 }
71 
SetColumnsTemplate(const std::string & value)72 void GridModelNG::SetColumnsTemplate(const std::string& value)
73 {
74     if (value.empty()) {
75         TAG_LOGW(AceLogTag::ACE_GRID, "Columns Template [%{public}s] is not valid.", value.c_str());
76         ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsTemplate, "1fr");
77         return;
78     }
79     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsTemplate, value);
80 }
81 
SetRowsTemplate(const std::string & value)82 void GridModelNG::SetRowsTemplate(const std::string& value)
83 {
84     if (value.empty()) {
85         TAG_LOGW(AceLogTag::ACE_GRID, "Rows Template [%{public}s] is not valid.", value.c_str());
86         ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, RowsTemplate, "1fr");
87         return;
88     }
89     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, RowsTemplate, value);
90 }
91 
SetColumnsGap(const Dimension & value)92 void GridModelNG::SetColumnsGap(const Dimension& value)
93 {
94     if (value.IsNonNegative()) {
95         ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsGap, value);
96     }
97 }
98 
SetRowsGap(const Dimension & value)99 void GridModelNG::SetRowsGap(const Dimension& value)
100 {
101     if (value.IsNonNegative()) {
102         ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, RowsGap, value);
103     }
104 }
105 
SetGridHeight(const Dimension & value)106 void GridModelNG::SetGridHeight(const Dimension& value)
107 {
108     ViewAbstract::SetHeight(NG::CalcLength(value));
109 }
110 
SetScrollBarMode(DisplayMode value)111 void GridModelNG::SetScrollBarMode(DisplayMode value)
112 {
113     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarMode, value);
114 }
115 
SetScrollBarColor(const std::string & value)116 void GridModelNG::SetScrollBarColor(const std::string& value)
117 {
118     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, Color::FromString(value));
119 }
120 
SetScrollBarWidth(const std::string & value)121 void GridModelNG::SetScrollBarWidth(const std::string& value)
122 {
123     ACE_UPDATE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, StringUtils::StringToDimensionWithUnit(value));
124 }
125 
SetCachedCount(int32_t value,bool show)126 void GridModelNG::SetCachedCount(int32_t value, bool show)
127 {
128     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, CachedCount, value);
129     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ShowCachedItems, show);
130 }
131 
SetEditable(bool value)132 void GridModelNG::SetEditable(bool value)
133 {
134     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, Editable, value);
135 }
136 
SetIsRTL(TextDirection direction)137 void GridModelNG::SetIsRTL(TextDirection direction)
138 {
139     ACE_UPDATE_LAYOUT_PROPERTY(LayoutProperty, LayoutDirection, direction);
140 }
141 
SetLayoutDirection(FlexDirection value)142 void GridModelNG::SetLayoutDirection(FlexDirection value)
143 {
144     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, GridDirection, value);
145 }
146 
SetMaxCount(int32_t value)147 void GridModelNG::SetMaxCount(int32_t value)
148 {
149     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, MaxCount, value);
150 }
151 
SetMinCount(int32_t value)152 void GridModelNG::SetMinCount(int32_t value)
153 {
154     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, MinCount, value);
155 }
156 
SetCellLength(int32_t value)157 void GridModelNG::SetCellLength(int32_t value)
158 {
159     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, CellLength, value);
160 }
161 
SetMultiSelectable(bool value)162 void GridModelNG::SetMultiSelectable(bool value)
163 {
164     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
165     CHECK_NULL_VOID(frameNode);
166     auto pattern = frameNode->GetPattern<GridPattern>();
167     CHECK_NULL_VOID(pattern);
168     pattern->SetMultiSelectable(value);
169 }
170 
SetSupportAnimation(bool value)171 void GridModelNG::SetSupportAnimation(bool value)
172 {
173     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
174     CHECK_NULL_VOID(frameNode);
175     auto pattern = frameNode->GetPattern<GridPattern>();
176     CHECK_NULL_VOID(pattern);
177     pattern->SetSupportAnimation(value);
178 }
179 
SetSupportDragAnimation(bool value)180 void GridModelNG::SetSupportDragAnimation(bool value) {}
181 
SetEdgeEffect(EdgeEffect edgeEffect,bool alwaysEnabled)182 void GridModelNG::SetEdgeEffect(EdgeEffect edgeEffect, bool alwaysEnabled)
183 {
184     ScrollableModelNG::SetEdgeEffect(edgeEffect, alwaysEnabled);
185 }
186 
SetNestedScroll(const NestedScrollOptions & nestedOpt)187 void GridModelNG::SetNestedScroll(const NestedScrollOptions& nestedOpt)
188 {
189     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
190     CHECK_NULL_VOID(frameNode);
191     auto pattern = frameNode->GetPattern<GridPattern>();
192     CHECK_NULL_VOID(pattern);
193     pattern->SetNestedScroll(nestedOpt);
194 }
195 
SetScrollEnabled(bool scrollEnabled)196 void GridModelNG::SetScrollEnabled(bool scrollEnabled)
197 {
198     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, ScrollEnabled, scrollEnabled);
199 }
200 
SetFriction(double friction)201 void GridModelNG::SetFriction(double friction)
202 {
203     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
204     CHECK_NULL_VOID(frameNode);
205     auto pattern = frameNode->GetPattern<GridPattern>();
206     CHECK_NULL_VOID(pattern);
207     pattern->SetFriction(friction);
208 }
209 
SetAlignItems(GridItemAlignment itemAlign)210 void GridModelNG::SetAlignItems(GridItemAlignment itemAlign)
211 {
212     ACE_UPDATE_LAYOUT_PROPERTY(GridLayoutProperty, AlignItems, itemAlign);
213 }
214 
SetOnScrollToIndex(ScrollToIndexFunc && value)215 void GridModelNG::SetOnScrollToIndex(ScrollToIndexFunc&& value)
216 {
217     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
218     CHECK_NULL_VOID(frameNode);
219     auto eventHub = frameNode->GetEventHub<GridEventHub>();
220     CHECK_NULL_VOID(eventHub);
221     eventHub->SetOnScrollToIndex(std::move(value));
222 }
223 
SetOnScrollBarUpdate(ScrollBarUpdateFunc && value)224 void GridModelNG::SetOnScrollBarUpdate(ScrollBarUpdateFunc&& value)
225 {
226     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
227     CHECK_NULL_VOID(frameNode);
228     auto eventHub = frameNode->GetEventHub<GridEventHub>();
229     CHECK_NULL_VOID(eventHub);
230     eventHub->SetOnScrollBarUpdate(std::move(value));
231 }
232 
SetOnItemDragStart(std::function<void (const ItemDragInfo &,int32_t)> && value)233 void GridModelNG::SetOnItemDragStart(std::function<void(const ItemDragInfo&, int32_t)>&& value)
234 {
235     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
236     CHECK_NULL_VOID(frameNode);
237     auto eventHub = frameNode->GetEventHub<GridEventHub>();
238     CHECK_NULL_VOID(eventHub);
239     auto onDragStart = [func = std::move(value)](const ItemDragInfo& dragInfo, int32_t index) -> RefPtr<UINode> {
240         ScopedViewStackProcessor builderViewStackProcessor;
241         {
242             func(dragInfo, index);
243         }
244         return ViewStackProcessor::GetInstance()->Finish();
245     };
246     eventHub->SetOnItemDragStart(std::move(onDragStart));
247 
248     auto gestureEventHub = eventHub->GetOrCreateGestureEventHub();
249     CHECK_NULL_VOID(gestureEventHub);
250     eventHub->InitItemDragEvent(gestureEventHub);
251 
252     AddDragFrameNodeToManager();
253 }
254 
SetOnItemDragEnter(ItemDragEnterFunc && value)255 void GridModelNG::SetOnItemDragEnter(ItemDragEnterFunc&& value)
256 {
257     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
258     CHECK_NULL_VOID(frameNode);
259     auto eventHub = frameNode->GetEventHub<GridEventHub>();
260     CHECK_NULL_VOID(eventHub);
261     eventHub->SetOnItemDragEnter(std::move(value));
262 
263     AddDragFrameNodeToManager();
264 }
265 
SetOnItemDragMove(ItemDragMoveFunc && value)266 void GridModelNG::SetOnItemDragMove(ItemDragMoveFunc&& value)
267 {
268     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
269     CHECK_NULL_VOID(frameNode);
270     auto eventHub = frameNode->GetEventHub<GridEventHub>();
271     CHECK_NULL_VOID(eventHub);
272     eventHub->SetOnItemDragMove(std::move(value));
273 
274     AddDragFrameNodeToManager();
275 }
276 
SetOnItemDragLeave(ItemDragLeaveFunc && value)277 void GridModelNG::SetOnItemDragLeave(ItemDragLeaveFunc&& value)
278 {
279     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
280     CHECK_NULL_VOID(frameNode);
281     auto eventHub = frameNode->GetEventHub<GridEventHub>();
282     CHECK_NULL_VOID(eventHub);
283     eventHub->SetOnItemDragLeave(std::move(value));
284 
285     AddDragFrameNodeToManager();
286 }
287 
SetOnItemDrop(ItemDropFunc && value)288 void GridModelNG::SetOnItemDrop(ItemDropFunc&& value)
289 {
290     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
291     CHECK_NULL_VOID(frameNode);
292     auto eventHub = frameNode->GetEventHub<GridEventHub>();
293     CHECK_NULL_VOID(eventHub);
294     eventHub->SetOnItemDrop(std::move(value));
295 
296     AddDragFrameNodeToManager();
297 }
298 
AddDragFrameNodeToManager() const299 void GridModelNG::AddDragFrameNodeToManager() const
300 {
301     auto pipeline = PipelineContext::GetCurrentContext();
302     CHECK_NULL_VOID(pipeline);
303     auto dragDropManager = pipeline->GetDragDropManager();
304     CHECK_NULL_VOID(dragDropManager);
305     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
306     CHECK_NULL_VOID(frameNode);
307 
308     dragDropManager->AddGridDragFrameNode(frameNode->GetId(), AceType::WeakClaim(frameNode));
309 }
310 
SetOnScroll(OnScrollEvent && onScroll)311 void GridModelNG::SetOnScroll(OnScrollEvent&& onScroll)
312 {
313     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
314     CHECK_NULL_VOID(frameNode);
315     auto eventHub = frameNode->GetEventHub<GridEventHub>();
316     CHECK_NULL_VOID(eventHub);
317     eventHub->SetOnScroll(std::move(onScroll));
318 }
319 
SetOnScrollFrameBegin(OnScrollFrameBeginEvent && onScrollFrameBegin)320 void GridModelNG::SetOnScrollFrameBegin(OnScrollFrameBeginEvent&& onScrollFrameBegin)
321 {
322     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
323     CHECK_NULL_VOID(frameNode);
324     auto eventHub = frameNode->GetEventHub<GridEventHub>();
325     CHECK_NULL_VOID(eventHub);
326     eventHub->SetOnScrollFrameBegin(std::move(onScrollFrameBegin));
327 }
328 
SetOnScrollStart(OnScrollStartEvent && onScrollStart)329 void GridModelNG::SetOnScrollStart(OnScrollStartEvent&& onScrollStart)
330 {
331     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
332     CHECK_NULL_VOID(frameNode);
333     auto eventHub = frameNode->GetEventHub<GridEventHub>();
334     CHECK_NULL_VOID(eventHub);
335     eventHub->SetOnScrollStart(std::move(onScrollStart));
336 }
337 
SetOnScrollStop(OnScrollStopEvent && onScrollStop)338 void GridModelNG::SetOnScrollStop(OnScrollStopEvent&& onScrollStop)
339 {
340     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
341     CHECK_NULL_VOID(frameNode);
342     auto eventHub = frameNode->GetEventHub<GridEventHub>();
343     CHECK_NULL_VOID(eventHub);
344     eventHub->SetOnScrollStop(std::move(onScrollStop));
345 }
346 
SetOnScrollIndex(ScrollIndexFunc && onScrollIndex)347 void GridModelNG::SetOnScrollIndex(ScrollIndexFunc&& onScrollIndex)
348 {
349     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
350     CHECK_NULL_VOID(frameNode);
351     auto eventHub = frameNode->GetEventHub<GridEventHub>();
352     CHECK_NULL_VOID(eventHub);
353     eventHub->SetOnScrollIndex(std::move(onScrollIndex));
354 }
355 
SetOnReachStart(OnReachEvent && onReachStart)356 void GridModelNG::SetOnReachStart(OnReachEvent&& onReachStart)
357 {
358     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
359     CHECK_NULL_VOID(frameNode);
360     auto eventHub = frameNode->GetEventHub<GridEventHub>();
361     CHECK_NULL_VOID(eventHub);
362     eventHub->SetOnReachStart(std::move(onReachStart));
363 }
364 
SetOnReachEnd(OnReachEvent && onReachEnd)365 void GridModelNG::SetOnReachEnd(OnReachEvent&& onReachEnd)
366 {
367     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
368     CHECK_NULL_VOID(frameNode);
369     auto eventHub = frameNode->GetEventHub<GridEventHub>();
370     CHECK_NULL_VOID(eventHub);
371     eventHub->SetOnReachEnd(std::move(onReachEnd));
372 }
373 
CreateFrameNode(int32_t nodeId)374 RefPtr<FrameNode> GridModelNG::CreateFrameNode(int32_t nodeId)
375 {
376     auto frameNode = FrameNode::GetOrCreateFrameNode(
377         V2::GRID_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<GridPattern>(); });
378 
379     return frameNode;
380 }
381 
SetOnScrollIndex(FrameNode * frameNode,ScrollIndexFunc && onScrollIndex)382 void GridModelNG::SetOnScrollIndex(FrameNode* frameNode, ScrollIndexFunc&& onScrollIndex)
383 {
384     CHECK_NULL_VOID(frameNode);
385     auto eventHub = frameNode->GetEventHub<GridEventHub>();
386     CHECK_NULL_VOID(eventHub);
387     eventHub->SetOnScrollIndex(std::move(onScrollIndex));
388 }
389 
SetColumnsTemplate(FrameNode * frameNode,const std::string & columnsTemplate)390 void GridModelNG::SetColumnsTemplate(FrameNode* frameNode, const std::string& columnsTemplate)
391 {
392     if (columnsTemplate.empty()) {
393         TAG_LOGW(AceLogTag::ACE_GRID, "Columns Template [%{public}s] is not valid.", columnsTemplate.c_str());
394         ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsTemplate, "1fr", frameNode);
395         return;
396     }
397     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsTemplate, columnsTemplate, frameNode);
398 }
399 
SetRowsTemplate(FrameNode * frameNode,const std::string & rowsTemplate)400 void GridModelNG::SetRowsTemplate(FrameNode* frameNode, const std::string& rowsTemplate)
401 {
402     if (rowsTemplate.empty()) {
403         TAG_LOGW(AceLogTag::ACE_GRID, "Rows Template [%{public}s] is not valid.", rowsTemplate.c_str());
404         ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, RowsTemplate, "1fr", frameNode);
405         return;
406     }
407     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, RowsTemplate, rowsTemplate, frameNode);
408 }
409 
SetColumnsGap(FrameNode * frameNode,const Dimension & columnsGap)410 void GridModelNG::SetColumnsGap(FrameNode* frameNode, const Dimension& columnsGap)
411 {
412     if (columnsGap.IsNonNegative()) {
413         ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ColumnsGap, columnsGap, frameNode);
414     }
415 }
416 
SetRowsGap(FrameNode * frameNode,const Dimension & rowsGap)417 void GridModelNG::SetRowsGap(FrameNode* frameNode, const Dimension& rowsGap)
418 {
419     if (rowsGap.IsNonNegative()) {
420         ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, RowsGap, rowsGap, frameNode);
421     }
422 }
423 
SetScrollBarMode(FrameNode * frameNode,DisplayMode scrollBarMode)424 void GridModelNG::SetScrollBarMode(FrameNode* frameNode, DisplayMode scrollBarMode)
425 {
426     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarMode, scrollBarMode, frameNode);
427 }
428 
SetScrollBarWidth(FrameNode * frameNode,const Dimension & scrollBarWidth)429 void GridModelNG::SetScrollBarWidth(FrameNode* frameNode, const Dimension& scrollBarWidth)
430 {
431     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarWidth, scrollBarWidth, frameNode);
432 }
433 
SetScrollBarColor(FrameNode * frameNode,const Color & scrollBarColor)434 void GridModelNG::SetScrollBarColor(FrameNode* frameNode, const Color& scrollBarColor)
435 {
436     ACE_UPDATE_NODE_PAINT_PROPERTY(ScrollablePaintProperty, ScrollBarColor, scrollBarColor, frameNode);
437 }
438 
SetCachedCount(FrameNode * frameNode,int32_t cachedCount)439 void GridModelNG::SetCachedCount(FrameNode* frameNode, int32_t cachedCount)
440 {
441     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, CachedCount, cachedCount, frameNode);
442 }
443 
SetShowCached(FrameNode * frameNode,bool show)444 void GridModelNG::SetShowCached(FrameNode* frameNode, bool show)
445 {
446     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ShowCachedItems, show, frameNode);
447 }
448 
SetEditable(FrameNode * frameNode,bool editMode)449 void GridModelNG::SetEditable(FrameNode* frameNode, bool editMode)
450 {
451     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, Editable, editMode, frameNode);
452 }
453 
SetMultiSelectable(FrameNode * frameNode,bool multiSelectable)454 void GridModelNG::SetMultiSelectable(FrameNode* frameNode, bool multiSelectable)
455 {
456     auto pattern = frameNode->GetPattern<GridPattern>();
457     CHECK_NULL_VOID(pattern);
458     pattern->SetMultiSelectable(multiSelectable);
459 }
460 
SetMaxCount(FrameNode * frameNode,int32_t maxCount)461 void GridModelNG::SetMaxCount(FrameNode* frameNode, int32_t maxCount)
462 {
463     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, MaxCount, maxCount, frameNode);
464 }
465 
SetMinCount(FrameNode * frameNode,int32_t minCount)466 void GridModelNG::SetMinCount(FrameNode* frameNode, int32_t minCount)
467 {
468     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, MinCount, minCount, frameNode);
469 }
470 
SetCellLength(FrameNode * frameNode,int32_t cellLength)471 void GridModelNG::SetCellLength(FrameNode* frameNode, int32_t cellLength)
472 {
473     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, CellLength, cellLength, frameNode);
474 }
475 
SetLayoutDirection(FrameNode * frameNode,FlexDirection layoutDirection)476 void GridModelNG::SetLayoutDirection(FrameNode* frameNode, FlexDirection layoutDirection)
477 {
478     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, GridDirection, layoutDirection, frameNode);
479 }
480 
SetSupportAnimation(FrameNode * frameNode,bool supportAnimation)481 void GridModelNG::SetSupportAnimation(FrameNode* frameNode, bool supportAnimation)
482 {
483     auto pattern = frameNode->GetPattern<GridPattern>();
484     CHECK_NULL_VOID(pattern);
485     pattern->SetSupportAnimation(supportAnimation);
486 }
487 
SetEdgeEffect(FrameNode * frameNode,EdgeEffect edgeEffect,bool alwaysEnabled)488 void GridModelNG::SetEdgeEffect(FrameNode* frameNode, EdgeEffect edgeEffect, bool alwaysEnabled)
489 {
490     ScrollableModelNG::SetEdgeEffect(frameNode, edgeEffect, alwaysEnabled);
491 }
492 
SetNestedScroll(FrameNode * frameNode,const NestedScrollOptions & nestedOpt)493 void GridModelNG::SetNestedScroll(FrameNode* frameNode, const NestedScrollOptions& nestedOpt)
494 {
495     auto pattern = frameNode->GetPattern<GridPattern>();
496     CHECK_NULL_VOID(pattern);
497     pattern->SetNestedScroll(nestedOpt);
498 }
499 
SetScrollEnabled(FrameNode * frameNode,bool scrollEnabled)500 void GridModelNG::SetScrollEnabled(FrameNode* frameNode, bool scrollEnabled)
501 {
502     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, ScrollEnabled, scrollEnabled, frameNode);
503 }
504 
SetFriction(FrameNode * frameNode,double friction)505 void GridModelNG::SetFriction(FrameNode* frameNode, double friction)
506 {
507     auto pattern = frameNode->GetPattern<GridPattern>();
508     CHECK_NULL_VOID(pattern);
509     if (LessOrEqual(friction, 0.0)) {
510         pattern->SetFriction(FRICTION);
511     }
512     pattern->SetFriction(friction);
513 }
514 
SetAlignItems(FrameNode * frameNode,GridItemAlignment itemAlign)515 void GridModelNG::SetAlignItems(FrameNode* frameNode, GridItemAlignment itemAlign)
516 {
517     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, AlignItems, itemAlign, frameNode);
518 }
519 
CreatePositionController()520 RefPtr<ScrollControllerBase> GridModelNG::CreatePositionController()
521 {
522     return AceType::MakeRefPtr<ScrollableController>();
523 }
524 
CreateScrollBarProxy()525 RefPtr<ScrollProxy> GridModelNG::CreateScrollBarProxy()
526 {
527     return AceType::MakeRefPtr<NG::ScrollBarProxy>();
528 }
529 
GetDisplayMode() const530 DisplayMode GridModelNG::GetDisplayMode() const
531 {
532     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<GridPattern>();
533     CHECK_NULL_RETURN(pattern, DisplayMode::AUTO);
534     return pattern->GetDefaultScrollBarDisplayMode();
535 }
536 
GetColumnsTemplate(FrameNode * frameNode)537 std::string GridModelNG::GetColumnsTemplate(FrameNode* frameNode)
538 {
539     CHECK_NULL_RETURN(frameNode, nullptr);
540     std::string value = "1fr";
541     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, ColumnsTemplate, value, frameNode, value);
542     return value;
543 }
544 
GetRowsTemplate(FrameNode * frameNode)545 std::string GridModelNG::GetRowsTemplate(FrameNode* frameNode)
546 {
547     std::string value = "1fr";
548     CHECK_NULL_RETURN(frameNode, nullptr);
549     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, RowsTemplate, value, frameNode, value);
550     return value;
551 }
552 
GetColumnsGap(FrameNode * frameNode)553 float GridModelNG::GetColumnsGap(FrameNode* frameNode)
554 {
555     Dimension value;
556     CHECK_NULL_RETURN(frameNode, value.Value());
557     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, ColumnsGap, value, frameNode, value);
558     return value.Value();
559 }
560 
GetRowsGap(FrameNode * frameNode)561 float GridModelNG::GetRowsGap(FrameNode* frameNode)
562 {
563     Dimension value;
564     CHECK_NULL_RETURN(frameNode, value.Value());
565     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, RowsGap, value, frameNode, value);
566     return value.Value();
567 }
568 
GetCachedCount(FrameNode * frameNode)569 int32_t GridModelNG::GetCachedCount(FrameNode* frameNode)
570 {
571     int32_t cachedCount = 1;
572     CHECK_NULL_RETURN(frameNode, cachedCount);
573     auto pattern = frameNode->GetPattern<GridPattern>();
574     int32_t defCachedCount = pattern != nullptr ? pattern->GetDefaultCachedCount() : 1;
575     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, CachedCount, cachedCount, frameNode,
576         defCachedCount);
577     return cachedCount;
578 }
579 
GetShowCached(FrameNode * frameNode)580 bool GridModelNG::GetShowCached(FrameNode* frameNode)
581 {
582     bool show = false;
583     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(GridLayoutProperty, ShowCachedItems, show, frameNode, false);
584     return show;
585 }
586 
InitScroller(FrameNode * frameNode,const RefPtr<ScrollControllerBase> & positionController,const RefPtr<ScrollProxy> & scrollProxy)587 void GridModelNG::InitScroller(FrameNode* frameNode, const RefPtr<ScrollControllerBase>& positionController,
588     const RefPtr<ScrollProxy>& scrollProxy)
589 {
590     CHECK_NULL_VOID(frameNode);
591     auto pattern = frameNode->GetPattern<GridPattern>();
592     CHECK_NULL_VOID(pattern);
593     if (positionController) {
594         auto controller = AceType::DynamicCast<ScrollableController>(positionController);
595         pattern->SetPositionController(controller);
596     } else {
597         pattern->SetPositionController(nullptr);
598     }
599     if (scrollProxy) {
600         auto scrollBarProxy = AceType::DynamicCast<NG::ScrollBarProxy>(scrollProxy);
601         pattern->SetScrollBarProxy(scrollBarProxy);
602     } else {
603         pattern->SetScrollBarProxy(nullptr);
604     }
605     pattern->AddScrollableFrameInfo(SCROLL_FROM_NONE);
606 }
607 
SetLayoutOptions(FrameNode * frameNode,GridLayoutOptions & options)608 void GridModelNG::SetLayoutOptions(FrameNode* frameNode, GridLayoutOptions& options)
609 {
610     CHECK_NULL_VOID(frameNode);
611     ACE_UPDATE_NODE_LAYOUT_PROPERTY(GridLayoutProperty, LayoutOptions, options, frameNode);
612 }
613 } // namespace OHOS::Ace::NG
614