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