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