• 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 #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() == "page" || parent->GetTag() == "stage")
67                ? nullptr
68                : AceType::DynamicCast<FrameNode>(parent);
69 }
70 
AppendChildInFrameNode(ArkUINodeHandle node,ArkUINodeHandle child)71 ArkUI_Bool AppendChildInFrameNode(ArkUINodeHandle node, ArkUINodeHandle child)
72 {
73     auto* currentNode = reinterpret_cast<UINode*>(node);
74     CHECK_NULL_RETURN(currentNode, true);
75     auto* childNode = reinterpret_cast<UINode*>(child);
76     auto childRef = Referenced::Claim<UINode>(childNode);
77     CHECK_NULL_RETURN(childRef, true);
78     if (childRef->GetParent() != nullptr && childRef->GetParent() != currentNode) {
79         return false;
80     }
81     currentNode->AddChild(childRef);
82     currentNode->MarkNeedFrameFlushDirty(NG::PROPERTY_UPDATE_MEASURE);
83     return true;
84 }
85 
InsertChildAfterInFrameNode(ArkUINodeHandle node,ArkUINodeHandle child,ArkUINodeHandle sibling)86 ArkUI_Bool InsertChildAfterInFrameNode(ArkUINodeHandle node, ArkUINodeHandle child, ArkUINodeHandle sibling)
87 {
88     auto* currentNode = reinterpret_cast<UINode*>(node);
89     CHECK_NULL_RETURN(currentNode, true);
90     auto* childNode = reinterpret_cast<UINode*>(child);
91     CHECK_NULL_RETURN(childNode, true);
92     if (childNode->GetParent() != nullptr && childNode->GetParent() != currentNode) {
93         return false;
94     }
95     auto index = -1;
96     auto* siblingNode = reinterpret_cast<UINode*>(sibling);
97     index = currentNode->GetChildIndex(Referenced::Claim<UINode>(siblingNode));
98     currentNode->AddChild(Referenced::Claim<UINode>(childNode), index + 1);
99     currentNode->MarkNeedFrameFlushDirty(NG::PROPERTY_UPDATE_MEASURE);
100     return true;
101 }
102 
RemoveChildInFrameNode(ArkUINodeHandle node,ArkUINodeHandle child)103 void RemoveChildInFrameNode(ArkUINodeHandle node, ArkUINodeHandle child)
104 {
105     auto* currentNode = reinterpret_cast<UINode*>(node);
106     CHECK_NULL_VOID(currentNode);
107     auto* childNode = reinterpret_cast<UINode*>(child);
108     currentNode->RemoveChild(Referenced::Claim<UINode>(childNode));
109     currentNode->MarkNeedFrameFlushDirty(NG::PROPERTY_UPDATE_MEASURE);
110 }
111 
ClearChildrenInFrameNode(ArkUINodeHandle node)112 void ClearChildrenInFrameNode(ArkUINodeHandle node)
113 {
114     auto* currentNode = reinterpret_cast<FrameNode*>(node);
115     CHECK_NULL_VOID(currentNode);
116     currentNode->Clean();
117     currentNode->MarkNeedFrameFlushDirty(NG::PROPERTY_UPDATE_MEASURE);
118 }
119 
GetChildrenCount(ArkUINodeHandle node,ArkUI_Bool isExpanded)120 ArkUI_Uint32 GetChildrenCount(ArkUINodeHandle node, ArkUI_Bool isExpanded)
121 {
122     auto* currentNode = reinterpret_cast<FrameNode*>(node);
123     CHECK_NULL_RETURN(currentNode, 0);
124     auto* frameNode = AceType::DynamicCast<FrameNode>(currentNode);
125     CHECK_NULL_RETURN(frameNode, 0);
126     if (isExpanded) {
127         frameNode->GetAllChildrenWithBuild(false);
128     }
129     return isExpanded ? frameNode->GetAllChildrenWithBuild(false).size()
130                       : frameNode->GetTotalChildCountWithoutExpanded();
131 }
132 
GetChild(ArkUINodeHandle node,ArkUI_Int32 index,ArkUI_Bool isExpanded)133 ArkUINodeHandle GetChild(ArkUINodeHandle node, ArkUI_Int32 index, ArkUI_Bool isExpanded)
134 {
135     auto* currentNode = reinterpret_cast<FrameNode*>(node);
136     CHECK_NULL_RETURN(currentNode, nullptr);
137     auto* frameNode = AceType::DynamicCast<FrameNode>(currentNode);
138     CHECK_NULL_RETURN(frameNode, nullptr);
139     CHECK_NULL_RETURN(index >= 0, nullptr);
140     if (isExpanded) {
141         frameNode->GetAllChildrenWithBuild(false);
142     }
143     auto child = frameNode->GetFrameNodeChildByIndex(index, false, isExpanded);
144     return reinterpret_cast<ArkUINodeHandle>(child);
145 }
146 
GetFirst(ArkUINodeHandle node,ArkUI_Bool isExpanded)147 ArkUINodeHandle GetFirst(ArkUINodeHandle node, ArkUI_Bool isExpanded)
148 {
149     auto* currentNode = reinterpret_cast<FrameNode*>(node);
150     auto* frameNode = AceType::DynamicCast<FrameNode>(currentNode);
151     CHECK_NULL_RETURN(frameNode, nullptr);
152     if (isExpanded) {
153         frameNode->GetAllChildrenWithBuild(false);
154     }
155     auto child = frameNode->GetFrameNodeChildByIndex(0, false, isExpanded);
156     return reinterpret_cast<ArkUINodeHandle>(child);
157 }
158 
GetNextSibling(ArkUINodeHandle node,ArkUI_Bool isExpanded)159 ArkUINodeHandle GetNextSibling(ArkUINodeHandle node, ArkUI_Bool isExpanded)
160 {
161     auto* currentNode = reinterpret_cast<FrameNode*>(node);
162     CHECK_NULL_RETURN(currentNode, nullptr);
163     auto parent = GetParentNode(currentNode);
164     CHECK_NULL_RETURN(parent, nullptr);
165     auto index = -1;
166     if (isExpanded) {
167         parent->GetAllChildrenWithBuild(false);
168         index = parent->GetChildTrueIndex(Referenced::Claim<FrameNode>(currentNode));
169     } else {
170         index = parent->GetFrameNodeIndex(Referenced::Claim<FrameNode>(currentNode), false);
171     }
172     CHECK_NULL_RETURN(index > -1, nullptr);
173     auto sibling = parent->GetFrameNodeChildByIndex(index + 1, false, isExpanded);
174     return reinterpret_cast<ArkUINodeHandle>(sibling);
175 }
176 
GetPreviousSibling(ArkUINodeHandle node,ArkUI_Bool isExpanded)177 ArkUINodeHandle GetPreviousSibling(ArkUINodeHandle node, ArkUI_Bool isExpanded)
178 {
179     auto* currentNode = reinterpret_cast<FrameNode*>(node);
180     CHECK_NULL_RETURN(currentNode, nullptr);
181     auto parent = GetParentNode(currentNode);
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* frameNode = reinterpret_cast<FrameNode*>(node);
536     CHECK_NULL_VOID(frameNode);
537     auto pipeline = frameNode->GetContextRefPtr();
538     if (pipeline && !pipeline->CheckThreadSafe()) {
539         LOGW("AddCustomProperty doesn't run on UI thread");
540         return;
541     }
542     ViewAbstract::AddCustomProperty(frameNode, key, value);
543 }
544 
RemoveCustomProperty(ArkUINodeHandle node,ArkUI_CharPtr key)545 void RemoveCustomProperty(ArkUINodeHandle node, ArkUI_CharPtr key)
546 {
547     auto* frameNode = reinterpret_cast<FrameNode*>(node);
548     CHECK_NULL_VOID(frameNode);
549     auto pipeline = frameNode->GetContextRefPtr();
550     if (pipeline && !pipeline->CheckThreadSafe()) {
551         LOGW("RemoveCustomProperty doesn't run on UI thread");
552         return;
553     }
554     ViewAbstract::RemoveCustomProperty(frameNode, key);
555 }
556 
557 namespace NodeModifier {
GetFrameNodeModifier()558 const ArkUIFrameNodeModifier* GetFrameNodeModifier()
559 {
560     static const ArkUIFrameNodeModifier modifier = { IsModifiable, CreateFrameNode, InvalidateInFrameNode,
561         AppendChildInFrameNode, InsertChildAfterInFrameNode, RemoveChildInFrameNode, ClearChildrenInFrameNode,
562         GetChildrenCount, GetChild, GetFirst, GetNextSibling, GetPreviousSibling, GetParent, GetIdByNodePtr,
563         PropertyUpdate, GetLast, GetPositionToParent, GetPositionToScreen, GetPositionToWindow,
564         GetPositionToParentWithTransform, GetPositionToScreenWithTransform, GetPositionToWindowWithTransform,
565         GetMeasuredSize, GetLayoutPosition, GetInspectorId, GetNodeType, IsVisible, IsAttached, GetInspectorInfo,
566         GetFrameNodeById, GetFrameNodeByUniqueId, GetFrameNodeByKey, GetAttachedFrameNodeById, GetFirstUINode,
567         GetLayoutSize, GetLayoutPositionWithoutMargin, SetSystemColorModeChangeEvent, ResetSystemColorModeChangeEvent,
568         SetSystemFontStyleChangeEvent, ResetSystemFontStyleChangeEvent, GetCustomPropertyCapiByKey,
569         SetCustomPropertyModiferByKey, AddCustomProperty, RemoveCustomProperty, FreeCustomPropertyCharPtr };
570     return &modifier;
571 }
572 
GetCJUIFrameNodeModifier()573 const CJUIFrameNodeModifier* GetCJUIFrameNodeModifier()
574 {
575     static const CJUIFrameNodeModifier modifier = { IsModifiable, CreateFrameNode, InvalidateInFrameNode,
576         AppendChildInFrameNode, InsertChildAfterInFrameNode, RemoveChildInFrameNode, ClearChildrenInFrameNode,
577         GetChildrenCount, GetChild, GetFirst, GetNextSibling, GetPreviousSibling, GetParent, GetIdByNodePtr,
578         PropertyUpdate, GetLast, GetPositionToParent, GetPositionToScreen, GetPositionToWindow,
579         GetPositionToParentWithTransform, GetPositionToScreenWithTransform, GetPositionToWindowWithTransform,
580         GetMeasuredSize, GetLayoutPosition, GetInspectorId, GetNodeType, IsVisible, IsAttached, GetInspectorInfo,
581         GetFrameNodeById, GetFrameNodeByUniqueId, GetFrameNodeByKey, GetFirstUINode, GetLayoutSize,
582         GetLayoutPositionWithoutMargin };
583     return &modifier;
584 }
585 } // namespace NodeModifier
586 } // namespace OHOS::Ace::NG
587