1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ui/view/components/custom_node.h"
17
18 #include "interfaces/inner_api/ace_kit/src/view/frame_node_impl.h"
19 #include "interfaces/inner_api/ace_kit/src/view/ui_context_impl.h"
20 #include "ui/base/referenced.h"
21
22 #include "core/components_ng/pattern/custom_node_ext/custom_node_ext_model_ng.h"
23
24 namespace OHOS::Ace::Kit {
25
CustomNode(const RefPtr<FrameNode> aceNode)26 CustomNode::CustomNode(const RefPtr<FrameNode> aceNode)
27 {
28 node_ = aceNode;
29 }
30
31 CustomNode::~CustomNode() = default;
32
Create(const std::string & tag)33 RefPtr<CustomNode> CustomNode::Create(const std::string& tag)
34 {
35 auto aceNode = NG::CustomNodeExtModelNG::CreateFrameNode(tag);
36 return Referenced::MakeRefPtr<CustomNode>(AceType::MakeRefPtr<FrameNodeImpl>(aceNode));
37 }
38
GetOrCreateFrameNode(const std::string & tag)39 RefPtr<CustomNode> CustomNode::GetOrCreateFrameNode(const std::string& tag)
40 {
41 auto aceNode = NG::CustomNodeExtModelNG::GetOrCreateFrameNode(tag);
42 return Referenced::MakeRefPtr<CustomNode>(AceType::MakeRefPtr<FrameNodeImpl>(aceNode));
43 }
44
SetOnWindowFocusedCallback(const NodeHandle node,void (* onWindowFocused)(NodeHandle node))45 void CustomNode::SetOnWindowFocusedCallback(const NodeHandle node, void (*onWindowFocused)(NodeHandle node))
46 {
47 auto* frameNode = reinterpret_cast<AceNode*>(node);
48 CHECK_NULL_VOID(frameNode);
49
50 auto onWindowFocusedCallback = [node, onWindowFocused]() {
51 onWindowFocused(node);
52 };
53 NG::CustomNodeExtModelNG::SetOnWindowFocusedCallback(frameNode, std::move(onWindowFocusedCallback));
54 }
55
SetOnWindowUnfocusedCallback(const NodeHandle node,void (* onWindowUnfocused)(NodeHandle node))56 void CustomNode::SetOnWindowUnfocusedCallback(const NodeHandle node, void (*onWindowUnfocused)(NodeHandle node))
57 {
58 auto* frameNode = reinterpret_cast<AceNode*>(node);
59 CHECK_NULL_VOID(frameNode);
60
61 auto onWindowUnfocusedCallback = [node, onWindowUnfocused]() {
62 onWindowUnfocused(node);
63 };
64 NG::CustomNodeExtModelNG::SetOnWindowUnfocusedCallback(frameNode, std::move(onWindowUnfocusedCallback));
65 }
66
SetOnWindowActivatedCallback(const NodeHandle node,void (* onWindowActivated)(NodeHandle node))67 void CustomNode::SetOnWindowActivatedCallback(const NodeHandle node, void (*onWindowActivated)(NodeHandle node))
68 {
69 auto* frameNode = reinterpret_cast<AceNode*>(node);
70 CHECK_NULL_VOID(frameNode);
71
72 auto onWindowActivatedCallback = [node, onWindowActivated]() {
73 onWindowActivated(node);
74 };
75 NG::CustomNodeExtModelNG::SetOnWindowActivatedCallback(frameNode, std::move(onWindowActivatedCallback));
76 }
77
SetOnWindowDeactivatedCallback(const NodeHandle node,void (* onWindowDeactivated)(NodeHandle node))78 void CustomNode::SetOnWindowDeactivatedCallback(const NodeHandle node, void (*onWindowDeactivated)(NodeHandle node))
79 {
80 auto* frameNode = reinterpret_cast<AceNode*>(node);
81 CHECK_NULL_VOID(frameNode);
82
83 auto onWindowDeactivatedCallback = [node, onWindowDeactivated]() {
84 onWindowDeactivated(node);
85 };
86 NG::CustomNodeExtModelNG::SetOnWindowDeactivatedCallback(frameNode, std::move(onWindowDeactivatedCallback));
87 }
88
SetOnAttachToMainTreeCallback(const NodeHandle node,void (* onAttachToMainTree)(NodeHandle node))89 void CustomNode::SetOnAttachToMainTreeCallback(const NodeHandle node, void (*onAttachToMainTree)(NodeHandle node))
90 {
91 auto* frameNode = reinterpret_cast<AceNode*>(node);
92 CHECK_NULL_VOID(frameNode);
93
94 auto onAttachToMainTreeCallback = [node, onAttachToMainTree]() {
95 onAttachToMainTree(node);
96 };
97 NG::CustomNodeExtModelNG::SetOnAttachToMainTreeCallback(frameNode, std::move(onAttachToMainTreeCallback));
98 }
99
SetOnDetachFromMainTreeCallback(const NodeHandle node,void (* onDetachFromMainTree)(NodeHandle node))100 void CustomNode::SetOnDetachFromMainTreeCallback(const NodeHandle node, void (*onDetachFromMainTree)(NodeHandle node))
101 {
102 auto* frameNode = reinterpret_cast<AceNode*>(node);
103 CHECK_NULL_VOID(frameNode);
104
105 auto onDetachFromMainTreeCallback = [node, onDetachFromMainTree]() {
106 onDetachFromMainTree(node);
107 };
108 NG::CustomNodeExtModelNG::SetOnDetachFromMainTreeCallback(frameNode, std::move(onDetachFromMainTreeCallback));
109 }
110
SetOnAvoidInfoChangeCallback(const NodeHandle node,void (* onAvoidInfoChange)(NodeHandle node))111 void CustomNode::SetOnAvoidInfoChangeCallback(const NodeHandle node, void (*onAvoidInfoChange)(NodeHandle node))
112 {
113 auto* frameNode = reinterpret_cast<AceNode*>(node);
114 CHECK_NULL_VOID(frameNode);
115
116 auto onAvoidInfoChangeCallback = [node, onAvoidInfoChange]() {
117 onAvoidInfoChange(node);
118 };
119 NG::CustomNodeExtModelNG::SetOnAvoidInfoChangeCallback(frameNode, std::move(onAvoidInfoChangeCallback));
120 }
121
SetIsNeedRegisterAvoidInfoChangeListener(const NodeHandle node,bool isRegister)122 void CustomNode::SetIsNeedRegisterAvoidInfoChangeListener(const NodeHandle node, bool isRegister)
123 {
124 auto* frameNode = reinterpret_cast<AceNode*>(node);
125 CHECK_NULL_VOID(frameNode);
126 NG::CustomNodeExtModelNG::SetIsNeedRegisterAvoidInfoChangeListener(frameNode, isRegister);
127 }
128
SetOnWindowSizeChangedCallback(const NodeHandle node,void (* onWindowSizeChanged)(NodeHandle node,int32_t width,int32_t height,Ace::WindowSizeChangeReason type))129 void CustomNode::SetOnWindowSizeChangedCallback(const NodeHandle node,
130 void (*onWindowSizeChanged)(NodeHandle node, int32_t width, int32_t height, Ace::WindowSizeChangeReason type))
131 {
132 auto* frameNode = reinterpret_cast<AceNode*>(node);
133 CHECK_NULL_VOID(frameNode);
134 auto uiContext = UIContextImpl::Current();
135 CHECK_NULL_VOID(uiContext);
136 uiContext->AddWindowSizeChangeCallback(frameNode->GetId());
137 auto onWindowSizeChangedCallback =
138 [node, onWindowSizeChanged](int32_t width, int32_t height, WindowSizeChangeReason type) {
139 onWindowSizeChanged(node, width, height, type);
140 };
141 NG::CustomNodeExtModelNG::SetOnWindowSizeChangedCallback(frameNode, std::move(onWindowSizeChangedCallback));
142 }
143 } // namespace OHOS::Ace::Kit
144