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