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