• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "interfaces/inner_api/ace_kit/src/view/frame_node_impl.h"
17 
18 #include "ui/base/ace_type.h"
19 #include "ui/base/referenced.h"
20 #include "ui/base/utils/utils.h"
21 #include "ui/view/frame_node.h"
22 #include "ui/view/pattern.h"
23 #include "ui/view/ui_context.h"
24 
25 #include "core/components_ng/property/calc_length.h"
26 #include "core/components_ng/property/layout_constraint.h"
27 #include "core/components_ng/property/property.h"
28 #include "core/pipeline_ng/pipeline_context.h"
29 
30 namespace OHOS::Ace::Kit {
31 
FrameNodeImpl(const RefPtr<AceNode> & node,const RefPtr<Pattern> & pattern)32 FrameNodeImpl::FrameNodeImpl(const RefPtr<AceNode>& node, const RefPtr<Pattern>& pattern)
33     : nodeRef_(node), pattern_(pattern)
34 {
35     frameNode_ = AceType::RawPtr(node);
36 }
37 
FrameNodeImpl(const RefPtr<AceNode> & node)38 FrameNodeImpl::FrameNodeImpl(const RefPtr<AceNode>& node) : nodeRef_(node)
39 {
40     frameNode_ = AceType::RawPtr(node);
41 }
42 
~FrameNodeImpl()43 FrameNodeImpl::~FrameNodeImpl()
44 {
45     Reset();
46 }
47 
Reset()48 void FrameNodeImpl::Reset()
49 {
50     frameNode_ = nullptr;
51     nodeRef_.Reset();
52     pattern_.Reset();
53 }
54 
InitializePatternAndContext()55 void FrameNodeImpl::InitializePatternAndContext()
56 {
57     CHECK_NULL_VOID(frameNode_);
58     frameNode_->InitializePatternAndContext();
59     CHECK_NULL_VOID(pattern_);
60     property_ = pattern_->CreateProperty();
61     CHECK_NULL_VOID(property_);
62     property_->SetHost(WeakClaim(this));
63 }
64 
PushAceNode(const RefPtr<AceNode> & node)65 void FrameNodeImpl::PushAceNode(const RefPtr<AceNode>& node)
66 {
67     nodeRef_ = node;
68 }
69 
PopAceNode()70 RefPtr<AceNode> FrameNodeImpl::PopAceNode()
71 {
72     RefPtr<AceNode> node;
73     node.Swap(nodeRef_);
74     return node;
75 }
76 
GetAceNode() const77 RefPtr<AceNode> FrameNodeImpl::GetAceNode() const
78 {
79     return nodeRef_;
80 }
81 
GetAceNodePtr()82 AceNode* FrameNodeImpl::GetAceNodePtr()
83 {
84     return frameNode_;
85 }
86 
Measure(const Kit::LayoutConstraintInfo & parentContraint)87 void FrameNodeImpl::Measure(const Kit::LayoutConstraintInfo& parentContraint)
88 {
89     CHECK_NULL_VOID(frameNode_);
90     std::optional<NG::LayoutConstraintF> constraint = std::make_optional<NG::LayoutConstraintF>();
91     //minWidth
92     constraint->minSize.SetWidth(parentContraint.minWidth);
93     //minHeight
94     constraint->minSize.SetHeight(parentContraint.minHeight);
95     //maxWidth
96     constraint->maxSize.SetWidth(parentContraint.maxWidth);
97     //maxHeight
98     constraint->maxSize.SetHeight(parentContraint.maxHeight);
99     //minWidth == maxWidth
100     if (parentContraint.minWidth == parentContraint.maxWidth) {
101         constraint->selfIdealSize.SetWidth(parentContraint.minWidth);
102     }
103     //minHeight == maxHeight
104     if (parentContraint.minHeight == parentContraint.maxHeight) {
105         constraint->selfIdealSize.SetHeight(parentContraint.minHeight);
106     }
107     //percentReferenceWidth
108     constraint->percentReference.SetWidth(parentContraint.percentReferWidth);
109     //percentReferenceHeight
110     constraint->percentReference.SetHeight(parentContraint.percentReferHeight);
111     frameNode_->SetActive(true);
112     frameNode_->Measure(constraint);
113 }
114 
Layout()115 void FrameNodeImpl::Layout()
116 {
117     CHECK_NULL_VOID(frameNode_);
118     frameNode_->Layout();
119 }
120 
GetLayoutProperty()121 RefPtr<Ace::NG::LayoutProperty> FrameNodeImpl::GetLayoutProperty()
122 {
123     CHECK_NULL_RETURN(frameNode_, nullptr);
124     return frameNode_->GetLayoutProperty();
125 }
126 
GetPattern()127 RefPtr<Pattern> FrameNodeImpl::GetPattern()
128 {
129     return pattern_;
130 }
131 
GetProperty()132 RefPtr<Property> FrameNodeImpl::GetProperty()
133 {
134     return property_;
135 }
136 
GetLayoutWrapper()137 NG::LayoutWrapper* FrameNodeImpl::GetLayoutWrapper()
138 {
139     CHECK_NULL_RETURN(frameNode_, nullptr);
140     return frameNode_;
141 }
142 
MeasureChildren()143 void FrameNodeImpl::MeasureChildren()
144 {
145     CHECK_NULL_VOID(frameNode_);
146     auto layoutConstraint = frameNode_->GetLayoutProperty()->CreateChildConstraint();
147     for (auto& child : frameNode_->GetAllChildrenWithBuild()) {
148         child->Measure(layoutConstraint);
149     }
150 }
151 
LayoutChildren()152 void FrameNodeImpl::LayoutChildren()
153 {
154     CHECK_NULL_VOID(frameNode_);
155     for (auto& child : frameNode_->GetAllChildrenWithBuild()) {
156         child->Layout();
157     }
158 }
159 
GetUIContext() const160 RefPtr<UIContext> FrameNodeImpl::GetUIContext() const
161 {
162     CHECK_NULL_RETURN(frameNode_, nullptr);
163     auto* pipeline = frameNode_->GetContextWithCheck();
164     CHECK_NULL_RETURN(pipeline, nullptr);
165     return pipeline->GetUIContext();
166 }
167 
GetHandle()168 NodeHandle FrameNodeImpl::GetHandle()
169 {
170     return reinterpret_cast<NodeHandle>(frameNode_);
171 }
172 
AddChild(const RefPtr<FrameNode> & child)173 void FrameNodeImpl::AddChild(const RefPtr<FrameNode>& child)
174 {
175     CHECK_NULL_VOID(frameNode_);
176     auto childNode = AceType::DynamicCast<FrameNodeImpl>(child);
177     CHECK_NULL_VOID(childNode);
178     auto* childNodePtr = childNode->GetAceNodePtr();
179     CHECK_NULL_VOID(childNodePtr);
180     frameNode_->AddChild(AceType::Claim(childNodePtr));
181 }
182 
GetChildren()183 std::list<RefPtr<FrameNode>> FrameNodeImpl::GetChildren()
184 {
185     std::list<RefPtr<FrameNode>> children;
186     CHECK_NULL_RETURN(frameNode_, children);
187     for (auto& child : frameNode_->GetAllChildrenWithBuild(false)) {
188         auto node = child->GetHostNode();
189         if (!node) {
190             continue;
191         }
192         auto kitNode = node->GetKitNode();
193         if (!kitNode) {
194             kitNode = MakeRefPtr<FrameNodeImpl>(node);
195         }
196         children.emplace_back(kitNode);
197     }
198     return children;
199 }
200 
MarkDirtyNode(NG::PropertyChangeFlag flag)201 void FrameNodeImpl::MarkDirtyNode(NG::PropertyChangeFlag flag)
202 {
203     CHECK_NULL_VOID(frameNode_);
204     frameNode_->MarkDirtyNode(flag);
205 }
206 
RemoveChild(const RefPtr<FrameNode> & child)207 void FrameNodeImpl::RemoveChild(const RefPtr<FrameNode> &child)
208 {
209     CHECK_NULL_VOID(frameNode_);
210     auto childNode = AceType::DynamicCast<FrameNodeImpl>(child);
211     auto* childNodePtr = childNode->GetAceNodePtr();
212     CHECK_NULL_VOID(childNodePtr);
213     frameNode_->RemoveChild(AceType::Claim(childNodePtr));
214 }
215 
GetTag() const216 std::string FrameNodeImpl::GetTag() const
217 {
218     CHECK_NULL_RETURN(frameNode_, "");
219     return frameNode_->GetTag();
220 }
221 
GetId() const222 int32_t FrameNodeImpl::GetId() const
223 {
224     CHECK_NULL_RETURN(frameNode_, -1);
225     return frameNode_->GetId();
226 }
227 } // namespace OHOS::Ace::Kit
228