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