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*>(¶ms);
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*)(¶ms);
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