• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15/// <reference path="./disposable.ts" />
16interface LayoutConstraint {
17  maxSize: Size;
18  minSize: Size;
19  percentReference: Size;
20}
21
22interface CrossLanguageOptions {
23  attributeSetting?: boolean;
24}
25
26interface InteractionEventBindingInfo  {
27  baseEventRegistered?: boolean;
28  nodeEventRegistered?: boolean;
29  nativeEventRegistered?: boolean;
30  builtInEventRegistered?: boolean;
31}
32
33enum ExpandMode {
34  NOT_EXPAND = 0,
35  EXPAND = 1,
36  LAZY_EXPAND = 2,
37}
38
39enum UIState {
40  NORMAL = 0 ,
41  PRESSED = 1 << 0 ,
42  FOCUSED = 1 << 1 ,
43  DISABLED = 1 << 2 ,
44  SELECTED = 1 << 3 ,
45}
46
47declare enum EventQueryType {
48  ON_CLICK = 0,
49}
50
51declare type UIStatesChangeHandler = (node: FrameNode, currentUIStates: number) => void;
52
53class FrameNode extends Disposable {
54  public _nodeId: number;
55  protected _commonAttribute: ArkComponent;
56  protected _commonEvent: UICommonEvent;
57  public _componentAttribute: ArkComponent;
58  public _scrollableEvent: UIScrollableCommonEvent;
59  protected _gestureEvent: UIGestureEvent;
60  protected _childList: Map<number, FrameNode>;
61  protected _nativeRef: NativeStrongRef | NativeWeakRef;
62  protected renderNode_: RenderNode;
63  protected baseNode_: BaseNode;
64  protected builderNode_: JSBuilderNode;
65  protected uiContext_: UIContext | undefined | null;
66  protected nodePtr_: NodePtr;
67  protected instanceId_?: number;
68  private nodeAdapterRef_?: NodeAdapter;
69  constructor(uiContext: UIContext, type: string, options?: object) {
70    super();
71    if (uiContext === undefined) {
72      throw Error('Node constructor error, param uiContext error');
73    } else {
74      if (!(typeof uiContext === "object") || !("instanceId_" in uiContext)) {
75        throw Error(
76          'Node constructor error, param uiContext is invalid'
77        );
78      }
79    }
80    this.instanceId_ = uiContext.instanceId_;
81    this.uiContext_ = uiContext;
82    this._nodeId = -1;
83    this._childList = new Map();
84    if (type === 'BuilderRootFrameNode') {
85      this.renderNode_ = new RenderNode(type);
86      this.renderNode_.setFrameNode(new WeakRef(this));
87      return;
88    }
89    if (type === 'ProxyFrameNode') {
90      return;
91    }
92    let result;
93    __JSScopeUtil__.syncInstanceId(this.instanceId_);
94    if (type === undefined || type === "CustomFrameNode") {
95      this.renderNode_ = new RenderNode('CustomFrameNode');
96      result = getUINativeModule().frameNode.createFrameNode(this);
97    } else {
98      result = getUINativeModule().frameNode.createTypedFrameNode(this, type, options);
99    }
100    __JSScopeUtil__.restoreInstanceId();
101    this._nativeRef = result?.nativeStrongRef;
102    this._nodeId = result?.nodeId;
103    this.nodePtr_ = this._nativeRef?.getNativeHandle();
104    this.renderNode_?.setNodePtr(result?.nativeStrongRef);
105    this.renderNode_?.setFrameNode(new WeakRef(this));
106    if (result === undefined || this._nodeId === -1) {
107      return;
108    }
109    FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.set(this._nodeId, new WeakRef(this));
110    FrameNodeFinalizationRegisterProxy.register(this, this._nodeId);
111
112  }
113  invalidate() {
114    if (this.nodePtr_ === undefined || this.nodePtr_ === null) {
115      return;
116    }
117    getUINativeModule().frameNode.invalidate(this.nodePtr_);
118  }
119  getType(): string {
120    return 'CustomFrameNode';
121  }
122  setRenderNode(nativeRef: NativeStrongRef): void {
123    this.renderNode_?.setNodePtr(nativeRef);
124  }
125  getRenderNode(): RenderNode | null {
126    if (
127      this.renderNode_ !== undefined &&
128      this.renderNode_ !== null &&
129      this.renderNode_.getNodePtr() !== null
130    ) {
131      return this.renderNode_;
132    }
133    return null;
134  }
135  setNodePtr(nativeRef: NativeStrongRef | NativeWeakRef, nodePtr: NodePtr): void {
136    FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.delete(this._nodeId);
137    this._nativeRef = nativeRef;
138    this.nodePtr_ = nodePtr ? nodePtr : this._nativeRef?.getNativeHandle();
139    __JSScopeUtil__.syncInstanceId(this.instanceId_);
140    this._nodeId = getUINativeModule().frameNode.getIdByNodePtr(this.nodePtr_);
141    __JSScopeUtil__.restoreInstanceId();
142    if (this._nodeId === -1) {
143      return;
144    }
145    FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.set(this._nodeId, new WeakRef(this));
146    FrameNodeFinalizationRegisterProxy.register(this, this._nodeId);
147  }
148  resetNodePtr(): void {
149    FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.delete(this._nodeId);
150    this._nodeId = -1;
151    this._nativeRef = null;
152    this.nodePtr_ = null;
153    this.renderNode_?.resetNodePtr();
154  }
155  setBaseNode(baseNode: BaseNode | null): void {
156    this.baseNode_ = baseNode;
157    this.renderNode_?.setBaseNode(baseNode);
158  }
159  setBuilderNode(builderNode: JSBuilderNode | null): void {
160    this.builderNode_ = builderNode;
161  }
162  getBuilderNode(): JSBuilderNode | null {
163    return this.builderNode_ || null;
164  }
165  setAdapterRef(adapter: NodeAdapter | undefined): void {
166    this.nodeAdapterRef_ = adapter;
167  }
168  getNodePtr(): NodePtr | null {
169    return this.nodePtr_;
170  }
171  getValidNodePtr(): NodePtr {
172    const node = this.getNodePtr();
173    if (node === null) {
174      throw Error('The FrameNode has been disposed!');
175    } else {
176      return node;
177    }
178  }
179  dispose(): void {
180    super.dispose();
181    if (this.nodePtr_) {
182      getUINativeModule().frameNode.fireArkUIObjectLifecycleCallback(new WeakRef(this),
183          'FrameNode', this.getNodeType() || 'FrameNode', this.nodePtr_);
184    }
185    this.renderNode_?.dispose();
186    FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.delete(this._nodeId);
187    this._nodeId = -1;
188    this._nativeRef = null;
189    this.nodePtr_ = null;
190  }
191
192  isDisposed(): boolean {
193    return super.isDisposed() && (this._nativeRef === undefined ||
194     this._nativeRef === null || this._nativeRef instanceof NativeWeakRef && this._nativeRef.invalid());
195  }
196
197  static disposeTreeRecursively(node: FrameNode | null): void {
198    if (node === null) {
199      return;
200    }
201    let child = node.getFirstChildWithoutExpand();
202    FrameNode.disposeTreeRecursively(child);
203    let sibling = node.getNextSiblingWithoutExpand();
204    FrameNode.disposeTreeRecursively(sibling);
205    node.dispose();
206  }
207
208  disposeTree(): void {
209    let parent = this.getParent();
210    if (parent?.getNodeType() === "NodeContainer") {
211      getUINativeModule().nodeContainer.clean(parent?.getNodePtr());
212    } else {
213      parent?.removeChild(this);
214    }
215    FrameNode.disposeTreeRecursively(this);
216  }
217
218  checkType(): void {
219    if (!this.isModifiable()) {
220      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
221    }
222  }
223  isModifiable(): boolean {
224    return this._nativeRef !== undefined && this._nativeRef !== null;
225  }
226
227  convertToFrameNode(nodePtr: NodePtr, nodeId: number = -1): FrameNode | null {
228    if (nodeId === -1) {
229      __JSScopeUtil__.syncInstanceId(this.instanceId_);
230      nodeId = getUINativeModule().frameNode.getIdByNodePtr(nodePtr);
231      __JSScopeUtil__.restoreInstanceId();
232    }
233    if (FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.has(nodeId)) {
234      let frameNode = FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.get(nodeId).deref();
235      if (frameNode) {
236        return frameNode;
237      }
238    }
239    if (nodeId !== -1 && !getUINativeModule().frameNode.isModifiable(nodePtr)) {
240      __JSScopeUtil__.syncInstanceId(this.instanceId_);
241      let frameNode = new ProxyFrameNode(this.uiContext_);
242      let node = getUINativeModule().nativeUtils.createNativeWeakRef(nodePtr);
243      __JSScopeUtil__.restoreInstanceId();
244      frameNode.setNodePtr(node);
245      frameNode._nodeId = nodeId;
246      FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.set(frameNode._nodeId, new WeakRef(frameNode));
247      FrameNodeFinalizationRegisterProxy.register(frameNode, frameNode._nodeId);
248      return frameNode;
249    }
250    return null;
251  }
252
253  checkValid(node?: FrameNode): boolean {
254    return true;
255  }
256
257  appendChild(node: FrameNode): void {
258    if (node === undefined || node === null) {
259      return;
260    }
261    if (node.getType() === 'ProxyFrameNode' || !this.checkValid(node)) {
262      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
263    }
264    __JSScopeUtil__.syncInstanceId(this.instanceId_);
265    let flag = getUINativeModule().frameNode.appendChild(this.nodePtr_, node.nodePtr_);
266    getUINativeModule().frameNode.addBuilderNode(this.nodePtr_, node.nodePtr_);
267    __JSScopeUtil__.restoreInstanceId();
268    if (!flag) {
269      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
270    }
271    this._childList.set(node._nodeId, node);
272  }
273
274  addComponentContent(content: ComponentContent): void {
275    if (content === undefined || content === null || content.getNodePtr() === null || content.getNodePtr() == undefined) {
276      return;
277    }
278    if (!this.checkValid() || !this.isModifiable()) {
279      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
280    }
281    __JSScopeUtil__.syncInstanceId(this.instanceId_);
282    let flag = getUINativeModule().frameNode.appendChild(this.nodePtr_, content.getNodeWithoutProxy());
283    getUINativeModule().frameNode.addBuilderNode(this.nodePtr_, content.getNodePtr());
284    __JSScopeUtil__.restoreInstanceId();
285    if (!flag) {
286      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
287    } else {
288      content.setAttachedParent(new WeakRef<FrameNode>(this));
289    }
290  }
291
292  removeComponentContent(content: ComponentContent): void {
293    if (content === undefined || content === null || content.getNodePtr() === null || content.getNodePtr() === undefined) {
294      return;
295    }
296    __JSScopeUtil__.syncInstanceId(this.instanceId_);
297    getUINativeModule().frameNode.removeBuilderNode(this.nodePtr_, content.getNodePtr());
298    getUINativeModule().frameNode.removeChild(this.nodePtr_, content.getNodePtr());
299    content.setAttachedParent(undefined);
300    __JSScopeUtil__.restoreInstanceId();
301  }
302
303  insertChildAfter(child: FrameNode, sibling: FrameNode): void {
304    if (child === undefined || child === null) {
305      return;
306    }
307    if (child.getType() === 'ProxyFrameNode' || !this.checkValid(child)) {
308      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
309    }
310    let flag = true;
311    __JSScopeUtil__.syncInstanceId(this.instanceId_);
312    if (sibling === undefined || sibling === null) {
313      flag = getUINativeModule().frameNode.insertChildAfter(this.nodePtr_, child.nodePtr_, null);
314    } else {
315      flag = getUINativeModule().frameNode.insertChildAfter(this.nodePtr_, child.nodePtr_, sibling.getNodePtr());
316    }
317    getUINativeModule().frameNode.addBuilderNode(this.nodePtr_, child.nodePtr_);
318    __JSScopeUtil__.restoreInstanceId();
319    if (!flag) {
320      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
321    }
322    this._childList.set(child._nodeId, child);
323  }
324
325  removeChild(node: FrameNode): void {
326    if (node === undefined || node === null) {
327      return;
328    }
329    __JSScopeUtil__.syncInstanceId(this.instanceId_);
330    getUINativeModule().frameNode.removeBuilderNode(this.nodePtr_, node.nodePtr_);
331    getUINativeModule().frameNode.removeChild(this.nodePtr_, node.nodePtr_);
332    __JSScopeUtil__.restoreInstanceId();
333    this._childList.delete(node._nodeId);
334  }
335
336  clearChildren(): void {
337    __JSScopeUtil__.syncInstanceId(this.instanceId_);
338    getUINativeModule().frameNode.clearBuilderNode(this.nodePtr_);
339    getUINativeModule().frameNode.clearChildren(this.nodePtr_);
340    __JSScopeUtil__.restoreInstanceId();
341    this._childList.clear();
342  }
343
344  moveTo(targetParent: FrameNode, index?: number): void {
345    if (targetParent === undefined || targetParent === null) {
346      return;
347    }
348    if (index === undefined || index === null) {
349      index = -1;
350    }
351    const oldParent = this.getParent();
352    if (oldParent && !oldParent.isModifiable() || !targetParent.isModifiable() || !targetParent.checkValid(this)) {
353      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
354    }
355    __JSScopeUtil__.syncInstanceId(this.instanceId_);
356    getUINativeModule().frameNode.moveTo(this.nodePtr_, targetParent.nodePtr_, index);
357    __JSScopeUtil__.restoreInstanceId();
358    if (oldParent) {
359      oldParent._childList.delete(this._nodeId);
360    }
361    targetParent._childList.set(this._nodeId, this);
362  }
363
364  getChild(index: number, expandMode?: ExpandMode): FrameNode | null {
365    const result = getUINativeModule().frameNode.getChild(this.getNodePtr(), index, expandMode);
366    const nodeId = result?.nodeId;
367    if (nodeId === undefined || nodeId === -1) {
368      return null;
369    }
370    return this.convertToFrameNode(result.nodePtr, result.nodeId);
371  }
372
373  getFirstChildIndexWithoutExpand(): number {
374    return getUINativeModule().frameNode.getFirstChildIndexWithoutExpand(this.getNodePtr());
375  }
376
377  getLastChildIndexWithoutExpand(): number {
378    return getUINativeModule().frameNode.getLastChildIndexWithoutExpand(this.getNodePtr());
379  }
380
381  getFirstChild(isExpanded?: boolean): FrameNode | null {
382    const result = getUINativeModule().frameNode.getFirst(this.getNodePtr(), isExpanded);
383    const nodeId = result?.nodeId;
384    if (nodeId === undefined || nodeId === -1) {
385      return null;
386    }
387    return this.convertToFrameNode(result.nodePtr, result.nodeId);
388  }
389
390  getFirstChildWithoutExpand(): FrameNode | null {
391    const result = getUINativeModule().frameNode.getFirst(this.getNodePtr(), false);
392    const nodeId = result?.nodeId;
393    if (nodeId === undefined || nodeId === -1) {
394      return null;
395    }
396    return this.convertToFrameNode(result.nodePtr, result.nodeId);
397  }
398
399  getNextSibling(isExpanded?: boolean): FrameNode | null {
400    const result = getUINativeModule().frameNode.getNextSibling(this.getNodePtr(), isExpanded);
401    const nodeId = result?.nodeId;
402    if (nodeId === undefined || nodeId === -1) {
403      return null;
404    }
405    return this.convertToFrameNode(result.nodePtr, result.nodeId);
406  }
407
408  getNextSiblingWithoutExpand(): FrameNode | null {
409    const result = getUINativeModule().frameNode.getNextSibling(this.getNodePtr(), false);
410    const nodeId = result?.nodeId;
411    if (nodeId === undefined || nodeId === -1) {
412      return null;
413    }
414    return this.convertToFrameNode(result.nodePtr, result.nodeId);
415  }
416
417  getPreviousSibling(isExpanded?: boolean): FrameNode | null {
418    const result = getUINativeModule().frameNode.getPreviousSibling(this.getNodePtr(), isExpanded);
419    const nodeId = result?.nodeId;
420    if (nodeId === undefined || nodeId === -1) {
421      return null;
422    }
423    return this.convertToFrameNode(result.nodePtr, result.nodeId);
424  }
425
426  getParent(): FrameNode | null {
427    __JSScopeUtil__.syncInstanceId(this.instanceId_);
428    const result = getUINativeModule().frameNode.getParent(this.getNodePtr());
429    const nodeId = result?.nodeId;
430    __JSScopeUtil__.restoreInstanceId();
431    if (nodeId === undefined || nodeId === -1) {
432      return null;
433    }
434    return this.convertToFrameNode(result.nodePtr, result.nodeId);
435  }
436
437  getChildrenCount(isExpanded?: boolean): number {
438    __JSScopeUtil__.syncInstanceId(this.instanceId_);
439    const childrenCount = getUINativeModule().frameNode.getChildrenCount(this.nodePtr_, isExpanded);
440    __JSScopeUtil__.restoreInstanceId();
441    return childrenCount;
442  }
443
444  getPositionToParent(): Position {
445    const position = getUINativeModule().frameNode.getPositionToParent(this.getNodePtr());
446    return { x: position[0], y: position[1] };
447  }
448
449  getPositionToScreen(): Position {
450    const position = getUINativeModule().frameNode.getPositionToScreen(this.getNodePtr());
451    return { x: position[0], y: position[1] };
452  }
453
454  getPositionToWindow(): Position {
455    const position = getUINativeModule().frameNode.getPositionToWindow(this.getNodePtr());
456    return { x: position[0], y: position[1] };
457  }
458
459  getGlobalPositionOnDisplay(): Position {
460    const position = getUINativeModule().frameNode.getGlobalPositionOnDisplay(this.getNodePtr());
461    return { x: position[0], y: position[1] };
462  }
463
464  getPositionToParentWithTransform(): Position {
465    const position = getUINativeModule().frameNode.getPositionToParentWithTransform(this.getNodePtr());
466    return { x: position[0], y: position[1] };
467  }
468
469  getPositionToScreenWithTransform(): Position {
470    const position = getUINativeModule().frameNode.getPositionToScreenWithTransform(this.getNodePtr());
471    return { x: position[0], y: position[1] };
472  }
473
474  getPositionToWindowWithTransform(): Position {
475    const position = getUINativeModule().frameNode.getPositionToWindowWithTransform(this.getNodePtr());
476    return { x: position[0], y: position[1] };
477  }
478
479  getMeasuredSize(): Size {
480    const size = getUINativeModule().frameNode.getMeasuredSize(this.getValidNodePtr());
481    return { width: size[0], height: size[1] };
482  }
483
484  getLayoutPosition(): Position {
485    const position = getUINativeModule().frameNode.getLayoutPosition(this.getValidNodePtr());
486    return { x: position[0], y: position[1] };
487  }
488
489  getUserConfigBorderWidth(): EdgesT<LengthMetrics> {
490    const borderWidth = getUINativeModule().frameNode.getConfigBorderWidth(this.getNodePtr());
491    return {
492      top: new LengthMetrics(borderWidth[0], borderWidth[1]),
493      right: new LengthMetrics(borderWidth[2], borderWidth[3]),
494      bottom: new LengthMetrics(borderWidth[4], borderWidth[5]),
495      left: new LengthMetrics(borderWidth[6], borderWidth[7])
496    };
497  }
498
499  getUserConfigPadding(): EdgesT<LengthMetrics> {
500    const borderWidth = getUINativeModule().frameNode.getConfigPadding(this.getNodePtr());
501    return {
502      top: new LengthMetrics(borderWidth[0], borderWidth[1]),
503      right: new LengthMetrics(borderWidth[2], borderWidth[3]),
504      bottom: new LengthMetrics(borderWidth[4], borderWidth[5]),
505      left: new LengthMetrics(borderWidth[6], borderWidth[7])
506    };
507  }
508
509  getUserConfigMargin(): EdgesT<LengthMetrics> {
510    const margin = getUINativeModule().frameNode.getConfigMargin(this.getNodePtr());
511    return {
512      top: new LengthMetrics(margin[0], margin[1]),
513      right: new LengthMetrics(margin[2], margin[3]),
514      bottom: new LengthMetrics(margin[4], margin[5]),
515      left: new LengthMetrics(margin[6], margin[7])
516    };
517  }
518
519  getUserConfigSize(): SizeT<LengthMetrics> {
520    const size = getUINativeModule().frameNode.getConfigSize(this.getNodePtr());
521    return {
522      width: new LengthMetrics(size[0], size[1]),
523      height: new LengthMetrics(size[2], size[3])
524    };
525  }
526
527  getId(): string {
528    return getUINativeModule().frameNode.getId(this.getNodePtr());
529  }
530
531  getUniqueId(): number {
532    return getUINativeModule().frameNode.getIdByNodePtr(this.getNodePtr());
533  }
534
535  getNodeType(): string {
536    return getUINativeModule().frameNode.getNodeType(this.getNodePtr());
537  }
538
539  getOpacity(): number {
540    return getUINativeModule().frameNode.getOpacity(this.getNodePtr());
541  }
542
543  isVisible(): boolean {
544    return getUINativeModule().frameNode.isVisible(this.getNodePtr());
545  }
546
547  isClipToFrame(): boolean {
548    return getUINativeModule().frameNode.isClipToFrame(this.getNodePtr());
549  }
550
551  isAttached(): boolean {
552    return getUINativeModule().frameNode.isAttached(this.getNodePtr());
553  }
554
555  getInspectorInfo(): Object {
556    __JSScopeUtil__.syncInstanceId(this.instanceId_);
557    const inspectorInfoStr = getUINativeModule().frameNode.getInspectorInfo(this.getNodePtr());
558    __JSScopeUtil__.restoreInstanceId();
559    const inspectorInfo = JSON.parse(inspectorInfoStr);
560    return inspectorInfo;
561  }
562
563  getCustomProperty(key: string): Object | undefined {
564    if (key === undefined) {
565      return undefined;
566    }
567    let value = __getCustomProperty__(this._nodeId, key);
568    if (value === undefined) {
569      const valueStr = getUINativeModule().frameNode.getCustomPropertyCapiByKey(this.getNodePtr(), key);
570      value = valueStr === undefined ? undefined : valueStr;
571    }
572    return value;
573  }
574
575  setMeasuredSize(size: Size): void {
576    getUINativeModule().frameNode.setMeasuredSize(this.getNodePtr(), Math.max(size.width, 0),
577      Math.max(size.height, 0));
578  }
579
580  setLayoutPosition(position: Position): void {
581    getUINativeModule().frameNode.setLayoutPosition(this.getNodePtr(), position.x, position.y);
582  }
583
584  measure(constraint: LayoutConstraint): void {
585    const minSize: Size = constraint.minSize;
586    const maxSize: Size = constraint.maxSize;
587    const percentReference: Size = constraint.percentReference;
588    __JSScopeUtil__.syncInstanceId(this.instanceId_);
589    getUINativeModule().frameNode.measureNode(this.getNodePtr(), minSize.width, minSize.height, maxSize.width,
590      maxSize.height, percentReference.width, percentReference.height);
591    __JSScopeUtil__.restoreInstanceId();
592  }
593
594  layout(position: Position): void {
595    __JSScopeUtil__.syncInstanceId(this.instanceId_);
596    getUINativeModule().frameNode.layoutNode(this.getNodePtr(), position.x, position.y);
597    __JSScopeUtil__.restoreInstanceId();
598  }
599
600  setNeedsLayout(): void {
601    getUINativeModule().frameNode.setNeedsLayout(this.getNodePtr());
602  }
603
604  setCrossLanguageOptions(options: CrossLanguageOptions): void {
605    if (!this.isModifiable()) {
606      throw { message: 'The FrameNode cannot be set whether to support cross-language common attribute setting.', code: 100022 };
607    }
608    __JSScopeUtil__.syncInstanceId(this.instanceId_);
609    const result = getUINativeModule().frameNode.setCrossLanguageOptions(this.getNodePtr(), options.attributeSetting ?? false);
610    __JSScopeUtil__.restoreInstanceId();
611    if (result !== 0) {
612      throw { message: 'The FrameNode cannot be set whether to support cross-language common attribute setting.', code: 100022 };
613    }
614  }
615
616  getCrossLanguageOptions(): CrossLanguageOptions {
617    __JSScopeUtil__.syncInstanceId(this.instanceId_);
618    const attributeSetting = getUINativeModule().frameNode.getCrossLanguageOptions(this.getNodePtr());
619    __JSScopeUtil__.restoreInstanceId();
620    return { attributeSetting: attributeSetting ?? false };
621  }
622
623  checkIfCanCrossLanguageAttributeSetting(): boolean {
624    return this.isModifiable() || getUINativeModule().frameNode.checkIfCanCrossLanguageAttributeSetting(this.getNodePtr());
625  }
626
627  getInteractionEventBindingInfo(eventType: EventQueryType): InteractionEventBindingInfo {
628    if (eventType === undefined || eventType === null) {
629      return undefined;
630    }
631    __JSScopeUtil__.syncInstanceId(this.instanceId_);
632    const eventBindingInfo = getUINativeModule().frameNode.getInteractionEventBindingInfo(this.getNodePtr(), eventType);
633    __JSScopeUtil__.restoreInstanceId();
634    if (!eventBindingInfo || (!eventBindingInfo.baseEventRegistered && !eventBindingInfo.nodeEventRegistered &&
635      !eventBindingInfo.nativeEventRegistered && !eventBindingInfo.builtInEventRegistered)) {
636      return undefined;
637    }
638    return {
639      baseEventRegistered: eventBindingInfo.baseEventRegistered,
640      nodeEventRegistered: eventBindingInfo.nodeEventRegistered,
641      nativeEventRegistered: eventBindingInfo.nativeEventRegistered,
642      builtInEventRegistered: eventBindingInfo.builtInEventRegistered,
643    };
644  }
645
646  get commonAttribute(): ArkComponent {
647    if (this._commonAttribute === undefined) {
648      this._commonAttribute = new ArkComponent(this.nodePtr_, ModifierType.FRAME_NODE);
649    }
650    this._commonAttribute.setNodePtr(this.nodePtr_);
651    this._commonAttribute.setInstanceId((this.uiContext_ === undefined || this.uiContext_ === null) ? -1 : this.uiContext_.instanceId_);
652    return this._commonAttribute;
653  }
654
655  get commonEvent(): UICommonEvent {
656    let node = this.getNodePtr();
657    if (this._commonEvent === undefined) {
658      this._commonEvent = new UICommonEvent(node);
659    }
660    this._commonEvent.setNodePtr(node);
661    this._commonEvent.setInstanceId((this.uiContext_ === undefined || this.uiContext_ === null) ? -1 : this.uiContext_.instanceId_);
662    return this._commonEvent;
663  }
664
665  get gestureEvent(): UIGestureEvent {
666    if (this._gestureEvent === undefined) {
667        this._gestureEvent = new UIGestureEvent();
668        this._gestureEvent.setNodePtr(this.nodePtr_);
669        let weakPtr = getUINativeModule().nativeUtils.createNativeWeakRef(this.nodePtr_);
670        this._gestureEvent.setWeakNodePtr(weakPtr);
671        __JSScopeUtil__.syncInstanceId(this.instanceId_);
672        this._gestureEvent.registerFrameNodeDeletedCallback(this.nodePtr_);
673        __JSScopeUtil__.restoreInstanceId();
674    }
675    return this._gestureEvent;
676  }
677  updateInstance(uiContext: UIContext): void {
678    this.uiContext_ = uiContext;
679    this.instanceId_ = uiContext.instanceId_;
680  }
681  createAnimation(property: AnimationPropertyType, startValue: number[] | undefined, endValue: number[], param: AnimateParam): boolean {
682    __JSScopeUtil__.syncInstanceId(this.instanceId_);
683    let result = getUINativeModule().frameNode.createAnimation(this.getNodePtr(), property, startValue, endValue, param);
684    __JSScopeUtil__.restoreInstanceId();
685    return result;
686  }
687  cancelAnimations(properties: AnimationPropertyType[]): boolean {
688    __JSScopeUtil__.syncInstanceId(this.instanceId_);
689    let result = getUINativeModule().frameNode.cancelAnimations(this.getNodePtr(), properties);
690    __JSScopeUtil__.restoreInstanceId();
691    return result;
692  }
693  getNodePropertyValue(property: AnimationPropertyType): number[] {
694    return getUINativeModule().frameNode.getNodePropertyValue(this.getNodePtr(), property);
695  }
696  triggerOnReuse(): void {
697    getUINativeModule().frameNode.triggerOnReuse(this.getNodePtr());
698  }
699  triggerOnRecycle(): void {
700    getUINativeModule().frameNode.triggerOnRecycle(this.getNodePtr());
701  }
702  reuse(): void {
703    this.triggerOnReuse();
704  }
705  recycle(): void {
706    this.triggerOnRecycle();
707  }
708  addSupportedUIStates(uistates: number, statesChangeHandler: UIStatesChangeHandler, excludeInner?: boolean): void {
709    __JSScopeUtil__.syncInstanceId(this.instanceId_);
710    getUINativeModule().frameNode.addSupportedStates(this.getNodePtr(), uistates, (currentUIStates: number)=>{
711      statesChangeHandler(this, currentUIStates);
712    }, excludeInner);
713    __JSScopeUtil__.restoreInstanceId();
714  }
715  removeSupportedUIStates(uiStates: number): void {
716    __JSScopeUtil__.syncInstanceId(this.instanceId_);
717    getUINativeModule().frameNode.removeSupportedStates(this.getNodePtr(), uiStates);
718    __JSScopeUtil__.restoreInstanceId();
719  }
720}
721
722class ImmutableFrameNode extends FrameNode {
723  isModifiable(): boolean {
724    return false;
725  }
726  invalidate() {
727    return;
728  }
729  appendChild(node: FrameNode): void {
730    throw { message: 'The FrameNode is not modifiable.', code: 100021 };
731  }
732  insertChildAfter(child: FrameNode, sibling: FrameNode): void {
733    throw { message: 'The FrameNode is not modifiable.', code: 100021 };
734  }
735  removeChild(node: FrameNode): void {
736    throw { message: 'The FrameNode is not modifiable.', code: 100021 };
737  }
738  clearChildren(): void {
739    throw { message: 'The FrameNode is not modifiable.', code: 100021 };
740  }
741  get commonAttribute(): ArkComponent {
742    if (this._commonAttribute === undefined) {
743      this._commonAttribute = new ArkComponent(undefined, ModifierType.FRAME_NODE);
744    }
745    this._commonAttribute.setNodePtr(undefined);
746    return this._commonAttribute;
747  }
748  createAnimation(property: AnimationPropertyType, startValue: number[] | undefined, endValue: number[], param: AnimateParam): boolean {
749    JSXNodeLogConsole.warn("can't create animation on unmodifiable frameNode");
750    return false;
751  }
752  cancelAnimations(properties: AnimationPropertyType[]): boolean {
753    JSXNodeLogConsole.warn("can't cancel animation on unmodifiable frameNode");
754    return false;
755  }
756}
757
758class BuilderRootFrameNode extends ImmutableFrameNode {
759  constructor(uiContext: UIContext, type: string = 'BuilderRootFrameNode') {
760    super(uiContext, type);
761  }
762  getType(): string {
763    return 'BuilderRootFrameNode';
764  }
765}
766
767class ProxyFrameNode extends ImmutableFrameNode {
768  _nativeRef: NativeWeakRef;
769
770  constructor(uiContext: UIContext, type: string = 'ProxyFrameNode') {
771    super(uiContext, type);
772  }
773
774  setNodePtr(nativeRef: NativeWeakRef) {
775    this._nativeRef = nativeRef;
776    this.nodePtr_ = this._nativeRef.getNativeHandle();
777  }
778  getType(): string {
779    return 'ProxyFrameNode';
780  }
781  getRenderNode(): RenderNode | null {
782    return null;
783  }
784  getNodePtr(): NodePtr | null {
785    if (this._nativeRef === undefined || this._nativeRef === null || this._nativeRef.invalid()) {
786      return null;
787    }
788    return this.nodePtr_;
789  }
790  dispose(): void {
791    this.isDisposed_ = true;
792    this.renderNode_?.dispose();
793    FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.delete(this._nodeId);
794    this._nodeId = -1;
795    this._nativeRef = undefined;
796    this.nodePtr_ = undefined;
797  }
798  moveTo(targetParent: FrameNode, index?: number): void {
799    throw { message: 'The FrameNode is not modifiable.', code: 100021 };
800  }
801}
802
803class FrameNodeUtils {
804  static searchNodeInRegisterProxy(nodePtr: NodePtr): FrameNode | null {
805    let nodeId = getUINativeModule().frameNode.getIdByNodePtr(nodePtr);
806    if (nodeId === -1) {
807      return null;
808    }
809    if (FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.has(nodeId)) {
810      let frameNode = FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.get(nodeId).deref();
811      return frameNode === undefined ? null : frameNode;
812    }
813    return null;
814  }
815
816  static createFrameNode(uiContext: UIContext, nodePtr: NodePtr): FrameNode | null {
817    let nodeId = getUINativeModule().frameNode.getIdByNodePtr(nodePtr);
818    if (nodeId !== -1 && !getUINativeModule().frameNode.isModifiable(nodePtr)) {
819      let frameNode = new ProxyFrameNode(uiContext);
820      let node = getUINativeModule().nativeUtils.createNativeWeakRef(nodePtr);
821      frameNode.setNodePtr(node);
822      frameNode._nodeId = nodeId;
823      FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.set(nodeId, new WeakRef(frameNode));
824      FrameNodeFinalizationRegisterProxy.register(frameNode, nodeId);
825      return frameNode;
826    }
827    return null;
828  }
829}
830
831class TypedFrameNode<T extends ArkComponent> extends FrameNode {
832  attribute_: T;
833  attrCreator_: (node: NodePtr, type: ModifierType) => T
834
835  constructor(uiContext: UIContext, type: string, attrCreator: (node: NodePtr, type: ModifierType) => T, options?: object) {
836    super(uiContext, type, options);
837    this.attrCreator_ = attrCreator;
838  }
839
840  dispose() {
841    this.isDisposed_ = true;
842    if (this.nodePtr_) {
843      getUINativeModule().frameNode.fireArkUIObjectLifecycleCallback(new WeakRef(this), 'FrameNode', this.getNodeType() || 'FrameNode', this.nodePtr_);
844    }
845    FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.delete(this._nodeId);
846    this._nodeId = -1;
847    this._nativeRef?.dispose();
848    this._nativeRef = null;
849    this.nodePtr_ = null;
850  }
851
852  initialize(...args: Object[]): T {
853    return this.attribute.initialize(args);
854  }
855
856  get attribute(): T {
857    if (this.attribute_ === undefined) {
858      this.attribute_ = this.attrCreator_(this.nodePtr_, ModifierType.FRAME_NODE);
859    }
860    this.attribute_.setNodePtr(this.nodePtr_);
861    this.attribute_.setInstanceId((this.uiContext_ === undefined || this.uiContext_ === null) ? -1 : this.uiContext_.instanceId_);
862    return this.attribute_;
863  }
864
865  checkValid(node?: FrameNode): boolean {
866    if (this.attribute_ === undefined) {
867      this.attribute_ = this.attrCreator_(this.nodePtr_, ModifierType.FRAME_NODE);
868    }
869
870    if (this.attribute_.allowChildCount !== undefined) {
871      const allowCount = this.attribute_.allowChildCount();
872      if (this.getChildrenCount() >= allowCount) {
873        return false;
874      }
875    }
876
877    if (this.attribute_.allowChildTypes !== undefined && node !== undefined) {
878      const childType = node.getNodeType();
879      const allowTypes = this.attribute_.allowChildTypes();
880      let isValid = false;
881      allowTypes.forEach((nodeType: string) => {
882        if (nodeType === childType) {
883          isValid = true;
884        }
885      });
886      return isValid;
887    }
888    return true;
889  }
890}
891
892const __creatorMap__ = new Map<string, (context: UIContext, options?: object) => FrameNode>(
893  [
894    ['Text', (context: UIContext): FrameNode=> {
895      return new TypedFrameNode(context, 'Text', (node: NodePtr, type: ModifierType): ArkTextComponent => {
896        return new ArkTextComponent(node, type);
897      })
898    }],
899    ['Column', (context: UIContext): FrameNode=> {
900      return new TypedFrameNode(context, 'Column', (node: NodePtr, type: ModifierType): ArkColumnComponent => {
901        return new ArkColumnComponent(node, type);
902      })
903    }],
904    ['Row', (context: UIContext): FrameNode=> {
905      return new TypedFrameNode(context, 'Row', (node: NodePtr, type: ModifierType): ArkRowComponent => {
906        return new ArkRowComponent(node, type);
907      })
908    }],
909    ['Stack', (context: UIContext): FrameNode=> {
910      return new TypedFrameNode(context, 'Stack', (node: NodePtr, type: ModifierType): ArkStackComponent => {
911        return new ArkStackComponent(node, type);
912      })
913    }],
914    ['GridRow', (context: UIContext): FrameNode=> {
915      let node = new TypedFrameNode(context, 'GridRow', (node: NodePtr, type: ModifierType): ArkGridRowComponent => {
916        return new ArkGridRowComponent(node, type);
917      });
918      node.initialize();
919      return node;
920    }],
921    ['TextInput', (context: UIContext): FrameNode=> {
922      return new TypedFrameNode(context, 'TextInput', (node: NodePtr, type: ModifierType): ArkTextInputComponent => {
923        return new ArkTextInputComponent(node, type);
924      })
925    }],
926    ['GridCol', (context: UIContext): FrameNode=> {
927      let node = new TypedFrameNode(context, 'GridCol', (node: NodePtr, type: ModifierType): ArkGridColComponent => {
928        return new ArkGridColComponent(node, type);
929      });
930      node.initialize();
931      return node;
932    }],
933    ['Blank', (context: UIContext): FrameNode=> {
934      return new TypedFrameNode(context, 'Blank', (node: NodePtr, type: ModifierType): ArkBlankComponent => {
935        return new ArkBlankComponent(node, type);
936      })
937    }],
938    ['Image', (context: UIContext): FrameNode=> {
939      return new TypedFrameNode(context, 'Image', (node: NodePtr, type: ModifierType): ArkImageComponent => {
940        return new ArkImageComponent(node, type);
941      })
942    }],
943    ['Flex', (context: UIContext): FrameNode=> {
944      return new TypedFrameNode(context, 'Flex', (node: NodePtr, type: ModifierType): ArkFlexComponent => {
945        return new ArkFlexComponent(node, type);
946      })
947    }],
948    ['Swiper', (context: UIContext): FrameNode=> {
949      return new TypedFrameNode(context, 'Swiper', (node: NodePtr, type: ModifierType): ArkSwiperComponent => {
950        return new ArkSwiperComponent(node, type);
951      })
952    }],
953    ['Progress', (context: UIContext): FrameNode=> {
954      return new TypedFrameNode(context, 'Progress', (node: NodePtr, type: ModifierType): ArkProgressComponent => {
955        return new ArkProgressComponent(node, type);
956      })
957    }],
958    ['Scroll', (context: UIContext): FrameNode=> {
959      return new TypedFrameNode(context, 'Scroll', (node: NodePtr, type: ModifierType): ArkScrollComponent => {
960        return new ArkScrollComponent(node, type);
961      })
962    }],
963    ['RelativeContainer', (context: UIContext): FrameNode=> {
964      return new TypedFrameNode(context, 'RelativeContainer', (node: NodePtr, type: ModifierType): ArkRelativeContainerComponent => {
965        return new ArkRelativeContainerComponent(node, type);
966      })
967    }],
968    ['List', (context: UIContext): FrameNode=> {
969      return new TypedFrameNode(context, 'List', (node: NodePtr, type: ModifierType): ArkListComponent => {
970        return new ArkListComponent(node, type);
971      })
972    }],
973    ['ListItem', (context: UIContext): FrameNode=> {
974      return new TypedFrameNode(context, 'ListItem', (node: NodePtr, type: ModifierType): ArkListItemComponent => {
975        return new ArkListItemComponent(node, type);
976      })
977    }],
978    ['Divider', (context: UIContext): FrameNode=> {
979      return new TypedFrameNode(context, 'Divider', (node: NodePtr, type: ModifierType): ArkDividerComponent => {
980        return new ArkDividerComponent(node, type);
981      })
982    }],
983    ['LoadingProgress', (context: UIContext): FrameNode=> {
984      return new TypedFrameNode(context, 'LoadingProgress', (node: NodePtr, type: ModifierType): ArkLoadingProgressComponent => {
985        return new ArkLoadingProgressComponent(node, type);
986      })
987    }],
988    ['Search', (context: UIContext): FrameNode=> {
989      return new TypedFrameNode(context, 'Search', (node: NodePtr, type: ModifierType): ArkSearchComponent => {
990        return new ArkSearchComponent(node, type);
991      })
992    }],
993    ['Button', (context: UIContext): FrameNode=> {
994      return new TypedFrameNode(context, 'Button', (node: NodePtr, type: ModifierType): ArkButtonComponent => {
995        return new ArkButtonComponent(node, type);
996      })
997    }],
998    ['XComponent', (context: UIContext, options?: object): FrameNode=> {
999      return new TypedFrameNode(context, 'XComponent', (node: NodePtr, type: ModifierType): ArkXComponentComponent => {
1000        return new ArkXComponentComponent(node, type);
1001      }, options);
1002    }],
1003    ['ListItemGroup', (context: UIContext): FrameNode=> {
1004      return new TypedFrameNode(context, 'ListItemGroup', (node: NodePtr, type: ModifierType): ArkListItemGroupComponent => {
1005        return new ArkListItemGroupComponent(node, type);
1006      })
1007    }],
1008    ['WaterFlow', (context: UIContext): FrameNode=> {
1009      return new TypedFrameNode(context, 'WaterFlow', (node: NodePtr, type: ModifierType): ArkWaterFlowComponent => {
1010        return new ArkWaterFlowComponent(node, type);
1011      })
1012    }],
1013    ['SymbolGlyph', (context: UIContext): FrameNode=> {
1014      return new TypedFrameNode(context, 'SymbolGlyph', (node: NodePtr, type: ModifierType): ArkSymbolGlyphComponent => {
1015        return new ArkSymbolGlyphComponent(node, type);
1016      })
1017    }],
1018    ['FlowItem', (context: UIContext): FrameNode=> {
1019      return new TypedFrameNode(context, 'FlowItem', (node: NodePtr, type: ModifierType): ArkFlowItemComponent => {
1020        return new ArkFlowItemComponent(node, type);
1021      })
1022    }],
1023    ['QRCode', (context: UIContext): FrameNode=> {
1024      return new TypedFrameNode(context, 'QRCode', (node: NodePtr, type: ModifierType): ArkQRCodeComponent => {
1025        return new ArkQRCodeComponent(node, type);
1026      })
1027    }],
1028    ['Badge', (context: UIContext): FrameNode=> {
1029      return new TypedFrameNode(context, 'Badge', (node: NodePtr, type: ModifierType): ArkBadgeComponent => {
1030        return new ArkBadgeComponent(node, type);
1031      })
1032    }],
1033    ['Grid', (context: UIContext): FrameNode=> {
1034      return new TypedFrameNode(context, 'Grid', (node: NodePtr, type: ModifierType): ArkGridComponent => {
1035        return new ArkGridComponent(node, type);
1036      })
1037    }],
1038    ['GridItem', (context: UIContext): FrameNode=> {
1039      return new TypedFrameNode(context, 'GridItem', (node: NodePtr, type: ModifierType): ArkGridItemComponent => {
1040        return new ArkGridItemComponent(node, type);
1041      })
1042    }],
1043    ['TextClock', (context: UIContext): FrameNode=> {
1044      return new TypedFrameNode(context, 'TextClock', (node: NodePtr, type: ModifierType): ArkTextClockComponent => {
1045        return new ArkTextClockComponent(node, type);
1046      })
1047    }],
1048    ['TextTimer', (context: UIContext): FrameNode=> {
1049      return new TypedFrameNode(context, 'TextTimer', (node: NodePtr, type: ModifierType): ArkTextTimerComponent => {
1050        return new ArkTextTimerComponent(node, type);
1051      })
1052    }],
1053    ['Marquee', (context: UIContext): FrameNode=> {
1054      return new TypedFrameNode(context, 'Marquee', (node: NodePtr, type: ModifierType): ArkMarqueeComponent => {
1055        return new ArkMarqueeComponent(node, type);
1056      })
1057    }],
1058    ['TextArea', (context: UIContext): FrameNode=> {
1059      return new TypedFrameNode(context, 'TextArea', (node: NodePtr, type: ModifierType): ArkTextAreaComponent => {
1060        return new ArkTextAreaComponent(node, type);
1061      })
1062    }],
1063    ['Checkbox', (context: UIContext): FrameNode=> {
1064      return new TypedFrameNode(context, 'Checkbox', (node: NodePtr, type: ModifierType): ArkCheckboxComponent => {
1065        return new ArkCheckboxComponent(node, type);
1066      });
1067    }],
1068    ['CheckboxGroup', (context: UIContext): FrameNode=> {
1069      return new TypedFrameNode(context, 'CheckboxGroup', (node: NodePtr, type: ModifierType): ArkCheckboxGroupComponent => {
1070        return new ArkCheckboxGroupComponent(node, type);
1071      });
1072    }],
1073    ['Radio', (context: UIContext): FrameNode=> {
1074      return new TypedFrameNode(context, 'Radio', (node: NodePtr, type: ModifierType): ArkRadioComponent => {
1075        return new ArkRadioComponent(node, type);
1076      });
1077    }],
1078    ['Rating', (context: UIContext): FrameNode=> {
1079      return new TypedFrameNode(context, 'Rating', (node: NodePtr, type: ModifierType): ArkRatingComponent => {
1080        return new ArkRatingComponent(node, type);
1081      });
1082    }],
1083    ['Slider', (context: UIContext): FrameNode=> {
1084      return new TypedFrameNode(context, 'Slider', (node: NodePtr, type: ModifierType): ArkSliderComponent => {
1085        return new ArkSliderComponent(node, type);
1086      });
1087    }],
1088    ['Select', (context: UIContext): FrameNode=> {
1089      return new TypedFrameNode(context, 'Select', (node: NodePtr, type: ModifierType): ArkSelectComponent => {
1090        return new ArkSelectComponent(node, type);
1091      });
1092    }],
1093    ['Toggle', (context: UIContext, options?: object): FrameNode=> {
1094      return new TypedFrameNode(context, 'Toggle', (node: NodePtr, type: ModifierType): ArkToggleComponent => {
1095        return new ArkToggleComponent(node, type);
1096      }, options);
1097    }],
1098  ]
1099)
1100
1101const __attributeMap__ = new Map<string, (node: FrameNode) => ArkComponent>(
1102  [
1103    ['Swiper', (node: FrameNode): ArkSwiperComponent => {
1104      if (node._componentAttribute) {
1105        return node._componentAttribute;
1106      }
1107      if (!node.getNodePtr()) {
1108         return undefined;
1109      }
1110      node._componentAttribute = new ArkSwiperComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1111      return node._componentAttribute;
1112    }],
1113    ['Scroll', (node: FrameNode): ArkScrollComponent => {
1114      if (node._componentAttribute) {
1115        return node._componentAttribute;
1116      }
1117      if (!node.getNodePtr()) {
1118         return undefined;
1119      }
1120      node._componentAttribute = new ArkScrollComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1121      return node._componentAttribute;
1122    }],
1123    ['List', (node: FrameNode): ArkListComponent => {
1124      if (node._componentAttribute) {
1125        return node._componentAttribute;
1126      }
1127      if (!node.getNodePtr()) {
1128         return undefined;
1129      }
1130      node._componentAttribute = new ArkListComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1131      return node._componentAttribute;
1132    }],
1133    ['ListItem', (node: FrameNode): ArkListItemComponent => {
1134      if (node._componentAttribute) {
1135        return node._componentAttribute;
1136      }
1137      if (!node.getNodePtr()) {
1138         return undefined;
1139      }
1140      node._componentAttribute = new ArkListItemComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1141      return node._componentAttribute;
1142    }],
1143    ['ListItemGroup', (node: FrameNode): ArkListItemGroupComponent => {
1144      if (node._componentAttribute) {
1145        return node._componentAttribute;
1146      }
1147      if (!node.getNodePtr()) {
1148         return undefined;
1149      }
1150      node._componentAttribute = new ArkListItemGroupComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1151      return node._componentAttribute;
1152    }],
1153    ['WaterFlow', (node: FrameNode): ArkWaterFlowComponent => {
1154      if (node._componentAttribute) {
1155        return node._componentAttribute;
1156      }
1157      if (!node.getNodePtr()) {
1158         return undefined;
1159      }
1160      node._componentAttribute = new ArkWaterFlowComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1161      return node._componentAttribute;
1162    }],
1163    ['FlowItem', (node: FrameNode): ArkFlowItemComponent => {
1164      if (node._componentAttribute) {
1165        return node._componentAttribute;
1166      }
1167      if (!node.getNodePtr()) {
1168         return undefined;
1169      }
1170      node._componentAttribute = new ArkFlowItemComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1171      return node._componentAttribute;
1172    }],
1173    ['Grid', (node: FrameNode): ArkGridComponent => {
1174      if (node._componentAttribute) {
1175        return node._componentAttribute;
1176      }
1177      if (!node.getNodePtr()) {
1178         return undefined;
1179      }
1180      node._componentAttribute = new ArkGridComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1181      return node._componentAttribute;
1182    }],
1183    ['GridItem', (node: FrameNode): ArkGridItemComponent => {
1184      if (node._componentAttribute) {
1185        return node._componentAttribute;
1186      }
1187      if (!node.getNodePtr()) {
1188         return undefined;
1189      }
1190      node._componentAttribute = new ArkGridItemComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1191      return node._componentAttribute;
1192    }],
1193    ['Text', (node: FrameNode): ArkTextComponent => {
1194      if (node._componentAttribute) {
1195        return node._componentAttribute;
1196      }
1197      if (!node.getNodePtr()) {
1198        return undefined;
1199      }
1200      node._componentAttribute = new ArkTextComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1201      return node._componentAttribute;
1202    }],
1203    ['TextInput', (node: FrameNode): ArkTextInputComponent => {
1204      if (node._componentAttribute) {
1205        return node._componentAttribute;
1206      }
1207      if (!node.getNodePtr()) {
1208        return undefined;
1209      }
1210      node._componentAttribute = new ArkTextInputComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1211      return node._componentAttribute;
1212    }],
1213    ['TextArea', (node: FrameNode): ArkTextAreaComponent => {
1214        if (node._componentAttribute) {
1215          return node._componentAttribute;
1216        }
1217        if (!node.getNodePtr()) {
1218          return undefined;
1219        }
1220        node._componentAttribute = new ArkTextAreaComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1221        return node._componentAttribute;
1222    }],
1223    ['Button', (node: FrameNode): ArkButtonComponent => {
1224      if (node._componentAttribute) {
1225        return node._componentAttribute;
1226      }
1227      if (!node.getNodePtr()) {
1228         return undefined;
1229      }
1230      node._componentAttribute = new ArkButtonComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1231      return node._componentAttribute;
1232    }],
1233    ['Checkbox', (node: FrameNode): ArkCheckboxComponent => {
1234      if (node._componentAttribute) {
1235        return node._componentAttribute;
1236      }
1237      if (!node.getNodePtr()) {
1238         return undefined;
1239      }
1240      node._componentAttribute = new ArkCheckboxComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1241      return node._componentAttribute;
1242    }],
1243    ['Radio', (node: FrameNode): ArkRadioComponent => {
1244      if (node._componentAttribute) {
1245        return node._componentAttribute;
1246      }
1247      if (!node.getNodePtr()) {
1248         return undefined;
1249      }
1250      node._componentAttribute = new ArkRadioComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1251      return node._componentAttribute;
1252    }],
1253    ['Slider', (node: FrameNode): ArkSliderComponent => {
1254      if (node._componentAttribute) {
1255        return node._componentAttribute;
1256      }
1257      if (!node.getNodePtr()) {
1258         return undefined;
1259      }
1260      node._componentAttribute = new ArkSliderComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1261      return node._componentAttribute;
1262    }],
1263    ['Toggle', (node: FrameNode): ArkToggleComponent => {
1264      if (node._componentAttribute) {
1265        return node._componentAttribute;
1266      }
1267      if (!node.getNodePtr()) {
1268         return undefined;
1269      }
1270      node._componentAttribute = new ArkToggleComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1271      return node._componentAttribute;
1272    }],
1273    ['Column', (node: FrameNode): ArkColumnComponent => {
1274      if (node._componentAttribute) {
1275        return node._componentAttribute;
1276      }
1277      if (!node.getNodePtr()) {
1278        return undefined;
1279      }
1280      node._componentAttribute = new ArkColumnComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1281      return node._componentAttribute;
1282    }],
1283    ['Row', (node: FrameNode): ArkRowComponent => {
1284      if (node._componentAttribute) {
1285        return node._componentAttribute;
1286      }
1287      if (!node.getNodePtr()) {
1288        return undefined;
1289      }
1290      node._componentAttribute = new ArkRowComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1291      return node._componentAttribute;
1292    }],
1293    ['Stack', (node: FrameNode): ArkStackComponent => {
1294      if (node._componentAttribute) {
1295        return node._componentAttribute;
1296      }
1297      if (!node.getNodePtr()) {
1298        return undefined;
1299      }
1300      node._componentAttribute = new ArkStackComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1301      return node._componentAttribute;
1302    }],
1303    ['Flex', (node: FrameNode): ArkFlexComponent => {
1304      if (node._componentAttribute) {
1305        return node._componentAttribute;
1306      }
1307      if (!node.getNodePtr()) {
1308        return undefined;
1309      }
1310      node._componentAttribute = new ArkFlexComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1311      return node._componentAttribute;
1312    }],
1313    ['RelativeContainer', (node: FrameNode): ArkRelativeContainerComponent => {
1314      if (node._componentAttribute) {
1315        return node._componentAttribute;
1316      }
1317      if (!node.getNodePtr()) {
1318        return undefined;
1319      }
1320      node._componentAttribute = new ArkRelativeContainerComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1321      return node._componentAttribute;
1322    }],
1323    ['XComponent', (node: FrameNode): ArkXComponentComponent => {
1324      if (node._componentAttribute) {
1325        return node._componentAttribute;
1326      }
1327      if (!node.getNodePtr()) {
1328        return undefined;
1329      }
1330      node._componentAttribute = new ArkXComponentComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1331      return node._componentAttribute;
1332    }],
1333    ['Progress', (node: FrameNode): ArkProgressComponent => {
1334      if (node._componentAttribute) {
1335        return node._componentAttribute;
1336      }
1337      if (!node.getNodePtr()) {
1338         return undefined;
1339      }
1340      node._componentAttribute = new ArkProgressComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1341      return node._componentAttribute;
1342    }],
1343    ['LoadingProgress', (node: FrameNode): ArkLoadingProgressComponent => {
1344      if (node._componentAttribute) {
1345        return node._componentAttribute;
1346      }
1347      if (!node.getNodePtr()) {
1348         return undefined;
1349      }
1350      node._componentAttribute = new ArkLoadingProgressComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1351      return node._componentAttribute;
1352    }],
1353    ['Image', (node: FrameNode): ArkImageComponent => {
1354      if (node._componentAttribute) {
1355        return node._componentAttribute;
1356      }
1357      if (!node.getNodePtr()) {
1358         return undefined;
1359      }
1360      node._componentAttribute = new ArkImageComponent(node.getNodePtr(), ModifierType.FRAME_NODE);
1361      return node._componentAttribute;
1362    }]
1363  ]
1364)
1365
1366const __eventMap__ = new Map<string, (node: FrameNode) => UICommonEvent>(
1367  [
1368    ['List', (node: FrameNode): UIListEvent => {
1369      if (node._scrollableEvent) {
1370        return node._scrollableEvent;
1371      }
1372      if (!node.getNodePtr()) {
1373         return undefined;
1374      }
1375      node._scrollableEvent = new UIListEvent(node.getNodePtr());
1376      node._scrollableEvent.setNodePtr(node);
1377      node._scrollableEvent.setInstanceId((this.uiContext_ === undefined || this.uiContext_ === null) ? -1 : this.uiContext_.instanceId_);
1378      return node._scrollableEvent;
1379    }],
1380    ['Scroll', (node: FrameNode): UIScrollEvent => {
1381      if (node._scrollableEvent) {
1382        return node._scrollableEvent;
1383      }
1384      if (!node.getNodePtr()) {
1385         return undefined;
1386      }
1387      node._scrollableEvent = new UIScrollEvent(node.getNodePtr());
1388      node._scrollableEvent.setNodePtr(node);
1389      node._scrollableEvent.setInstanceId((this.uiContext_ === undefined || this.uiContext_ === null) ? -1 : this.uiContext_.instanceId_);
1390      return node._scrollableEvent;
1391    }],
1392    ['Grid', (node: FrameNode): UIGridEvent => {
1393      if (node._scrollableEvent) {
1394        return node._scrollableEvent;
1395      }
1396      if (!node.getNodePtr()) {
1397         return undefined;
1398      }
1399      node._scrollableEvent = new UIGridEvent(node.getNodePtr());
1400      node._scrollableEvent.setNodePtr(node);
1401      node._scrollableEvent.setInstanceId((this.uiContext_ === undefined || this.uiContext_ === null) ? -1 : this.uiContext_.instanceId_);
1402      return node._scrollableEvent;
1403    }],
1404    ['WaterFlow', (node: FrameNode): UIWaterFlowEvent => {
1405      if (node._scrollableEvent) {
1406        return node._scrollableEvent;
1407      }
1408      if (!node.getNodePtr()) {
1409         return undefined;
1410      }
1411      node._scrollableEvent = new UIWaterFlowEvent(node.getNodePtr());
1412      node._scrollableEvent.setNodePtr(node);
1413      node._scrollableEvent.setInstanceId((this.uiContext_ === undefined || this.uiContext_ === null) ? -1 : this.uiContext_.instanceId_);
1414      return node._scrollableEvent;
1415    }]
1416  ]
1417)
1418
1419type Controller = Scroller | SwiperController | TextController | TextInputController | TextAreaController
1420
1421const __bindControllerCallbackMap__ = new Map<string, (node: FrameNode, controller: Controller) => void>(
1422  [
1423    ['Swiper', (node: FrameNode, controller: SwiperController) => {
1424      getUINativeModule().swiper.setSwiperInitialize(node.getNodePtr(), controller);
1425    }],
1426    ['Scroll', (node: FrameNode, controller: Scroller) => {
1427      getUINativeModule().scroll.setScrollInitialize(node.getNodePtr(), controller);
1428    }],
1429    ['List', (node: FrameNode, controller: Scroller) => {
1430      getUINativeModule().list.setInitialScroller(node.getNodePtr(), controller);
1431    }],
1432    ['WaterFlow', (node: FrameNode, controller: Scroller) => {
1433      getUINativeModule().waterFlow.setWaterFlowScroller(node.getNodePtr(), controller);
1434    }],
1435    ['Grid', (node: FrameNode, controller: Scroller) => {
1436      getUINativeModule().grid.setGridScroller(node.getNodePtr(), controller);
1437    }],
1438    ['Text', (node: FrameNode, controller: TextController) => {
1439        getUINativeModule().text.setTextController(node.getNodePtr(), { controller: controller });
1440    }],
1441    ['TextInput', (node: FrameNode, controller: TextInputController) => {
1442        getUINativeModule().textInput.setController(node.getNodePtr(), controller);
1443    }],
1444    ['TextArea', (node: FrameNode, controller: TextAreaController) => {
1445        getUINativeModule().textArea.setController(node.getNodePtr(), controller);
1446    }]
1447  ]
1448)
1449
1450class typeNode {
1451  static createNode(context: UIContext, type: string, options?: object): FrameNode {
1452    let creator = __creatorMap__.get(type)
1453    if (creator === undefined) {
1454      return undefined
1455    }
1456    return creator(context, options);
1457  }
1458
1459  static getAttribute(node: FrameNode, nodeType: string): ArkComponent {
1460    if (node === undefined || node === null || node.getNodeType() !== nodeType) {
1461      return undefined;
1462    }
1463    if (!node.checkIfCanCrossLanguageAttributeSetting()) {
1464      return undefined;
1465    }
1466    let attribute = __attributeMap__.get(nodeType);
1467    if (attribute === undefined || attribute === null) {
1468      return undefined;
1469    }
1470    return attribute(node);
1471  }
1472
1473  static getEvent(node: FrameNode, nodeType: string): UICommonEvent {
1474    if (node === undefined || node === null || node.getNodeType() !== nodeType) {
1475      return undefined;
1476    }
1477    let event = __eventMap__.get(nodeType);
1478    if (event === undefined || event === null) {
1479      return undefined;
1480    }
1481    return event(node);
1482  }
1483
1484  static bindController(node: FrameNode, controller: Controller, nodeType: string): void {
1485    if (node === undefined || node === null || controller === undefined || controller === null ||
1486      node.getNodeType() !== nodeType || node.getNodePtr() === null || node.getNodePtr() === undefined) {
1487      if (nodeType === undefined || nodeType === null || nodeType === 'Scroll') {
1488        throw { message: 'Parameter error. Possible causes: 1. The type of the node is error; 2. The node is null or undefined.', code: 401 };
1489      } else {
1490        throw { message: 'Parameter error. Possible causes: 1. The component type of the node is incorrect. 2. The node is null or undefined. 3. The controller is null or undefined.', code: 100023 };
1491      }
1492    }
1493    if (!node.checkIfCanCrossLanguageAttributeSetting()) {
1494      throw { message: 'The FrameNode is not modifiable.', code: 100021 };
1495    }
1496    let callback = __bindControllerCallbackMap__.get(nodeType);
1497    if (callback === undefined || callback === null) {
1498      return;
1499    }
1500    callback(node, controller);
1501  }
1502}
1503