• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "core/interfaces/native/node/view_model.h"
17 
18 #include <optional>
19 
20 #include "base/log/log_wrapper.h"
21 #include "base/memory/ace_type.h"
22 #include "base/utils/utils.h"
23 #include "core/components_ng/base/frame_node.h"
24 #include "core/components_ng/base/group_node.h"
25 #include "core/components_ng/base/ui_node.h"
26 #include "core/components_ng/pattern/badge/badge_model_ng.h"
27 #include "core/components_ng/pattern/calendar_picker/calendar_picker_model_ng.h"
28 #include "core/components_ng/pattern/common_view/common_view_model_ng.h"
29 #include "core/components_ng/pattern/canvas/canvas_model_ng.h"
30 #include "core/components_ng/pattern/linear_layout/column_model_ng.h"
31 #include "core/components_ng/pattern/linear_layout/row_model_ng.h"
32 #include "core/components_ng/pattern/list/list_model_ng.h"
33 #include "core/components_ng/pattern/list/list_item_model_ng.h"
34 #include "core/components_ng/pattern/list/list_item_group_model_ng.h"
35 #include "core/components_ng/pattern/marquee/marquee_model_ng.h"
36 #include "core/components_ng/pattern/navigation/navigation_model_ng.h"
37 #include "core/components_ng/pattern/picker/datepicker_model_ng.h"
38 #include "core/components_ng/pattern/qrcode/qrcode_model_ng.h"
39 #include "core/components_ng/pattern/scroll/scroll_model_ng.h"
40 #include "core/components_ng/pattern/shape/circle_model_ng.h"
41 #include "core/components_ng/pattern/stack/stack_model_ng.h"
42 #include "core/components_ng/pattern/tabs/tab_content_model_ng.h"
43 #include "core/components_ng/pattern/tabs/tabs_model_ng.h"
44 #include "core/components_ng/pattern/text/span/span_object.h"
45 #include "core/components_ng/pattern/text_clock/text_clock_model_ng.h"
46 #include "core/components_ng/pattern/text_field/text_field_model_ng.h"
47 #include "core/components_ng/pattern/text/image_span_view.h"
48 #include "core/components_ng/pattern/text/text_model_ng.h"
49 #include "core/components_ng/pattern/text/span_model_ng.h"
50 #include "core/components_ng/pattern/symbol/symbol_model_ng.h"
51 #include "core/components_ng/pattern/text_picker/textpicker_model_ng.h"
52 #include "core/components_ng/pattern/texttimer/text_timer_model_ng.h"
53 #include "core/components_ng/pattern/time_picker/timepicker_model_ng.h"
54 #include "core/components_ng/pattern/toggle/toggle_model_ng.h"
55 #include "core/components_ng/pattern/image/image_model_ng.h"
56 #include "core/components_ng/pattern/list/list_model_ng.h"
57 #include "core/components_ng/pattern/loading_progress/loading_progress_model_ng.h"
58 #include "core/components_ng/pattern/swiper/swiper_model_ng.h"
59 #include "core/components_ng/pattern/button/button_model_ng.h"
60 #include "core/components_ng/pattern/progress/progress_model_ng.h"
61 #include "core/components_ng/pattern/checkbox/checkbox_model_ng.h"
62 #include "core/components_ng/pattern/checkboxgroup/checkboxgroup_model_ng.h"
63 #include "core/components_ng/pattern/linear_layout/column_model_ng.h"
64 #include "core/components_ng/pattern/linear_layout/row_model_ng.h"
65 #include "core/components_ng/pattern/flex/flex_model_ng.h"
66 #include "core/components_ng/pattern/refresh/refresh_model_ng.h"
67 #include "core/components_ng/pattern/xcomponent/xcomponent_model_ng.h"
68 #include "core/components_ng/pattern/slider/slider_model_ng.h"
69 #include "core/components_ng/pattern/waterflow/water_flow_model_ng.h"
70 #include "core/components_ng/pattern/waterflow/water_flow_item_model_ng.h"
71 #include "core/components_ng/pattern/relative_container/relative_container_model_ng.h"
72 #include "core/components_ng/pattern/grid/grid_model_ng.h"
73 #include "core/components_ng/pattern/grid/grid_item_model_ng.h"
74 #include "core/components_ng/pattern/grid_col/grid_col_model_ng.h"
75 #include "core/components_ng/pattern/grid_row/grid_row_model_ng.h"
76 #include "core/components_ng/pattern/blank/blank_model_ng.h"
77 #include "core/components_ng/pattern/custom_frame_node/custom_pattern.h"
78 #include "core/components_ng/pattern/divider/divider_model_ng.h"
79 #include "core/components_ng/pattern/indexer/indexer_model_ng.h"
80 #include "core/components_ng/pattern/search/search_model_ng.h"
81 #include "core/components_ng/pattern/radio/radio_model_ng.h"
82 #include "core/components_ng/pattern/image_animator/image_animator_model_ng.h"
83 #include "core/components_ng/pattern/select/select_model_ng.h"
84 #include "core/interfaces/native/node/node_api.h"
85 #include "core/pipeline/base/element_register.h"
86 
87 namespace OHOS::Ace::NG::ViewModel {
88 
89 ArkUIAPICallbackMethod* callbacks = nullptr;
90 
createTextNode(ArkUI_Int32 nodeId)91 void* createTextNode(ArkUI_Int32 nodeId)
92 {
93     auto frameNode = TextModelNG::CreateFrameNode(nodeId, "");
94     CHECK_NULL_RETURN(frameNode, nullptr);
95     frameNode->IncRefCount();
96     return AceType::RawPtr(frameNode);
97 }
98 
createSymbolNode(ArkUI_Int32 nodeId)99 void* createSymbolNode(ArkUI_Int32 nodeId)
100 {
101     auto frameNode = SymbolModelNG::CreateFrameNode(nodeId);
102     CHECK_NULL_RETURN(frameNode, nullptr);
103     frameNode->IncRefCount();
104     return AceType::RawPtr(frameNode);
105 }
106 
createSpanNode(ArkUI_Int32 nodeId)107 void* createSpanNode(ArkUI_Int32 nodeId)
108 {
109     auto spanNode = SpanModelNG::CreateSpanNode(nodeId, "");
110     CHECK_NULL_RETURN(spanNode, nullptr);
111     spanNode->IncRefCount();
112     return AceType::RawPtr(spanNode);
113 }
114 
createImageSpanNode(ArkUI_Int32 nodeId)115 void* createImageSpanNode(ArkUI_Int32 nodeId)
116 {
117     auto imageSpanNode = ImageSpanView::CreateFrameNode(nodeId);
118     CHECK_NULL_RETURN(imageSpanNode, nullptr);
119     imageSpanNode->IncRefCount();
120     return AceType::RawPtr(imageSpanNode);
121 }
122 
createImageNode(ArkUI_Int32 nodeId)123 void* createImageNode(ArkUI_Int32 nodeId)
124 {
125     RefPtr<PixelMap> pixmap = nullptr;
126     auto frameNode = ImageModelNG::CreateFrameNode(nodeId, "", pixmap, "", "", false);
127     CHECK_NULL_RETURN(frameNode, nullptr);
128     frameNode->IncRefCount();
129     return AceType::RawPtr(frameNode);
130 }
131 
createToggleNode(ArkUI_Int32 nodeId)132 void* createToggleNode(ArkUI_Int32 nodeId)
133 {
134     auto frameNode = ToggleModelNG::CreateFrameNode(nodeId, NG::ToggleType::SWITCH, false);
135     CHECK_NULL_RETURN(frameNode, nullptr);
136     frameNode->IncRefCount();
137     return AceType::RawPtr(frameNode);
138 }
139 
createLoadingProgress(ArkUI_Int32 nodeId)140 void* createLoadingProgress(ArkUI_Int32 nodeId)
141 {
142     auto frameNode = LoadingProgressModelNG::CreateFrameNode(nodeId);
143     CHECK_NULL_RETURN(frameNode, nullptr);
144     frameNode->IncRefCount();
145     return AceType::RawPtr(frameNode);
146 }
147 
createTextInputNode(ArkUI_Int32 nodeId)148 void* createTextInputNode(ArkUI_Int32 nodeId)
149 {
150     auto frameNode = TextFieldModelNG::CreateFrameNode(nodeId, "", "", false);
151     CHECK_NULL_RETURN(frameNode, nullptr);
152     frameNode->IncRefCount();
153     return AceType::RawPtr(frameNode);
154 }
155 
createStackNode(ArkUI_Int32 nodeId)156 void* createStackNode(ArkUI_Int32 nodeId)
157 {
158     auto frameNode = StackModelNG::CreateFrameNode(nodeId);
159     CHECK_NULL_RETURN(frameNode, nullptr);
160     frameNode->IncRefCount();
161     return AceType::RawPtr(frameNode);
162 }
163 
createScrollNode(ArkUI_Int32 nodeId)164 void* createScrollNode(ArkUI_Int32 nodeId)
165 {
166     auto frameNode = ScrollModelNG::CreateFrameNode(nodeId);
167     CHECK_NULL_RETURN(frameNode, nullptr);
168     frameNode->IncRefCount();
169     return AceType::RawPtr(frameNode);
170 }
171 
createListNode(ArkUI_Int32 nodeId)172 void* createListNode(ArkUI_Int32 nodeId)
173 {
174     auto frameNode = ListModelNG::CreateFrameNode(nodeId);
175     CHECK_NULL_RETURN(frameNode, nullptr);
176     frameNode->IncRefCount();
177     return AceType::RawPtr(frameNode);
178 }
179 
createSwiperNode(ArkUI_Int32 nodeId)180 void* createSwiperNode(ArkUI_Int32 nodeId)
181 {
182     auto frameNode = SwiperModelNG::CreateFrameNode(nodeId);
183     CHECK_NULL_RETURN(frameNode, nullptr);
184     frameNode->IncRefCount();
185     return AceType::RawPtr(frameNode);
186 }
187 
createTextAreaNode(ArkUI_Int32 nodeId)188 void* createTextAreaNode(ArkUI_Int32 nodeId)
189 {
190     auto frameNode = TextFieldModelNG::CreateFrameNode(nodeId, "", "", true);
191     CHECK_NULL_RETURN(frameNode, nullptr);
192     frameNode->IncRefCount();
193     return AceType::RawPtr(frameNode);
194 }
195 
createButtonNode(ArkUI_Int32 nodeId)196 void* createButtonNode(ArkUI_Int32 nodeId)
197 {
198     auto frameNode = ButtonModelNG::CreateFrameNode(nodeId);
199     CHECK_NULL_RETURN(frameNode, nullptr);
200     frameNode->IncRefCount();
201     return AceType::RawPtr(frameNode);
202 }
203 
createProgressNode(ArkUI_Int32 nodeId)204 void* createProgressNode(ArkUI_Int32 nodeId)
205 {
206     auto frameNode = ProgressModelNG::CreateFrameNode(nodeId, 0, 100, NG::ProgressType::LINEAR);
207     CHECK_NULL_RETURN(frameNode, nullptr);
208     frameNode->IncRefCount();
209     return AceType::RawPtr(frameNode);
210 }
211 
createCheckBoxNode(ArkUI_Int32 nodeId)212 void* createCheckBoxNode(ArkUI_Int32 nodeId)
213 {
214     auto frameNode = CheckBoxModelNG::CreateFrameNode(nodeId);
215     CHECK_NULL_RETURN(frameNode, nullptr);
216     frameNode->IncRefCount();
217     return AceType::RawPtr(frameNode);
218 }
219 
createColumnNode(ArkUI_Int32 nodeId)220 void* createColumnNode(ArkUI_Int32 nodeId)
221 {
222     auto frameNode = ColumnModelNG::CreateFrameNode(nodeId);
223     CHECK_NULL_RETURN(frameNode, nullptr);
224     frameNode->IncRefCount();
225     return AceType::RawPtr(frameNode);
226 }
227 
createRowNode(ArkUI_Int32 nodeId)228 void* createRowNode(ArkUI_Int32 nodeId)
229 {
230     auto frameNode = RowModelNG::CreateFrameNode(nodeId);
231     CHECK_NULL_RETURN(frameNode, nullptr);
232     frameNode->IncRefCount();
233     return AceType::RawPtr(frameNode);
234 }
235 
createFlexNode(ArkUI_Int32 nodeId)236 void* createFlexNode(ArkUI_Int32 nodeId)
237 {
238     auto frameNode = FlexModelNG::CreateFrameNode(nodeId);
239     CHECK_NULL_RETURN(frameNode, nullptr);
240     frameNode->IncRefCount();
241     return AceType::RawPtr(frameNode);
242 }
243 
createListItemNode(ArkUI_Int32 nodeId)244 void* createListItemNode(ArkUI_Int32 nodeId)
245 {
246     auto frameNode = ListItemModelNG::CreateFrameNode(nodeId);
247     CHECK_NULL_RETURN(frameNode, nullptr);
248     frameNode->IncRefCount();
249     return AceType::RawPtr(frameNode);
250 }
251 
createRefreshNode(ArkUI_Int32 nodeId)252 void* createRefreshNode(ArkUI_Int32 nodeId)
253 {
254     auto frameNode = RefreshModelNG::CreateFrameNode(nodeId);
255     CHECK_NULL_RETURN(frameNode, nullptr);
256     frameNode->IncRefCount();
257     return AceType::RawPtr(frameNode);
258 }
259 
createRootNode(ArkUI_Int32 nodeId)260 void* createRootNode(ArkUI_Int32 nodeId)
261 {
262     auto container = Container::Current();
263     CHECK_NULL_RETURN(container, nullptr);
264     RefPtr<PipelineBase> pipeline;
265     pipeline = container->GetPipelineContext();
266     CHECK_NULL_RETURN(pipeline, nullptr);
267     auto context = AceType::DynamicCast<NG::PipelineContext>(pipeline);
268     CHECK_NULL_RETURN(context, nullptr);
269     auto stageManager = context->GetStageManager();
270     CHECK_NULL_RETURN(stageManager, nullptr);
271     auto stageNode = stageManager->GetStageNode();
272     TAG_LOGD(AceLogTag::ACE_NATIVE_NODE, "createRootNode: stageNode %{public}p", AceType::RawPtr(stageNode));
273     return AceType::RawPtr(stageNode);
274 }
275 
createComponentRootNode(ArkUI_Int32 nodeId)276 void* createComponentRootNode(ArkUI_Int32 nodeId)
277 {
278     auto frameNode = CommonViewModelNG::CreateFrameNode(nodeId);
279     CHECK_NULL_RETURN(frameNode, nullptr);
280     frameNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
281     frameNode->IncRefCount();
282     TAG_LOGD(AceLogTag::ACE_NATIVE_NODE, "createComponentRootNode: frameNode %{public}p", AceType::RawPtr(frameNode));
283     return AceType::RawPtr(frameNode);
284 }
285 
286 #ifdef XCOMPONENT_SUPPORTED
createXComponentNode(ArkUI_Int32 nodeId)287 void* createXComponentNode(ArkUI_Int32 nodeId)
288 {
289     auto frameNode = XComponentModelNG::CreateFrameNode(nodeId, "", XComponentType::SURFACE, "");
290     frameNode->IncRefCount();
291     return AceType::RawPtr(frameNode);
292 }
293 
createXComponentNodeWithParams(ArkUI_Int32 nodeId,const ArkUI_Params & params)294 void* createXComponentNodeWithParams(ArkUI_Int32 nodeId, const ArkUI_Params& params)
295 {
296     ArkUI_XComponent_Params* xcParams = (ArkUI_XComponent_Params*)(&params);
297     CHECK_NULL_RETURN(xcParams, nullptr);
298     auto frameNode = XComponentModelNG::CreateTypeNode(nodeId, xcParams);
299     frameNode->IncRefCount();
300     return AceType::RawPtr(frameNode);
301 }
302 #endif
303 
createListItemGroupNode(ArkUI_Int32 nodeId)304 void* createListItemGroupNode(ArkUI_Int32 nodeId)
305 {
306     auto frameNode = ListItemGroupModelNG::CreateFrameNode(nodeId);
307     CHECK_NULL_RETURN(frameNode, nullptr);
308     frameNode->IncRefCount();
309     return AceType::RawPtr(frameNode);
310 }
311 
createSliderNode(ArkUI_Int32 nodeId)312 void* createSliderNode(ArkUI_Int32 nodeId)
313 {
314     auto frameNode = SliderModelNG::CreateFrameNode(nodeId);
315     CHECK_NULL_RETURN(frameNode, nullptr);
316     frameNode->IncRefCount();
317     return AceType::RawPtr(frameNode);
318 }
319 
createCanvasNode(ArkUI_Int32 nodeId)320 void* createCanvasNode(ArkUI_Int32 nodeId)
321 {
322     auto frameNode = CanvasModelNG::CreateFrameNode(nodeId);
323     frameNode->IncRefCount();
324     return AceType::RawPtr(frameNode);
325 }
326 
createDatePickerNode(ArkUI_Int32 nodeId)327 void* createDatePickerNode(ArkUI_Int32 nodeId)
328 {
329     auto frameNode = DatePickerModelNG::CreateFrameNode(nodeId);
330     CHECK_NULL_RETURN(frameNode, nullptr);
331     frameNode->IncRefCount();
332     return AceType::RawPtr(frameNode);
333 }
334 
createTimePickerNode(ArkUI_Int32 nodeId)335 void* createTimePickerNode(ArkUI_Int32 nodeId)
336 {
337     auto frameNode = TimePickerModelNG::CreateFrameNode(nodeId);
338     CHECK_NULL_RETURN(frameNode, nullptr);
339     frameNode->IncRefCount();
340     return AceType::RawPtr(frameNode);
341 }
342 
createTextPickerNode(ArkUI_Int32 nodeId)343 void* createTextPickerNode(ArkUI_Int32 nodeId)
344 {
345     auto frameNode = TextPickerModelNG::CreateFrameNode(nodeId);
346     CHECK_NULL_RETURN(frameNode, nullptr);
347     frameNode->IncRefCount();
348     return AceType::RawPtr(frameNode);
349 }
350 
createCalendarPickerNode(ArkUI_Int32 nodeId)351 void* createCalendarPickerNode(ArkUI_Int32 nodeId)
352 {
353     auto frameNode = CalendarPickerModelNG::CreateFrameNode(nodeId);
354     CHECK_NULL_RETURN(frameNode, nullptr);
355     frameNode->IncRefCount();
356     return AceType::RawPtr(frameNode);
357 }
358 
createCustomNode(ArkUI_Int32 nodeId)359 void* createCustomNode(ArkUI_Int32 nodeId)
360 {
361     auto frameNode = FrameNode::CreateFrameNode("Custom", nodeId, AceType::MakeRefPtr<CustomPattern>());
362     CHECK_NULL_RETURN(frameNode, nullptr);
363     frameNode->IncRefCount();
364     return AceType::RawPtr(frameNode);
365 }
366 
createNavigationNode(ArkUI_Int32 nodeId)367 void* createNavigationNode(ArkUI_Int32 nodeId)
368 {
369     auto frameNode = NavigationModelNG::CreateFrameNode(nodeId);
370     frameNode->IncRefCount();
371     return AceType::RawPtr(frameNode);
372 }
373 
createWaterFlowNode(ArkUI_Int32 nodeId)374 void* createWaterFlowNode(ArkUI_Int32 nodeId)
375 {
376     auto frameNode = WaterFlowModelNG::CreateFrameNode(nodeId);
377     CHECK_NULL_RETURN(frameNode, nullptr);
378     frameNode->IncRefCount();
379     return AceType::RawPtr(frameNode);
380 }
381 
createFlowItemNode(ArkUI_Int32 nodeId)382 void* createFlowItemNode(ArkUI_Int32 nodeId)
383 {
384     auto frameNode = WaterFlowItemModelNG::CreateFrameNode(nodeId);
385     CHECK_NULL_RETURN(frameNode, nullptr);
386     frameNode->IncRefCount();
387     return AceType::RawPtr(frameNode);
388 }
389 
createRelativeContainerNode(ArkUI_Int32 nodeId)390 void* createRelativeContainerNode(ArkUI_Int32 nodeId)
391 {
392     auto frameNode = RelativeContainerModelNG::CreateFrameNode(nodeId);
393     CHECK_NULL_RETURN(frameNode, nullptr);
394     frameNode->IncRefCount();
395     return AceType::RawPtr(frameNode);
396 }
397 
createGridNode(ArkUI_Int32 nodeId)398 void* createGridNode(ArkUI_Int32 nodeId)
399 {
400     auto frameNode = GridModelNG::CreateFrameNode(nodeId);
401     CHECK_NULL_RETURN(frameNode, nullptr);
402     frameNode->IncRefCount();
403     return AceType::RawPtr(frameNode);
404 }
405 
createTabsNode(ArkUI_Int32 nodeId)406 void* createTabsNode(ArkUI_Int32 nodeId)
407 {
408     auto frameNode = TabsModelNG::CreateFrameNode(nodeId);
409     frameNode->IncRefCount();
410     return AceType::RawPtr(frameNode);
411 }
412 
createGridItemNode(ArkUI_Int32 nodeId)413 void* createGridItemNode(ArkUI_Int32 nodeId)
414 {
415     auto frameNode = GridItemModelNG::CreateFrameNode(nodeId);
416     CHECK_NULL_RETURN(frameNode, nullptr);
417     frameNode->IncRefCount();
418     return AceType::RawPtr(frameNode);
419 }
420 
createRadioNode(ArkUI_Int32 nodeId)421 void* createRadioNode(ArkUI_Int32 nodeId)
422 {
423     auto frameNode = RadioModelNG::CreateFrameNode(nodeId);
424     CHECK_NULL_RETURN(frameNode, nullptr);
425     frameNode->IncRefCount();
426     return AceType::RawPtr(frameNode);
427 }
428 
createBlankNode(ArkUI_Int32 nodeId)429 void* createBlankNode(ArkUI_Int32 nodeId)
430 {
431     auto frameNode = BlankModelNG::CreateFrameNode(nodeId);
432     CHECK_NULL_RETURN(frameNode, nullptr);
433     frameNode->IncRefCount();
434     return AceType::RawPtr(frameNode);
435 }
436 
createDividerNode(ArkUI_Int32 nodeId)437 void* createDividerNode(ArkUI_Int32 nodeId)
438 {
439     auto frameNode = DividerModelNG::CreateFrameNode(nodeId);
440     CHECK_NULL_RETURN(frameNode, nullptr);
441     frameNode->IncRefCount();
442     return AceType::RawPtr(frameNode);
443 }
444 
createSearchNode(ArkUI_Int32 nodeId)445 void* createSearchNode(ArkUI_Int32 nodeId)
446 {
447     auto frameNode = SearchModelNG::CreateFrameNode(nodeId);
448     CHECK_NULL_RETURN(frameNode, nullptr);
449     frameNode->IncRefCount();
450     return AceType::RawPtr(frameNode);
451 }
452 
createGridRowNode(ArkUI_Int32 nodeId)453 void* createGridRowNode(ArkUI_Int32 nodeId)
454 {
455     auto frameNode = GridRowModelNG::CreateFrameNode(nodeId);
456     CHECK_NULL_RETURN(frameNode, nullptr);
457     frameNode->IncRefCount();
458     return AceType::RawPtr(frameNode);
459 }
460 
createGridColNode(ArkUI_Int32 nodeId)461 void* createGridColNode(ArkUI_Int32 nodeId)
462 {
463     auto frameNode = GridColModelNG::CreateFrameNode(nodeId);
464     CHECK_NULL_RETURN(frameNode, nullptr);
465     frameNode->IncRefCount();
466     return AceType::RawPtr(frameNode);
467 }
468 
createCircleNode(ArkUI_Int32 nodeId)469 void* createCircleNode(ArkUI_Int32 nodeId)
470 {
471     auto frameNode = CircleModelNG::CreateFrameNode(nodeId);
472     CHECK_NULL_RETURN(frameNode, nullptr);
473     frameNode->IncRefCount();
474     return AceType::RawPtr(frameNode);
475 }
476 
createTabContentNode(ArkUI_Int32 nodeId)477 void* createTabContentNode(ArkUI_Int32 nodeId)
478 {
479     auto frameNode = TabContentModelNG::CreateFrameNode(nodeId);
480     CHECK_NULL_RETURN(frameNode, nullptr);
481     frameNode->IncRefCount();
482     return AceType::RawPtr(frameNode);
483 }
484 
createImageAnimatorNode(ArkUI_Int32 nodeId)485 void* createImageAnimatorNode(ArkUI_Int32 nodeId)
486 {
487     auto frameNode = ImageAnimatorModelNG::CreateFrameNode(nodeId);
488     frameNode->IncRefCount();
489     return AceType::RawPtr(frameNode);
490 }
491 
createAlphabetIndexerNode(ArkUI_Int32 nodeId)492 void* createAlphabetIndexerNode(ArkUI_Int32 nodeId)
493 {
494     auto frameNode = IndexerModelNG::CreateFrameNode(nodeId);
495     frameNode->IncRefCount();
496     return AceType::RawPtr(frameNode);
497 }
498 
createSelectNode(ArkUI_Int32 nodeId)499 void* createSelectNode(ArkUI_Int32 nodeId)
500 {
501     auto frameNode = SelectModelNG::CreateFrameNode(nodeId);
502     frameNode->IncRefCount();
503     return AceType::RawPtr(frameNode);
504 }
505 
createCustomSpanNode(ArkUI_Int32 nodeId)506 void* createCustomSpanNode(ArkUI_Int32 nodeId)
507 {
508     auto customSpanNode = CustomSpanNode::CreateFrameNode(nodeId);
509     CHECK_NULL_RETURN(customSpanNode, nullptr);
510     customSpanNode->IncRefCount();
511     return AceType::RawPtr(customSpanNode);
512 }
513 
createMarqueeNode(ArkUI_Int32 nodeId)514 void* createMarqueeNode(ArkUI_Int32 nodeId)
515 {
516     auto frameNode = MarqueeModelNG::CreateFrameNode(nodeId);
517     CHECK_NULL_RETURN(frameNode, nullptr);
518     frameNode->IncRefCount();
519     return AceType::RawPtr(frameNode);
520 }
521 
createCheckBoxGroupNode(ArkUI_Int32 nodeId)522 void* createCheckBoxGroupNode(ArkUI_Int32 nodeId)
523 {
524     auto frameNode = CheckBoxGroupModelNG::CreateFrameNode(nodeId);
525     CHECK_NULL_RETURN(frameNode, nullptr);
526     frameNode->IncRefCount();
527     return AceType::RawPtr(frameNode);
528 }
529 
createTextClockNode(ArkUI_Int32 nodeId)530 void* createTextClockNode(ArkUI_Int32 nodeId)
531 {
532     auto frameNode = TextClockModelNG::CreateFrameNode(nodeId);
533     CHECK_NULL_RETURN(frameNode, nullptr);
534     frameNode->IncRefCount();
535     return AceType::RawPtr(frameNode);
536 }
537 
createQRcodeNode(ArkUI_Int32 nodeId)538 void* createQRcodeNode(ArkUI_Int32 nodeId)
539 {
540     auto frameNode = QRCodeModelNG::CreateFrameNode(nodeId);
541     CHECK_NULL_RETURN(frameNode, nullptr);
542     frameNode->IncRefCount();
543     return AceType::RawPtr(frameNode);
544 }
545 
createBadgeNode(ArkUI_Int32 nodeId)546 void* createBadgeNode(ArkUI_Int32 nodeId)
547 {
548     auto frameNode = BadgeModelNG::CreateFrameNode(nodeId);
549     CHECK_NULL_RETURN(frameNode, nullptr);
550     frameNode->IncRefCount();
551     return AceType::RawPtr(frameNode);
552 }
553 
createTextTimerNode(ArkUI_Int32 nodeId)554 void* createTextTimerNode(ArkUI_Int32 nodeId)
555 {
556     auto frameNode = TextTimerModelNG::CreateFrameNode(nodeId);
557     CHECK_NULL_RETURN(frameNode, nullptr);
558     frameNode->IncRefCount();
559     return AceType::RawPtr(frameNode);
560 }
561 
562 using createArkUIFrameNode = void*(ArkUI_Int32 nodeId);
563 
564 static createArkUIFrameNode* createArkUIFrameNodes[] = {
565     nullptr,
566     createTextNode,
567     createSpanNode,
568     createImageSpanNode,
569     createImageNode,
570     createToggleNode,
571     createLoadingProgress,
572     createTextInputNode,
573     createStackNode,
574     createScrollNode,
575     createListNode,
576     createSwiperNode,
577     createTextAreaNode,
578     createButtonNode,
579     createProgressNode,
580     createCheckBoxNode,
581     createColumnNode,
582     createRowNode,
583     createFlexNode,
584     createListItemNode,
585     createTabsNode,
586     nullptr,
587     nullptr,
588     createSliderNode,
589     createCanvasNode,
590     createRadioNode, // Radio
591     createGridNode,
592 #ifdef XCOMPONENT_SUPPORTED
593     createXComponentNode,
594 #else
595     nullptr,
596 #endif
597     nullptr,
598     createRefreshNode,
599     createRootNode,
600     createComponentRootNode,
601     createListItemGroupNode,
602     createDatePickerNode,
603     createTimePickerNode,
604     createTextPickerNode,
605     createCalendarPickerNode,
606     createGridItemNode,
607     createCustomNode,
608     createWaterFlowNode,
609     createFlowItemNode,
610     createRelativeContainerNode,
611     createBlankNode,
612     createDividerNode,
613     createSearchNode,
614     createGridRowNode,
615     createGridColNode,
616     createImageAnimatorNode,
617     createCircleNode,
618     createTabContentNode,
619     createAlphabetIndexerNode,
620     createSelectNode,
621     createNavigationNode,
622     createCustomSpanNode,
623     createSymbolNode,
624     createMarqueeNode,
625     createQRcodeNode,
626     createBadgeNode,
627     createTextClockNode,
628     createTextTimerNode,
629     createCheckBoxGroupNode,
630 };
631 
CreateNode(ArkUINodeType tag,ArkUI_Int32 nodeId)632 void* CreateNode(ArkUINodeType tag, ArkUI_Int32 nodeId)
633 {
634     if (tag >= sizeof(createArkUIFrameNodes) / sizeof(createArkUIFrameNode*)) {
635         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to create %{public}d type of node", tag);
636         return nullptr;
637     }
638     CHECK_NULL_RETURN(createArkUIFrameNodes[tag], nullptr);
639     if (nodeId == ARKUI_AUTO_GENERATE_NODE_ID) {
640         nodeId = ElementRegister::GetInstance()->MakeUniqueId();
641     }
642     return createArkUIFrameNodes[tag](nodeId);
643 }
644 
CreateNodeWithParams(ArkUINodeType tag,ArkUI_Int32 nodeId,const ArkUI_Params & params)645 void* CreateNodeWithParams(ArkUINodeType tag, ArkUI_Int32 nodeId, const ArkUI_Params& params)
646 {
647     if (tag >= sizeof(createArkUIFrameNodes) / sizeof(createArkUIFrameNode*)) {
648         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to create %{public}d type of node", tag);
649         return nullptr;
650     }
651     CHECK_NULL_RETURN(createArkUIFrameNodes[tag], nullptr);
652     if (nodeId == ARKUI_AUTO_GENERATE_NODE_ID) {
653         nodeId = ElementRegister::GetInstance()->MakeUniqueId();
654     }
655 #ifdef XCOMPONENT_SUPPORTED
656     if (tag == ArkUINodeType::ARKUI_XCOMPONENT) {
657         return createXComponentNodeWithParams(nodeId, params);
658     }
659 #endif
660     return createArkUIFrameNodes[tag](nodeId);
661 }
662 
GetName(void * nativePtr)663 ArkUI_CharPtr GetName(void* nativePtr)
664 {
665     CHECK_NULL_RETURN(nativePtr, nullptr);
666     auto* frameNode = reinterpret_cast<UINode*>(nativePtr);
667     return frameNode->GetTag().c_str();
668 }
669 
DisposeNode(void * nativePtr)670 void DisposeNode(void* nativePtr)
671 {
672     CHECK_NULL_VOID(nativePtr);
673     auto* uiNode = reinterpret_cast<UINode*>(nativePtr);
674     auto* frameNode = AceType::DynamicCast<FrameNode>(uiNode);
675     if (frameNode) {
676         frameNode->SetExtensionHandler(nullptr);
677     }
678     uiNode->DecRefCount();
679 }
680 
AddChild(void * parentNode,void * childNode)681 void AddChild(void* parentNode, void* childNode)
682 {
683     CHECK_NULL_VOID(parentNode);
684     CHECK_NULL_VOID(childNode);
685     auto* parent = reinterpret_cast<UINode*>(parentNode);
686     auto* child = reinterpret_cast<UINode*>(childNode);
687     parent->AddChild(AceType::Claim(child));
688     auto* frameNode = AceType::DynamicCast<FrameNode>(child);
689     if (frameNode) {
690         frameNode->OnMountToParentDone();
691     }
692 }
693 
RemoveChild(void * parentNode,void * childNode)694 void RemoveChild(void* parentNode, void* childNode)
695 {
696     CHECK_NULL_VOID(parentNode);
697     CHECK_NULL_VOID(childNode);
698     auto* parent = reinterpret_cast<UINode*>(parentNode);
699     auto* child = reinterpret_cast<UINode*>(childNode);
700     child->MarkRemoving();
701     parent->RemoveChild(AceType::Claim(child), true);
702 }
703 
InsertChildAt(void * parentNode,void * childNode,int32_t position)704 void InsertChildAt(void* parentNode, void* childNode, int32_t position)
705 {
706     CHECK_NULL_VOID(parentNode);
707     CHECK_NULL_VOID(childNode);
708     auto* parent = reinterpret_cast<UINode*>(parentNode);
709     auto* child = reinterpret_cast<UINode*>(childNode);
710     parent->AddChild(AceType::Claim(child), position);
711     auto* frameNode = AceType::DynamicCast<FrameNode>(child);
712     if (frameNode) {
713         frameNode->OnMountToParentDone();
714     }
715 }
716 
InsertChildAfter(void * parentNode,void * childNode,void * siblingNode)717 void InsertChildAfter(void* parentNode, void* childNode, void* siblingNode)
718 {
719     CHECK_NULL_VOID(parentNode);
720     CHECK_NULL_VOID(childNode);
721     auto* parent = reinterpret_cast<UINode*>(parentNode);
722     auto* child = reinterpret_cast<UINode*>(childNode);
723 
724     if (AceType::InstanceOf<GroupNode>(parent)) {
725         auto* groupNode = AceType::DynamicCast<GroupNode>(parent);
726         groupNode->AddChildToGroup(AceType::Claim(child));
727         parent->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
728         return;
729     }
730     auto* sibling = reinterpret_cast<UINode*>(siblingNode);
731     if (sibling) {
732         parent->AddChildAfter(AceType::Claim(child), AceType::Claim(sibling));
733     } else {
734         parent->AddChild(AceType::Claim(child));
735     }
736     auto* frameNode = AceType::DynamicCast<FrameNode>(child);
737     if (frameNode) {
738         frameNode->OnMountToParentDone();
739     }
740 }
741 
InsertChildBefore(void * parentNode,void * childNode,void * siblingNode)742 void InsertChildBefore(void* parentNode, void* childNode, void* siblingNode)
743 {
744     CHECK_NULL_VOID(parentNode);
745     CHECK_NULL_VOID(childNode);
746     auto* parent = reinterpret_cast<UINode*>(parentNode);
747     auto* child = reinterpret_cast<UINode*>(childNode);
748 
749     if (AceType::InstanceOf<GroupNode>(parent)) {
750         auto* groupNode = AceType::DynamicCast<GroupNode>(parent);
751         groupNode->AddChildToGroup(AceType::Claim(child));
752         parent->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
753         return;
754     }
755     auto* sibling = reinterpret_cast<UINode*>(siblingNode);
756     if (sibling) {
757         parent->AddChildBefore(AceType::Claim(child), AceType::Claim(sibling));
758     } else {
759         parent->AddChild(AceType::Claim(child));
760     }
761     auto* frameNode = AceType::DynamicCast<FrameNode>(child);
762     if (frameNode) {
763         frameNode->OnMountToParentDone();
764     }
765 }
766 
RegisterCompanion(void * node,int peerId,ArkUI_Int32 flags)767 void RegisterCompanion(void* node, int peerId, ArkUI_Int32 flags)
768 {
769     if (flags == ArkUIAPINodeFlags::NONE) {
770         return;
771     }
772     auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(node));
773     if (frameNode) {
774         // create extension and set to frameNode extension holder.
775         auto companion = AceType::MakeRefPtr<ExtensionCompanionNode>(peerId, flags, node);
776         frameNode->SetExtensionHandler(companion);
777     }
778 }
779 
GetCompanion(void * nodePtr)780 ExtensionCompanionNode* GetCompanion(void* nodePtr)
781 {
782     auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
783     if (frameNode) {
784         return AceType::DynamicCast<ExtensionCompanionNode>(frameNode->GetExtensionHandler());
785     }
786     return nullptr;
787 }
788 
SetCustomCallback(ArkUIVMContext context,void * nodePtr,ArkUI_Int32 callback)789 void SetCustomCallback(ArkUIVMContext context, void* nodePtr, ArkUI_Int32 callback)
790 {
791     auto* node = GetCompanion(nodePtr);
792     CHECK_NULL_VOID(node);
793     node->SetCallbackId(context, callback);
794 }
795 
SetCallbackMethod(ArkUIAPICallbackMethod * method)796 void SetCallbackMethod(ArkUIAPICallbackMethod* method)
797 {
798     callbacks = method;
799 }
800 
GetCallbackMethod()801 ArkUIAPICallbackMethod* GetCallbackMethod()
802 {
803     return callbacks;
804 }
805 
MeasureNode(ArkUIVMContext context,ArkUINodeHandle nodePtr,ArkUI_Float32 * data)806 ArkUI_Int32 MeasureNode(ArkUIVMContext context, ArkUINodeHandle nodePtr, ArkUI_Float32* data)
807 {
808     // call frameNode measure.
809     auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
810     if (frameNode) {
811         std::optional<LayoutConstraintF> constraint = std::make_optional<LayoutConstraintF>();
812         //minWidth
813         constraint->minSize.SetWidth(data[0]);
814         //minHeight
815         constraint->minSize.SetHeight(data[1]);
816         //maxWidth
817         constraint->maxSize.SetWidth(data[2]);
818         //maxHeight
819         constraint->maxSize.SetHeight(data[3]);
820         //minWidth == maxWidth
821         if (data[0] == data[2]) {
822             constraint->selfIdealSize.SetWidth(data[0]);
823         }
824         //minHeight == maxHeight
825         if (data[1] == data[3]) {
826             constraint->selfIdealSize.SetHeight(data[1]);
827         }
828         //percentReferenceWidth
829         constraint->percentReference.SetWidth(data[4]);
830         //percentReferenceHeight
831         constraint->percentReference.SetHeight(data[5]);
832         frameNode->SetActive(true);
833         frameNode->Measure(constraint);
834     }
835     return 0;
836 }
837 
LayoutNode(ArkUIVMContext context,ArkUINodeHandle nodePtr,ArkUI_Float32 (* data)[2])838 ArkUI_Int32 LayoutNode(ArkUIVMContext context, ArkUINodeHandle nodePtr, ArkUI_Float32  (*data)[2])
839 {
840     // call frameNode layout.
841     auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
842     if (frameNode) {
843         frameNode->SetActive(true);
844         frameNode->GetGeometryNode()->SetMarginFrameOffsetX((*data)[0]);
845         frameNode->GetGeometryNode()->SetMarginFrameOffsetY((*data)[1]);
846         frameNode->Layout();
847     }
848     return 0;
849 }
850 
DrawNode(ArkUIVMContext context,ArkUINodeHandle nodePtr,ArkUI_Float32 * data)851 ArkUI_Int32 DrawNode(ArkUIVMContext context, ArkUINodeHandle nodePtr, ArkUI_Float32* data)
852 {
853     // rsnode draw by data, no need to directly call.
854     auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
855     if (frameNode) {
856         frameNode->SetActive(true);
857         auto task = frameNode->CreateRenderTask();
858         if (task) {
859             (*task)();
860         }
861     }
862     return 0;
863 }
864 
SetAttachNodePtr(ArkUINodeHandle nodePtr,void * attachNode)865 void SetAttachNodePtr(ArkUINodeHandle nodePtr, void* attachNode)
866 {
867     auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
868     if (frameNode) {
869         frameNode->SetExternalData(attachNode);
870     }
871 }
872 
GetAttachNodePtr(ArkUINodeHandle nodePtr)873 void* GetAttachNodePtr(ArkUINodeHandle nodePtr)
874 {
875     auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
876     CHECK_NULL_RETURN(frameNode, nullptr);
877     return frameNode->GetExternalData();
878 }
879 
IsBuilderNode(void * nodePtr)880 ArkUI_Bool IsBuilderNode(void* nodePtr)
881 {
882     CHECK_NULL_RETURN(nodePtr, false);
883     auto* node = reinterpret_cast<UINode*>(nodePtr);
884     return static_cast<ArkUI_Int32>(node->GetNodeStatus()) != 0 ;
885 }
886 } // namespace OHOS::Ace::NG::ViewModel
887