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