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 #include "core/interfaces/native/node/frame_node_modifier.h"
16 
17 #include "base/memory/ace_type.h"
18 #include "base/utils/utils.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/base/inspector.h"
21 #include "core/components_ng/base/ui_node.h"
22 #include "core/components_ng/pattern/custom_frame_node/custom_frame_node.h"
23 #include "core/components_ng/pattern/custom_frame_node/custom_frame_node_pattern.h"
24 #include "core/interfaces/arkoala/arkoala_api.h"
25 #include "core/components_ng/base/view_abstract.h"
26 
27 namespace OHOS::Ace::NG {
IsModifiable(ArkUINodeHandle node)28 ArkUI_Bool IsModifiable(ArkUINodeHandle node)
29 {
30     auto* currentNode = reinterpret_cast<UINode*>(node);
31     CHECK_NULL_RETURN(currentNode, false);
32     auto* frameNode = AceType::DynamicCast<UINode>(currentNode);
33     CHECK_NULL_RETURN(frameNode, false);
34     return frameNode->GetTag() == "CustomFrameNode";
35 }
36 
CreateFrameNode()37 ArkUINodeHandle CreateFrameNode()
38 {
39     auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
40     auto node = NG::CustomFrameNode::GetOrCreateCustomFrameNode(nodeId);
41     node->SetExclusiveEventForChild(true);
42     node->SetIsArkTsFrameNode(true);
43     return reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(node));
44 }
45 
InvalidateInFrameNode(ArkUINodeHandle node)46 void InvalidateInFrameNode(ArkUINodeHandle node)
47 {
48     auto* frameNode = reinterpret_cast<FrameNode*>(node);
49     CHECK_NULL_VOID(frameNode);
50     CHECK_NULL_VOID(AceType::InstanceOf<CustomFrameNode>(frameNode));
51     auto pattern = frameNode->GetPattern<CustomFrameNodePattern>();
52     CHECK_NULL_VOID(pattern);
53     auto renderContext = frameNode->GetRenderContext();
54     CHECK_NULL_VOID(renderContext);
55     pattern->Invalidate();
56     renderContext->RequestNextFrame();
57 }
58 
GetParentNode(UINode * node)59 RefPtr<FrameNode> GetParentNode(UINode* node)
60 {
61     auto uiNode = AceType::Claim<UINode>(node);
62     auto parent = uiNode->GetParent();
63     while (parent != nullptr && !AceType::InstanceOf<FrameNode>(parent)) {
64         parent = parent->GetParent();
65     }
66     return (parent == nullptr || parent->GetTag() == V2::PAGE_ETS_TAG || parent->GetTag() == V2::STAGE_ETS_TAG)
67                ? nullptr : AceType::DynamicCast<FrameNode>(parent);
68 }
69 
AppendChildInFrameNode(ArkUINodeHandle node,ArkUINodeHandle child)70 ArkUI_Bool AppendChildInFrameNode(ArkUINodeHandle node, ArkUINodeHandle child)
71 {
72     auto* currentNode = reinterpret_cast<UINode*>(node);
73     CHECK_NULL_RETURN(currentNode, true);
74     auto* childNode = reinterpret_cast<UINode*>(child);
75     auto childRef = Referenced::Claim<UINode>(childNode);
76     CHECK_NULL_RETURN(childRef, true);
77     if (childRef->GetParent() != nullptr && childRef->GetParent() != currentNode) {
78         return false;
79     }
80     currentNode->AddChild(childRef);
81     currentNode->MarkNeedFrameFlushDirty(NG::PROPERTY_UPDATE_MEASURE);
82     return true;
83 }
84 
InsertChildAfterInFrameNode(ArkUINodeHandle node,ArkUINodeHandle child,ArkUINodeHandle sibling)85 ArkUI_Bool InsertChildAfterInFrameNode(ArkUINodeHandle node, ArkUINodeHandle child, ArkUINodeHandle sibling)
86 {
87     auto* currentNode = reinterpret_cast<UINode*>(node);
88     CHECK_NULL_RETURN(currentNode, true);
89     auto* childNode = reinterpret_cast<UINode*>(child);
90     CHECK_NULL_RETURN(childNode, true);
91     if (childNode->GetParent() != nullptr && childNode->GetParent() != currentNode) {
92         return false;
93     }
94     auto index = -1;
95     auto* siblingNode = reinterpret_cast<UINode*>(sibling);
96     index = currentNode->GetChildIndex(Referenced::Claim<UINode>(siblingNode));
97     currentNode->AddChild(Referenced::Claim<UINode>(childNode), index + 1);
98     currentNode->MarkNeedFrameFlushDirty(NG::PROPERTY_UPDATE_MEASURE);
99     return true;
100 }
101 
RemoveChildInFrameNode(ArkUINodeHandle node,ArkUINodeHandle child)102 void RemoveChildInFrameNode(ArkUINodeHandle node, ArkUINodeHandle child)
103 {
104     auto* currentNode = reinterpret_cast<UINode*>(node);
105     CHECK_NULL_VOID(currentNode);
106     auto* childNode = reinterpret_cast<UINode*>(child);
107     currentNode->RemoveChild(Referenced::Claim<UINode>(childNode));
108     currentNode->MarkNeedFrameFlushDirty(NG::PROPERTY_UPDATE_MEASURE);
109 }
110 
ClearChildrenInFrameNode(ArkUINodeHandle node)111 void ClearChildrenInFrameNode(ArkUINodeHandle node)
112 {
113     auto* currentNode = reinterpret_cast<FrameNode*>(node);
114     CHECK_NULL_VOID(currentNode);
115     currentNode->Clean();
116     currentNode->MarkNeedFrameFlushDirty(NG::PROPERTY_UPDATE_MEASURE);
117 }
118 
GetChildrenCount(ArkUINodeHandle node,ArkUI_Bool isExpanded)119 ArkUI_Uint32 GetChildrenCount(ArkUINodeHandle node, ArkUI_Bool isExpanded)
120 {
121     auto* currentNode = reinterpret_cast<FrameNode*>(node);
122     CHECK_NULL_RETURN(currentNode, 0);
123     auto* frameNode = AceType::DynamicCast<FrameNode>(currentNode);
124     CHECK_NULL_RETURN(frameNode, 0);
125     if (isExpanded) {
126         frameNode->GetAllChildrenWithBuild(false);
127     }
128     return isExpanded ? frameNode->GetAllChildrenWithBuild(false).size()
129                       : frameNode->GetTotalChildCountWithoutExpanded();
130 }
131 
GetChild(ArkUINodeHandle node,ArkUI_Int32 index,ArkUI_Bool isExpanded)132 ArkUINodeHandle GetChild(ArkUINodeHandle node, ArkUI_Int32 index, ArkUI_Bool isExpanded)
133 {
134     auto* currentNode = reinterpret_cast<FrameNode*>(node);
135     CHECK_NULL_RETURN(currentNode, nullptr);
136     auto* frameNode = AceType::DynamicCast<FrameNode>(currentNode);
137     CHECK_NULL_RETURN(frameNode, nullptr);
138     CHECK_NULL_RETURN(index >= 0, nullptr);
139     if (isExpanded) {
140         frameNode->GetAllChildrenWithBuild(false);
141     }
142     auto child = frameNode->GetFrameNodeChildByIndex(index, false, isExpanded);
143     return reinterpret_cast<ArkUINodeHandle>(child);
144 }
145 
GetFirst(ArkUINodeHandle node,ArkUI_Bool isExpanded)146 ArkUINodeHandle GetFirst(ArkUINodeHandle node, ArkUI_Bool isExpanded)
147 {
148     auto* currentNode = reinterpret_cast<FrameNode*>(node);
149     auto* frameNode = AceType::DynamicCast<FrameNode>(currentNode);
150     CHECK_NULL_RETURN(frameNode, nullptr);
151     if (isExpanded) {
152         frameNode->GetAllChildrenWithBuild(false);
153     }
154     auto child = frameNode->GetFrameNodeChildByIndex(0, false, isExpanded);
155     return reinterpret_cast<ArkUINodeHandle>(child);
156 }
157 
GetNextSibling(ArkUINodeHandle node,ArkUI_Bool isExpanded)158 ArkUINodeHandle GetNextSibling(ArkUINodeHandle node, ArkUI_Bool isExpanded)
159 {
160     auto* currentNode = reinterpret_cast<FrameNode*>(node);
161     CHECK_NULL_RETURN(currentNode, nullptr);
162     auto parent = GetParentNode(currentNode);
163     CHECK_NULL_RETURN(parent, nullptr);
164     auto index = -1;
165     if (isExpanded) {
166         parent->GetAllChildrenWithBuild(false);
167         index = parent->GetChildTrueIndex(Referenced::Claim<FrameNode>(currentNode));
168     } else {
169         index = parent->GetFrameNodeIndex(Referenced::Claim<FrameNode>(currentNode), false);
170     }
171     CHECK_NULL_RETURN(index > -1, nullptr);
172     auto sibling = parent->GetFrameNodeChildByIndex(index + 1, false, isExpanded);
173     return reinterpret_cast<ArkUINodeHandle>(sibling);
174 }
175 
GetPreviousSibling(ArkUINodeHandle node,ArkUI_Bool isExpanded)176 ArkUINodeHandle GetPreviousSibling(ArkUINodeHandle node, ArkUI_Bool isExpanded)
177 {
178     auto* currentNode = reinterpret_cast<FrameNode*>(node);
179     CHECK_NULL_RETURN(currentNode, nullptr);
180     auto parent = GetParentNode(currentNode);
181     CHECK_NULL_RETURN(parent, nullptr);
182     auto index = -1;
183     if (isExpanded) {
184         parent->GetAllChildrenWithBuild(false);
185         index = parent->GetChildTrueIndex(Referenced::Claim<FrameNode>(currentNode));
186     } else {
187         index = parent->GetFrameNodeIndex(Referenced::Claim<FrameNode>(currentNode), false);
188     }
189     CHECK_NULL_RETURN(index > 0, nullptr);
190     auto sibling = parent->GetFrameNodeChildByIndex(index - 1, false, isExpanded);
191     return reinterpret_cast<ArkUINodeHandle>(sibling);
192 }
193 
GetParent(ArkUINodeHandle node)194 ArkUINodeHandle GetParent(ArkUINodeHandle node)
195 {
196     auto* currentNode = reinterpret_cast<UINode*>(node);
197     CHECK_NULL_RETURN(currentNode, nullptr);
198     auto parent = GetParentNode(currentNode);
199     return reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(parent));
200 }
201 
GetIdByNodePtr(ArkUINodeHandle node)202 ArkUI_Int32 GetIdByNodePtr(ArkUINodeHandle node)
203 {
204     auto* currentNode = reinterpret_cast<UINode*>(node);
205     CHECK_NULL_RETURN(currentNode, -1);
206     auto nodeId = currentNode->GetId();
207     return nodeId;
208 }
209 
PropertyUpdate(ArkUINodeHandle node)210 void PropertyUpdate(ArkUINodeHandle node)
211 {
212     auto* uiNode = reinterpret_cast<UINode*>(node);
213     if (uiNode) {
214         uiNode->MarkDirtyNode(PROPERTY_UPDATE_DIFF);
215     }
216 }
217 
GetLast(ArkUINodeHandle node,ArkUI_Bool isExpanded)218 ArkUINodeHandle GetLast(ArkUINodeHandle node, ArkUI_Bool isExpanded)
219 {
220     auto* currentNode = reinterpret_cast<FrameNode*>(node);
221     CHECK_NULL_RETURN(currentNode, nullptr);
222     auto* frameNode = AceType::DynamicCast<FrameNode>(currentNode);
223     CHECK_NULL_RETURN(frameNode, nullptr);
224     size_t size = isExpanded ? frameNode->GetAllChildrenWithBuild(false).size()
225                              : static_cast<size_t>(frameNode->GetTotalChildCountWithoutExpanded());
226     CHECK_NULL_RETURN(size > 0, nullptr);
227     auto child = frameNode->GetFrameNodeChildByIndex(size - 1, false, isExpanded);
228     return reinterpret_cast<ArkUINodeHandle>(child);
229 }
230 
GetPositionToParent(ArkUINodeHandle node,ArkUI_Float32 (* parentOffset)[2],ArkUI_Bool useVp)231 void GetPositionToParent(ArkUINodeHandle node, ArkUI_Float32 (*parentOffset)[2], ArkUI_Bool useVp)
232 {
233     auto* currentNode = reinterpret_cast<FrameNode*>(node);
234     CHECK_NULL_VOID(currentNode);
235     auto currFrameRect = currentNode->GetRectWithRender();
236     auto offset = currFrameRect.GetOffset();
237     if (useVp) {
238         (*parentOffset)[0] = PipelineBase::Px2VpWithCurrentDensity(offset.GetX());
239         (*parentOffset)[1] = PipelineBase::Px2VpWithCurrentDensity(offset.GetY());
240     } else {
241         (*parentOffset)[0] = offset.GetX();
242         (*parentOffset)[1] = offset.GetY();
243     }
244 }
245 
GetPositionToScreen(ArkUINodeHandle node,ArkUI_Float32 (* screenPosition)[2],ArkUI_Bool useVp)246 void GetPositionToScreen(ArkUINodeHandle node, ArkUI_Float32 (*screenPosition)[2], ArkUI_Bool useVp)
247 {
248     auto* currentNode = reinterpret_cast<FrameNode*>(node);
249     CHECK_NULL_VOID(currentNode);
250     auto offset = currentNode->GetPositionToScreen();
251     if (useVp) {
252         (*screenPosition)[0] = PipelineBase::Px2VpWithCurrentDensity(offset.GetX());
253         (*screenPosition)[1] = PipelineBase::Px2VpWithCurrentDensity(offset.GetY());
254     } else {
255         (*screenPosition)[0] = offset.GetX();
256         (*screenPosition)[1] = offset.GetY();
257     }
258 }
259 
GetPositionToWindow(ArkUINodeHandle node,ArkUI_Float32 (* windowOffset)[2],ArkUI_Bool useVp)260 void GetPositionToWindow(ArkUINodeHandle node, ArkUI_Float32 (*windowOffset)[2], ArkUI_Bool useVp)
261 {
262     auto* currentNode = reinterpret_cast<FrameNode*>(node);
263     CHECK_NULL_VOID(currentNode);
264     auto offset = currentNode->GetOffsetRelativeToWindow();
265     if (useVp) {
266         (*windowOffset)[0] = PipelineBase::Px2VpWithCurrentDensity(offset.GetX());
267         (*windowOffset)[1] = PipelineBase::Px2VpWithCurrentDensity(offset.GetY());
268     } else {
269         (*windowOffset)[0] = offset.GetX();
270         (*windowOffset)[1] = offset.GetY();
271     }
272 }
273 
GetPositionToParentWithTransform(ArkUINodeHandle node,ArkUI_Float32 (* parentPosition)[2],ArkUI_Bool useVp)274 void GetPositionToParentWithTransform(ArkUINodeHandle node, ArkUI_Float32 (*parentPosition)[2], ArkUI_Bool useVp)
275 {
276     auto* currentNode = reinterpret_cast<FrameNode*>(node);
277     CHECK_NULL_VOID(currentNode);
278     auto offset = currentNode->GetPositionToParentWithTransform();
279     if (useVp) {
280         (*parentPosition)[0] = PipelineBase::Px2VpWithCurrentDensity(offset.GetX());
281         (*parentPosition)[1] = PipelineBase::Px2VpWithCurrentDensity(offset.GetY());
282     } else {
283         (*parentPosition)[0] = offset.GetX();
284         (*parentPosition)[1] = offset.GetY();
285     }
286 }
287 
GetPositionToScreenWithTransform(ArkUINodeHandle node,ArkUI_Float32 (* screenPosition)[2],ArkUI_Bool useVp)288 void GetPositionToScreenWithTransform(ArkUINodeHandle node, ArkUI_Float32 (*screenPosition)[2], ArkUI_Bool useVp)
289 {
290     auto* currentNode = reinterpret_cast<FrameNode*>(node);
291     CHECK_NULL_VOID(currentNode);
292     auto offset = currentNode->GetPositionToScreenWithTransform();
293     if (useVp) {
294         (*screenPosition)[0] = PipelineBase::Px2VpWithCurrentDensity(offset.GetX());
295         (*screenPosition)[1] = PipelineBase::Px2VpWithCurrentDensity(offset.GetY());
296     } else {
297         (*screenPosition)[0] = offset.GetX();
298         (*screenPosition)[1] = offset.GetY();
299     }
300 }
301 
GetPositionToWindowWithTransform(ArkUINodeHandle node,ArkUI_Float32 (* windowPosition)[2],ArkUI_Bool useVp)302 void GetPositionToWindowWithTransform(ArkUINodeHandle node, ArkUI_Float32 (*windowPosition)[2], ArkUI_Bool useVp)
303 {
304     auto* currentNode = reinterpret_cast<FrameNode*>(node);
305     CHECK_NULL_VOID(currentNode);
306     auto offset = currentNode->GetPositionToWindowWithTransform();
307     if (useVp) {
308         (*windowPosition)[0] = PipelineBase::Px2VpWithCurrentDensity(offset.GetX());
309         (*windowPosition)[1] = PipelineBase::Px2VpWithCurrentDensity(offset.GetY());
310     } else {
311         (*windowPosition)[0] = offset.GetX();
312         (*windowPosition)[1] = offset.GetY();
313     }
314 }
315 
GetMeasuredSize(ArkUINodeHandle node)316 ArkUI_Float32* GetMeasuredSize(ArkUINodeHandle node)
317 {
318     auto* currentNode = reinterpret_cast<FrameNode*>(node);
319     CHECK_NULL_RETURN(currentNode, nullptr);
320     auto offset = currentNode->GetGeometryNode()->GetFrameSize();
321     ArkUI_Float32* ret = new ArkUI_Float32[2];
322     ret[0] = offset.Width();
323     ret[1] = offset.Height();
324     return ret;
325 }
326 
GetLayoutPosition(ArkUINodeHandle node)327 ArkUI_Float32* GetLayoutPosition(ArkUINodeHandle node)
328 {
329     auto* currentNode = reinterpret_cast<FrameNode*>(node);
330     CHECK_NULL_RETURN(currentNode, nullptr);
331     auto offset = currentNode->GetGeometryNode()->GetMarginFrameOffset();
332     ArkUI_Float32* ret = new ArkUI_Float32[2];
333     ret[0] = offset.GetX();
334     ret[1] = offset.GetY();
335     return ret;
336 }
337 
GetInspectorId(ArkUINodeHandle node)338 ArkUI_CharPtr GetInspectorId(ArkUINodeHandle node)
339 {
340     auto* currentNode = reinterpret_cast<FrameNode*>(node);
341     CHECK_NULL_RETURN(currentNode, "");
342     auto inspectorIdProp = currentNode->GetInspectorId();
343     if (inspectorIdProp.has_value()) {
344         static std::string inspectorId;
345         inspectorId = inspectorIdProp.value();
346         return inspectorId.c_str();
347     }
348 
349     return "";
350 }
351 
GetNodeType(ArkUINodeHandle node)352 ArkUI_CharPtr GetNodeType(ArkUINodeHandle node)
353 {
354     auto* currentNode = reinterpret_cast<FrameNode*>(node);
355     CHECK_NULL_RETURN(currentNode, "");
356     static std::string nodeType;
357     nodeType = currentNode->GetTag();
358     return nodeType.c_str();
359 }
360 
IsVisible(ArkUINodeHandle node)361 ArkUI_Bool IsVisible(ArkUINodeHandle node)
362 {
363     auto* currentNode = reinterpret_cast<FrameNode*>(node);
364     CHECK_NULL_RETURN(currentNode, false);
365     auto isVisible = currentNode->IsVisible();
366     auto parentNode = currentNode->GetParent();
367     while (isVisible && parentNode && AceType::InstanceOf<FrameNode>(*parentNode)) {
368         isVisible = isVisible && AceType::DynamicCast<FrameNode>(parentNode)->IsVisible();
369         parentNode = parentNode->GetParent();
370     }
371     return isVisible;
372 }
373 
IsAttached(ArkUINodeHandle node)374 ArkUI_Bool IsAttached(ArkUINodeHandle node)
375 {
376     auto* currentNode = reinterpret_cast<FrameNode*>(node);
377     CHECK_NULL_RETURN(currentNode, false);
378     return currentNode->IsOnMainTree();
379 }
380 
GetInspectorInfo(ArkUINodeHandle node)381 ArkUI_CharPtr GetInspectorInfo(ArkUINodeHandle node)
382 {
383     auto* currentNode = reinterpret_cast<FrameNode*>(node);
384     CHECK_NULL_RETURN(currentNode, "{}");
385     static std::string inspectorInfo;
386     inspectorInfo = NG::Inspector::GetInspectorOfNode(OHOS::Ace::AceType::Claim<FrameNode>(currentNode));
387     return inspectorInfo.c_str();
388 }
389 
GetFrameNodeById(ArkUI_Int32 nodeId)390 ArkUINodeHandle GetFrameNodeById(ArkUI_Int32 nodeId)
391 {
392     auto node = OHOS::Ace::ElementRegister::GetInstance()->GetNodeById(nodeId);
393     return reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(node));
394 }
395 
GetFrameNodeByUniqueId(ArkUI_Int32 uniqueId)396 ArkUINodeHandle GetFrameNodeByUniqueId(ArkUI_Int32 uniqueId)
397 {
398     auto node = AceType::DynamicCast<NG::UINode>(OHOS::Ace::ElementRegister::GetInstance()->GetNodeById(uniqueId));
399     CHECK_NULL_RETURN(node, nullptr);
400     if (node->GetTag() == "root" || node->GetTag() == "stage" || node->GetTag() == "page") {
401         return nullptr;
402     }
403 
404     if (!AceType::InstanceOf<NG::FrameNode>(node)) {
405         auto parent = node->GetParent();
406         if (parent && parent->GetTag() == V2::COMMON_VIEW_ETS_TAG) {
407             node = parent;
408         } else {
409             node = node->GetFrameChildByIndexWithoutExpanded(0);
410         }
411     }
412 
413     return reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(node));
414 }
415 
GetFrameNodeByKey(ArkUI_CharPtr key)416 ArkUINodeHandle GetFrameNodeByKey(ArkUI_CharPtr key)
417 {
418     auto node = NG::Inspector::GetFrameNodeByKey(key, true);
419     return reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(node));
420 }
421 
GetAttachedFrameNodeById(ArkUI_CharPtr key)422 ArkUINodeHandle GetAttachedFrameNodeById(ArkUI_CharPtr key)
423 {
424     auto node = ElementRegister::GetInstance()->GetAttachedFrameNodeById(key);
425     return reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(node));
426 }
427 
GetFirstUINode(ArkUINodeHandle node)428 ArkUINodeHandle GetFirstUINode(ArkUINodeHandle node)
429 {
430     auto* currentNode = reinterpret_cast<UINode*>(node);
431     CHECK_NULL_RETURN(currentNode, nullptr);
432     auto child = currentNode->GetFirstChild();
433     return reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(child));
434 }
435 
GetLayoutSize(ArkUINodeHandle node,ArkUI_Int32 * size)436 void GetLayoutSize(ArkUINodeHandle node, ArkUI_Int32* size)
437 {
438     auto* currentNode = reinterpret_cast<FrameNode*>(node);
439     CHECK_NULL_VOID(currentNode);
440     auto renderContext = currentNode->GetRenderContext();
441     CHECK_NULL_VOID(renderContext);
442     auto rectSize = renderContext->GetPaintRectWithoutTransform().GetSize();
443     size[0] = rectSize.Width();
444     size[1] = rectSize.Height();
445 }
446 
GetLayoutPositionWithoutMargin(ArkUINodeHandle node)447 ArkUI_Float32* GetLayoutPositionWithoutMargin(ArkUINodeHandle node)
448 {
449     auto* currentNode = reinterpret_cast<FrameNode*>(node);
450     CHECK_NULL_RETURN(currentNode, nullptr);
451     auto rect = currentNode->GetPaintRectWithTransform();
452     ArkUI_Float32* ret = new ArkUI_Float32[2];
453     ret[0] = rect.GetX();
454     ret[1] = rect.GetY();
455     return ret;
456 }
457 
SetSystemColorModeChangeEvent(ArkUINodeHandle node,void * userData,void * onColorModeChange)458 ArkUI_Int32 SetSystemColorModeChangeEvent(ArkUINodeHandle node, void* userData, void* onColorModeChange)
459 {
460     auto* frameNode = reinterpret_cast<FrameNode*>(node);
461     CHECK_NULL_RETURN(frameNode, 0);
462     auto onColorChange = [userData, onColorModeChange](int32_t colorMode) {
463         using FuncType = float (*)(int32_t, void*);
464         FuncType func = reinterpret_cast<FuncType>(onColorModeChange);
465         func(colorMode, userData);
466     };
467     ViewAbstract::SetSystemColorModeChangeEvent(frameNode, onColorChange);
468     return 0;
469 }
470 
ResetSystemColorModeChangeEvent(ArkUINodeHandle node)471 void ResetSystemColorModeChangeEvent(ArkUINodeHandle node)
472 {
473     auto* frameNode = reinterpret_cast<FrameNode*>(node);
474     CHECK_NULL_VOID(frameNode);
475     ViewAbstract::SetSystemColorModeChangeEvent(frameNode, nullptr);
476 }
477 
SetSystemFontStyleChangeEvent(ArkUINodeHandle node,void * userData,void * onFontStyleChange)478 ArkUI_Int32 SetSystemFontStyleChangeEvent(ArkUINodeHandle node, void* userData, void* onFontStyleChange)
479 {
480     auto* frameNode = reinterpret_cast<FrameNode*>(node);
481     CHECK_NULL_RETURN(frameNode, 0);
482     auto onFontChange = [userData, onFontStyleChange](float fontSize, float fontWeight) {
483         ArkUISystemFontStyleEvent fontStyle = new ArkUI_SystemFontStyleEvent();
484         fontStyle->fontSize = fontSize;
485         fontStyle->fontWeight = fontWeight;
486         using FuncType = float (*)(ArkUISystemFontStyleEvent, void*);
487         FuncType func = reinterpret_cast<FuncType>(onFontStyleChange);
488         func(fontStyle, userData);
489     };
490     ViewAbstract::SetSystemFontChangeEvent(frameNode, onFontChange);
491     return 0;
492 }
493 
ResetSystemFontStyleChangeEvent(ArkUINodeHandle node)494 void ResetSystemFontStyleChangeEvent(ArkUINodeHandle node)
495 {
496     auto* frameNode = reinterpret_cast<FrameNode*>(node);
497     CHECK_NULL_VOID(frameNode);
498     ViewAbstract::SetSystemFontChangeEvent(frameNode, nullptr);
499 }
500 
GetCustomPropertyCapiByKey(ArkUINodeHandle node,ArkUI_CharPtr key,char ** value,ArkUI_Uint32 * size)501 ArkUI_Uint32 GetCustomPropertyCapiByKey(ArkUINodeHandle node, ArkUI_CharPtr key, char** value, ArkUI_Uint32* size)
502 {
503     auto* frameNode = reinterpret_cast<FrameNode*>(node);
504     CHECK_NULL_RETURN(frameNode, 0);
505     std::string capiCustomProperty;
506     if (!frameNode->GetCapiCustomProperty(key, capiCustomProperty)) {
507         return 0;
508     }
509     *size = capiCustomProperty.size();
510     *value = new char[*size + 1];
511     capiCustomProperty.copy(*value, *size);
512     (*value)[*size] = '\0';
513     return 1;
514 }
515 
FreeCustomPropertyCharPtr(char * value,ArkUI_Uint32 size)516 void FreeCustomPropertyCharPtr(char* value, ArkUI_Uint32 size)
517 {
518     CHECK_NULL_VOID(value);
519     delete[] value;
520     value = nullptr;
521 }
522 
SetCustomPropertyModiferByKey(ArkUINodeHandle node,void * callback,void * getCallback)523 void SetCustomPropertyModiferByKey(ArkUINodeHandle node, void* callback, void* getCallback)
524 {
525     auto* frameNode = reinterpret_cast<FrameNode*>(node);
526     CHECK_NULL_VOID(frameNode);
527     std::function<bool()>* func = reinterpret_cast<std::function<bool()>*>(callback);
528     std::function<std::string(const std::string&)>* getFunc =
529         reinterpret_cast<std::function<std::string(const std::string&)>*>(getCallback);
530     frameNode->SetJSCustomProperty(*func, *getFunc);
531 }
532 
AddCustomProperty(ArkUINodeHandle node,ArkUI_CharPtr key,ArkUI_CharPtr value)533 void AddCustomProperty(ArkUINodeHandle node, ArkUI_CharPtr key, ArkUI_CharPtr value)
534 {
535     auto* uiNode = reinterpret_cast<UINode*>(node);
536     CHECK_NULL_VOID(uiNode);
537     auto pipeline = uiNode->GetContextRefPtr();
538     if (pipeline && !pipeline->CheckThreadSafe()) {
539         LOGW("AddCustomProperty doesn't run on UI thread");
540         return;
541     }
542     ViewAbstract::AddCustomProperty(uiNode, key, value);
543 }
544 
RemoveCustomProperty(ArkUINodeHandle node,ArkUI_CharPtr key)545 void RemoveCustomProperty(ArkUINodeHandle node, ArkUI_CharPtr key)
546 {
547     auto* uiNode = reinterpret_cast<UINode*>(node);
548     CHECK_NULL_VOID(uiNode);
549     auto pipeline = uiNode->GetContextRefPtr();
550     if (pipeline && !pipeline->CheckThreadSafe()) {
551         LOGW("RemoveCustomProperty doesn't run on UI thread");
552         return;
553     }
554     ViewAbstract::RemoveCustomProperty(uiNode, key);
555 }
556 
GetCurrentPageRootNode(ArkUINodeHandle node)557 ArkUINodeHandle GetCurrentPageRootNode(ArkUINodeHandle node)
558 {
559     auto uiNode = reinterpret_cast<UINode*>(node);
560     CHECK_NULL_RETURN(uiNode, nullptr);
561     auto rootNode = uiNode->GetCurrentPageRootNode();
562     return reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(rootNode));
563 }
564 
GetNodeTag(ArkUINodeHandle node)565 ArkUI_Int32 GetNodeTag(ArkUINodeHandle node)
566 {
567     auto uiNode = reinterpret_cast<UINode*>(node);
568     CHECK_NULL_RETURN(uiNode, 0);
569     return uiNode->IsCNode();
570 }
571 
GetActiveChildrenInfo(ArkUINodeHandle handle,ArkUINodeHandle ** items,ArkUI_Int32 * size)572 void GetActiveChildrenInfo(ArkUINodeHandle handle, ArkUINodeHandle** items, ArkUI_Int32* size)
573 {
574     auto* frameNode = reinterpret_cast<FrameNode*>(handle);
575     CHECK_NULL_VOID(frameNode);
576     auto childList = frameNode->GetActiveChildren();
577     *size = childList.size();
578     *items = new ArkUINodeHandle[*size];
579     int32_t i = 0;
580     for (auto& child : childList) {
581         (*items)[i++] = reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(child));
582     }
583 }
584 
GetCustomProperty(ArkUINodeHandle node,ArkUI_CharPtr key,char ** value)585 void GetCustomProperty(ArkUINodeHandle node, ArkUI_CharPtr key, char** value)
586 {
587     auto* frameNode = reinterpret_cast<FrameNode*>(node);
588     CHECK_NULL_VOID(frameNode);
589     std::string capiCustomProperty;
590     if (frameNode->IsCNode()) {
591         frameNode->GetCapiCustomProperty(key, capiCustomProperty);
592     } else {
593         frameNode->GetJSCustomProperty(key, capiCustomProperty);
594     }
595     auto size = capiCustomProperty.size();
596     *value = new char[size + 1];
597     capiCustomProperty.copy(*value, size);
598     (*value)[size] = '\0';
599 }
600 
601 namespace NodeModifier {
GetFrameNodeModifier()602 const ArkUIFrameNodeModifier* GetFrameNodeModifier()
603 {
604     static const ArkUIFrameNodeModifier modifier = { IsModifiable, CreateFrameNode, InvalidateInFrameNode,
605         AppendChildInFrameNode, InsertChildAfterInFrameNode, RemoveChildInFrameNode, ClearChildrenInFrameNode,
606         GetChildrenCount, GetChild, GetFirst, GetNextSibling, GetPreviousSibling, GetParent, GetIdByNodePtr,
607         PropertyUpdate, GetLast, GetPositionToParent, GetPositionToScreen, GetPositionToWindow,
608         GetPositionToParentWithTransform, GetPositionToScreenWithTransform, GetPositionToWindowWithTransform,
609         GetMeasuredSize, GetLayoutPosition, GetInspectorId, GetNodeType, IsVisible, IsAttached, GetInspectorInfo,
610         GetFrameNodeById, GetFrameNodeByUniqueId, GetFrameNodeByKey, GetAttachedFrameNodeById, GetFirstUINode,
611         GetLayoutSize, GetLayoutPositionWithoutMargin, SetSystemColorModeChangeEvent, ResetSystemColorModeChangeEvent,
612         SetSystemFontStyleChangeEvent, ResetSystemFontStyleChangeEvent, GetCustomPropertyCapiByKey,
613         SetCustomPropertyModiferByKey, AddCustomProperty, RemoveCustomProperty, FreeCustomPropertyCharPtr,
614         GetCurrentPageRootNode, GetNodeTag, GetActiveChildrenInfo, GetCustomProperty };
615     return &modifier;
616 }
617 
GetCJUIFrameNodeModifier()618 const CJUIFrameNodeModifier* GetCJUIFrameNodeModifier()
619 {
620     static const CJUIFrameNodeModifier modifier = { IsModifiable, CreateFrameNode, InvalidateInFrameNode,
621         AppendChildInFrameNode, InsertChildAfterInFrameNode, RemoveChildInFrameNode, ClearChildrenInFrameNode,
622         GetChildrenCount, GetChild, GetFirst, GetNextSibling, GetPreviousSibling, GetParent, GetIdByNodePtr,
623         PropertyUpdate, GetLast, GetPositionToParent, GetPositionToScreen, GetPositionToWindow,
624         GetPositionToParentWithTransform, GetPositionToScreenWithTransform, GetPositionToWindowWithTransform,
625         GetMeasuredSize, GetLayoutPosition, GetInspectorId, GetNodeType, IsVisible, IsAttached, GetInspectorInfo,
626         GetFrameNodeById, GetFrameNodeByUniqueId, GetFrameNodeByKey, GetFirstUINode, GetLayoutSize,
627         GetLayoutPositionWithoutMargin };
628     return &modifier;
629 }
630 } // namespace NodeModifier
631 } // namespace OHOS::Ace::NG
632