@babylonjs/gui 7.23.1 → 7.25.0
Sign up to get free protection for your applications and to get access to all the features.
- package/2D/controls/inputText.js +1 -1
- package/2D/controls/inputText.js.map +1 -1
- package/2D/controls/inputTextArea.js +7 -7
- package/2D/controls/inputTextArea.js.map +1 -1
- package/2D/controls/textWrapper.js +1 -1
- package/2D/controls/textWrapper.js.map +1 -1
- package/3D/controls/volumeBasedPanel.js +14 -9
- package/3D/controls/volumeBasedPanel.js.map +1 -1
- package/package.json +3 -3
package/2D/controls/inputText.js
CHANGED
@@ -427,7 +427,7 @@ export class InputText extends Control {
|
|
427
427
|
}
|
428
428
|
//delete single character
|
429
429
|
if (this._cursorOffset === 0) {
|
430
|
-
this.text = this._textWrapper.
|
430
|
+
this.text = this._textWrapper.substring(0, this._textWrapper.length - 1);
|
431
431
|
}
|
432
432
|
else {
|
433
433
|
const deletePosition = this._textWrapper.length - this._cursorOffset;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"inputText.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/inputText.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Vector2 } from \"core/Maths/math.vector\";\r\nimport type { ClipboardInfo } from \"core/Events/clipboardEvents\";\r\nimport { ClipboardEventTypes } from \"core/Events/clipboardEvents\";\r\nimport type { PointerInfo, PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport type { VirtualKeyboard } from \"./virtualKeyboard\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { TextWrapper } from \"./textWrapper\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport type { IKeyboardEvent, IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport type { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to create input text control\r\n */\r\nexport class InputText extends Control {\r\n protected _textWrapper: TextWrapper;\r\n protected _placeholderText = \"\";\r\n protected _background = \"#222222\";\r\n protected _focusedBackground = \"#000000\";\r\n protected _placeholderColor = \"gray\";\r\n protected _thickness = 1;\r\n protected _margin = new ValueAndUnit(10, ValueAndUnit.UNITMODE_PIXEL);\r\n protected _autoStretchWidth = true;\r\n protected _maxWidth = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** the type of device that most recently focused the input: \"mouse\", \"touch\" or \"pen\" */\r\n protected _focusedBy: string;\r\n protected _blinkTimeout: number;\r\n protected _blinkIsEven = false;\r\n private _cursorOffset = 0;\r\n protected _scrollLeft: Nullable<number>;\r\n protected _textWidth: number;\r\n protected _clickedCoordinate: Nullable<number>;\r\n protected _deadKey = false;\r\n protected _addKey = true;\r\n protected _currentKey = \"\";\r\n protected _isTextHighlightOn = false;\r\n protected _textHighlightColor = \"#d5e0ff\";\r\n protected _highligherOpacity = 0.4;\r\n protected _highlightedText = \"\";\r\n private _startHighlightIndex = 0;\r\n private _endHighlightIndex = 0;\r\n private _cursorIndex = -1;\r\n private _outlineWidth: number = 0;\r\n private _outlineColor: string = \"white\";\r\n protected _onFocusSelectAll = false;\r\n protected _isPointerDown = false;\r\n protected _onClipboardObserver: Nullable<Observer<ClipboardInfo>>;\r\n protected _onPointerDblTapObserver: Nullable<Observer<PointerInfo>>;\r\n\r\n /** @internal */\r\n public _connectedVirtualKeyboard: Nullable<VirtualKeyboard>;\r\n\r\n /** Gets or sets a string representing the message displayed on mobile when the control gets the focus */\r\n @serialize()\r\n public promptMessage = \"Please enter text:\";\r\n /** Force disable prompt on mobile device */\r\n @serialize()\r\n public disableMobilePrompt = false;\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n public get outlineWidth(): number {\r\n return this._outlineWidth;\r\n }\r\n\r\n public set outlineWidth(value: number) {\r\n if (this._outlineWidth === value) {\r\n return;\r\n }\r\n this._outlineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n public get outlineColor(): string {\r\n return this._outlineColor;\r\n }\r\n\r\n public set outlineColor(value: string) {\r\n if (this._outlineColor === value) {\r\n return;\r\n }\r\n this._outlineColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Observable raised when the text changes */\r\n public onTextChangedObservable = new Observable<InputText>();\r\n /** Observable raised just before an entered character is to be added */\r\n public onBeforeKeyAddObservable = new Observable<InputText>();\r\n /** Observable raised when the text is highlighted */\r\n public onTextHighlightObservable = new Observable<InputText>();\r\n /** Observable raised when copy event is triggered */\r\n public onTextCopyObservable = new Observable<InputText>();\r\n /** Observable raised when cut event is triggered */\r\n public onTextCutObservable = new Observable<InputText>();\r\n /** Observable raised when paste event is triggered */\r\n public onTextPasteObservable = new Observable<InputText>();\r\n\r\n /** Gets or sets the maximum width allowed by the control */\r\n @serialize()\r\n public get maxWidth(): string | number {\r\n return this._maxWidth.toString(this._host);\r\n }\r\n\r\n /** Gets the maximum width allowed by the control in pixels */\r\n public get maxWidthInPixels(): number {\r\n return this._maxWidth.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set maxWidth(value: string | number) {\r\n if (this._maxWidth.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._maxWidth.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets the text highlighter transparency; default: 0.4 */\r\n @serialize()\r\n public get highligherOpacity(): number {\r\n return this._highligherOpacity;\r\n }\r\n\r\n public set highligherOpacity(value: number) {\r\n if (this._highligherOpacity === value) {\r\n return;\r\n }\r\n this._highligherOpacity = value;\r\n this._markAsDirty();\r\n }\r\n /** Gets or sets a boolean indicating whether to select complete text by default on input focus */\r\n @serialize()\r\n public get onFocusSelectAll(): boolean {\r\n return this._onFocusSelectAll;\r\n }\r\n\r\n public set onFocusSelectAll(value: boolean) {\r\n if (this._onFocusSelectAll === value) {\r\n return;\r\n }\r\n\r\n this._onFocusSelectAll = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the text hightlight color */\r\n @serialize()\r\n public get textHighlightColor(): string {\r\n return this._textHighlightColor;\r\n }\r\n\r\n public set textHighlightColor(value: string) {\r\n if (this._textHighlightColor === value) {\r\n return;\r\n }\r\n this._textHighlightColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets control margin */\r\n @serialize()\r\n public get margin(): string {\r\n return this._margin.toString(this._host);\r\n }\r\n\r\n /** Gets control margin in pixels */\r\n public get marginInPixels(): number {\r\n return this._margin.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set margin(value: string) {\r\n if (this._margin.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._margin.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control can auto stretch its width to adapt to the text */\r\n @serialize()\r\n public get autoStretchWidth(): boolean {\r\n return this._autoStretchWidth;\r\n }\r\n\r\n public set autoStretchWidth(value: boolean) {\r\n if (this._autoStretchWidth === value) {\r\n return;\r\n }\r\n\r\n this._autoStretchWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets border thickness */\r\n @serialize()\r\n public get thickness(): number {\r\n return this._thickness;\r\n }\r\n\r\n public set thickness(value: number) {\r\n if (this._thickness === value) {\r\n return;\r\n }\r\n\r\n this._thickness = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color when focused */\r\n @serialize()\r\n public get focusedBackground(): string {\r\n return this._focusedBackground;\r\n }\r\n\r\n public set focusedBackground(value: string) {\r\n if (this._focusedBackground === value) {\r\n return;\r\n }\r\n\r\n this._focusedBackground = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color when focused */\r\n public override set focusedColor(value: string) {\r\n if (this._focusedColor === value) {\r\n return;\r\n }\r\n\r\n this._focusedColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the placeholder color */\r\n @serialize()\r\n public get placeholderColor(): string {\r\n return this._placeholderColor;\r\n }\r\n\r\n public set placeholderColor(value: string) {\r\n if (this._placeholderColor === value) {\r\n return;\r\n }\r\n\r\n this._placeholderColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the text displayed when the control is empty */\r\n @serialize()\r\n public get placeholderText(): string {\r\n return this._placeholderText;\r\n }\r\n\r\n public set placeholderText(value: string) {\r\n if (this._placeholderText === value) {\r\n return;\r\n }\r\n this._placeholderText = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the dead key. 0 to disable. */\r\n @serialize()\r\n public get deadKey(): boolean {\r\n return this._deadKey;\r\n }\r\n\r\n public set deadKey(flag: boolean) {\r\n this._deadKey = flag;\r\n }\r\n\r\n /** Gets or sets the highlight text */\r\n public get highlightedText(): string {\r\n return this._highlightedText;\r\n }\r\n public set highlightedText(text: string) {\r\n if (this._highlightedText === text) {\r\n return;\r\n }\r\n this._highlightedText = text;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets if the current key should be added */\r\n public get addKey(): boolean {\r\n return this._addKey;\r\n }\r\n\r\n public set addKey(flag: boolean) {\r\n this._addKey = flag;\r\n }\r\n\r\n /** Gets or sets the value of the current key being entered */\r\n public get currentKey(): string {\r\n return this._currentKey;\r\n }\r\n\r\n public set currentKey(key: string) {\r\n this._currentKey = key;\r\n }\r\n\r\n /** Gets or sets the text displayed in the control */\r\n @serialize()\r\n public get text(): string {\r\n return this._textWrapper.text;\r\n }\r\n\r\n public set text(value: string) {\r\n const valueAsString = value.toString(); // Forcing convertion\r\n\r\n if (!this._textWrapper) {\r\n this._textWrapper = new TextWrapper();\r\n }\r\n\r\n if (this._textWrapper.text === valueAsString) {\r\n return;\r\n }\r\n this._textWrapper.text = valueAsString;\r\n this._textHasChanged();\r\n }\r\n\r\n protected _textHasChanged(): void {\r\n this._markAsDirty();\r\n this.onTextChangedObservable.notifyObservers(this);\r\n }\r\n\r\n protected override _applyStates(context: ICanvasRenderingContext): void {\r\n super._applyStates(context);\r\n if (this.outlineWidth) {\r\n context.lineWidth = this.outlineWidth;\r\n context.strokeStyle = this.outlineColor;\r\n }\r\n }\r\n\r\n /** Gets or sets control width */\r\n @serialize()\r\n public override get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public override set width(value: string | number) {\r\n if (this._width.toString(this._host) === value && !this._autoStretchWidth) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n\r\n this.autoStretchWidth = false;\r\n }\r\n\r\n /**\r\n * Creates a new InputText\r\n * @param name defines the control name\r\n * @param text defines the text of the control\r\n */\r\n constructor(\r\n public override name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n this.isPointerBlocker = true;\r\n this._focusedColor = \"white\";\r\n }\r\n\r\n /** @internal */\r\n public override onBlur(): void {\r\n this._isFocused = false;\r\n this._scrollLeft = null;\r\n this._cursorOffset = 0;\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n\r\n this.onBlurObservable.notifyObservers(this);\r\n\r\n this._host.unRegisterClipboardEvents();\r\n if (this._onClipboardObserver) {\r\n this._host.onClipboardObservable.remove(this._onClipboardObserver);\r\n }\r\n const scene = this._host.getScene();\r\n if (this._onPointerDblTapObserver && scene) {\r\n scene.onPointerObservable.remove(this._onPointerDblTapObserver);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public override onFocus(): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._scrollLeft = null;\r\n this._isFocused = true;\r\n this._blinkIsEven = false;\r\n this._cursorOffset = 0;\r\n this._markAsDirty();\r\n\r\n this.onFocusObservable.notifyObservers(this as Control);\r\n\r\n if (this._focusedBy === \"touch\" && !this.disableMobilePrompt) {\r\n const value = prompt(this.promptMessage);\r\n\r\n if (value !== null) {\r\n this.text = value;\r\n }\r\n this._host.focusedControl = null;\r\n return;\r\n }\r\n\r\n this._host.registerClipboardEvents();\r\n\r\n this._onClipboardObserver = this._host.onClipboardObservable.add((clipboardInfo) => {\r\n // process clipboard event, can be configured.\r\n switch (clipboardInfo.type) {\r\n case ClipboardEventTypes.COPY:\r\n this._onCopyText(clipboardInfo.event);\r\n this.onTextCopyObservable.notifyObservers(this);\r\n break;\r\n case ClipboardEventTypes.CUT:\r\n this._onCutText(clipboardInfo.event);\r\n this.onTextCutObservable.notifyObservers(this);\r\n break;\r\n case ClipboardEventTypes.PASTE:\r\n this._onPasteText(clipboardInfo.event);\r\n this.onTextPasteObservable.notifyObservers(this);\r\n break;\r\n default:\r\n return;\r\n }\r\n });\r\n\r\n const scene = this._host.getScene();\r\n if (scene) {\r\n //register the pointer double tap event\r\n this._onPointerDblTapObserver = scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this._isFocused) {\r\n return;\r\n }\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOUBLETAP) {\r\n this._processDblClick(pointerInfo);\r\n }\r\n });\r\n }\r\n\r\n if (this._onFocusSelectAll) {\r\n this._selectAllText();\r\n }\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"InputText\";\r\n }\r\n\r\n /**\r\n * Function called to get the list of controls that should not steal the focus from this control\r\n * @returns an array of controls\r\n */\r\n public override keepsFocusWith(): Nullable<Control[]> {\r\n if (!this._connectedVirtualKeyboard) {\r\n return null;\r\n }\r\n return [this._connectedVirtualKeyboard];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public processKey(keyCode: number, key?: string, evt?: IKeyboardEvent) {\r\n if (this.isReadOnly) {\r\n return;\r\n }\r\n\r\n //return if clipboard event keys (i.e -ctr/cmd + c,v,x)\r\n if (evt && (evt.ctrlKey || evt.metaKey) && (keyCode === 67 || keyCode === 86 || keyCode === 88)) {\r\n return;\r\n }\r\n\r\n //select all\r\n if (evt && (evt.ctrlKey || evt.metaKey) && keyCode === 65) {\r\n this._selectAllText();\r\n evt.preventDefault();\r\n return;\r\n }\r\n // Specific cases\r\n switch (keyCode) {\r\n case 32: //SPACE\r\n key = \" \"; //ie11 key for space is \"Spacebar\"\r\n break;\r\n case 191: //SLASH\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n break;\r\n case 8: // BACKSPACE\r\n if (this._textWrapper.text && this._textWrapper.length > 0) {\r\n //delete the highlighted text\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n this._blinkIsEven = false;\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n }\r\n //delete single character\r\n if (this._cursorOffset === 0) {\r\n this.text = this._textWrapper.substr(0, this._textWrapper.length - 1);\r\n } else {\r\n const deletePosition = this._textWrapper.length - this._cursorOffset;\r\n if (deletePosition > 0) {\r\n this._textWrapper.removePart(deletePosition - 1, deletePosition);\r\n this._textHasChanged();\r\n }\r\n }\r\n }\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n case 46: // DELETE\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n }\r\n if (this._textWrapper.text && this._textWrapper.length > 0 && this._cursorOffset > 0) {\r\n const deletePosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(deletePosition, deletePosition + 1);\r\n this._textHasChanged();\r\n this._cursorOffset--;\r\n }\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n case 13: // RETURN\r\n this._host.focusedControl = null;\r\n this.isTextHighlightOn = false;\r\n return;\r\n case 35: // END\r\n this._cursorOffset = 0;\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case 36: // HOME\r\n this._cursorOffset = this._textWrapper.length;\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case 37: // LEFT\r\n this._cursorOffset++;\r\n if (this._cursorOffset > this._textWrapper.length) {\r\n this._cursorOffset = this._textWrapper.length;\r\n }\r\n\r\n if (evt && evt.shiftKey) {\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n // shift + ctrl/cmd + <-\r\n if (evt.ctrlKey || evt.metaKey) {\r\n if (!this.isTextHighlightOn) {\r\n if (this._textWrapper.length === this._cursorOffset) {\r\n return;\r\n } else {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset + 1;\r\n }\r\n }\r\n this._startHighlightIndex = 0;\r\n this._cursorIndex = this._textWrapper.length - this._endHighlightIndex;\r\n this._cursorOffset = this._textWrapper.length;\r\n this.isTextHighlightOn = true;\r\n this._markAsDirty();\r\n return;\r\n }\r\n //store the starting point\r\n if (!this.isTextHighlightOn) {\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._cursorOffset >= this._textWrapper.length ? this._textWrapper.length : this._cursorOffset - 1;\r\n }\r\n //if text is already highlighted\r\n else if (this._cursorIndex === -1) {\r\n this._cursorIndex = this._textWrapper.length - this._endHighlightIndex;\r\n this._cursorOffset = this._startHighlightIndex === 0 ? this._textWrapper.length : this._textWrapper.length - this._startHighlightIndex + 1;\r\n }\r\n //set the highlight indexes\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n }\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (this.isTextHighlightOn) {\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n this.isTextHighlightOn = false;\r\n }\r\n if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n this._cursorOffset = this._textWrapper.length;\r\n evt.preventDefault();\r\n }\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n return;\r\n case 39: // RIGHT\r\n this._cursorOffset--;\r\n if (this._cursorOffset < 0) {\r\n this._cursorOffset = 0;\r\n }\r\n if (evt && evt.shiftKey) {\r\n //update the cursor\r\n this._blinkIsEven = false;\r\n //shift + ctrl/cmd + ->\r\n if (evt.ctrlKey || evt.metaKey) {\r\n if (!this.isTextHighlightOn) {\r\n if (this._cursorOffset === 0) {\r\n return;\r\n } else {\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset - 1;\r\n }\r\n }\r\n this._endHighlightIndex = this._textWrapper.length;\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._textWrapper.length - this._startHighlightIndex;\r\n this._cursorOffset = 0;\r\n this._markAsDirty();\r\n return;\r\n }\r\n\r\n if (!this.isTextHighlightOn) {\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._cursorOffset <= 0 ? 0 : this._cursorOffset + 1;\r\n }\r\n //if text is already highlighted\r\n else if (this._cursorIndex === -1) {\r\n this._cursorIndex = this._textWrapper.length - this._startHighlightIndex;\r\n this._cursorOffset = this._textWrapper.length === this._endHighlightIndex ? 0 : this._textWrapper.length - this._endHighlightIndex - 1;\r\n }\r\n //set the highlight indexes\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n }\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (this.isTextHighlightOn) {\r\n this._cursorOffset = this._textWrapper.length - this._endHighlightIndex;\r\n this.isTextHighlightOn = false;\r\n }\r\n //ctr + ->\r\n if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n this._cursorOffset = 0;\r\n evt.preventDefault();\r\n }\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (keyCode === 32) {\r\n key = evt?.key ?? \" \";\r\n }\r\n this._deadKey = key === \"Dead\";\r\n // Printable characters\r\n if (\r\n key &&\r\n (keyCode === -1 || // Direct access\r\n keyCode === 32 || // Space\r\n keyCode === 34 || // \" add support for single and double quotes\r\n keyCode === 39 || // '\r\n (keyCode > 47 && keyCode < 64) || // Numbers\r\n (keyCode > 64 && keyCode < 91) || // Letters\r\n (keyCode > 159 && keyCode < 193) || // Special characters\r\n (keyCode > 218 && keyCode < 223) || // Special characters\r\n (keyCode > 95 && keyCode < 112))\r\n ) {\r\n // Numpad\r\n this._currentKey = key;\r\n this.onBeforeKeyAddObservable.notifyObservers(this);\r\n key = this._currentKey;\r\n if (this._addKey && !this._deadKey) {\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex, key);\r\n this._textHasChanged();\r\n this._cursorOffset = this._textWrapper.length - (this._startHighlightIndex + 1);\r\n this.isTextHighlightOn = false;\r\n this._blinkIsEven = false;\r\n this._markAsDirty();\r\n } else if (this._cursorOffset === 0) {\r\n this.text += this._deadKey && evt?.key ? evt.key : key;\r\n } else {\r\n const insertPosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(insertPosition, insertPosition, key);\r\n this._textHasChanged();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _updateValueFromCursorIndex(offset: number) {\r\n //update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (this._cursorIndex === -1) {\r\n this._cursorIndex = offset;\r\n } else {\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n }\r\n }\r\n this.isTextHighlightOn = true;\r\n this._markAsDirty();\r\n }\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _processDblClick(evt: PointerInfo) {\r\n //pre-find the start and end index of the word under cursor, speeds up the rendering\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._endHighlightIndex = this._startHighlightIndex;\r\n let moveLeft, moveRight;\r\n do {\r\n moveRight = this._endHighlightIndex < this._textWrapper.length && this._textWrapper.isWord(this._endHighlightIndex) ? ++this._endHighlightIndex : 0;\r\n moveLeft = this._startHighlightIndex > 0 && this._textWrapper.isWord(this._startHighlightIndex - 1) ? --this._startHighlightIndex : 0;\r\n } while (moveLeft || moveRight);\r\n\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n\r\n this.isTextHighlightOn = true;\r\n this._clickedCoordinate = null;\r\n this._blinkIsEven = true;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n }\r\n /** @internal */\r\n protected _selectAllText() {\r\n this._blinkIsEven = true;\r\n this.isTextHighlightOn = true;\r\n\r\n this._startHighlightIndex = 0;\r\n this._endHighlightIndex = this._textWrapper.length;\r\n this._cursorOffset = this._textWrapper.length;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public override processKeyboard(evt: IKeyboardEvent): void {\r\n // process pressed key\r\n this.processKey(evt.keyCode, evt.key, evt);\r\n\r\n super.processKeyboard(evt);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _onCopyText(ev: ClipboardEvent): void {\r\n this.isTextHighlightOn = false;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n this._host.clipboardData = this._highlightedText;\r\n }\r\n /**\r\n * @internal\r\n */\r\n protected _onCutText(ev: ClipboardEvent): void {\r\n if (!this._highlightedText) {\r\n return;\r\n }\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n\r\n this._host.clipboardData = this._highlightedText;\r\n this._highlightedText = \"\";\r\n }\r\n /**\r\n * @internal\r\n */\r\n protected _onPasteText(ev: ClipboardEvent): void {\r\n let data: string = \"\";\r\n if (ev.clipboardData && ev.clipboardData.types.indexOf(\"text/plain\") !== -1) {\r\n data = ev.clipboardData.getData(\"text/plain\");\r\n } else {\r\n //get the cached data; returns blank string by default\r\n data = this._host.clipboardData;\r\n }\r\n const insertPosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(insertPosition, insertPosition, data);\r\n this._textHasChanged();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n // Background\r\n if (this._isFocused) {\r\n if (this._focusedBackground) {\r\n context.fillStyle = this._isEnabled ? this._focusedBackground : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n } else if (this._background) {\r\n context.fillStyle = this._isEnabled ? this._background : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n if (!this._fontOffset || this._wasDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font, this._host.getScene()?.getEngine());\r\n }\r\n\r\n // Text\r\n const clipTextLeft = this._currentMeasure.left + this._margin.getValueInPixel(this._host, this._tempParentMeasure.width);\r\n if (this.color) {\r\n context.fillStyle = this.color;\r\n }\r\n\r\n let text = this._beforeRenderText(this._textWrapper);\r\n\r\n if (!this._isFocused && !this._textWrapper.text && this._placeholderText) {\r\n text = new TextWrapper();\r\n text.text = this._placeholderText;\r\n\r\n if (this._placeholderColor) {\r\n context.fillStyle = this._placeholderColor;\r\n }\r\n }\r\n\r\n this._textWidth = context.measureText(text.text).width;\r\n const marginWidth = this._margin.getValueInPixel(this._host, this._tempParentMeasure.width) * 2;\r\n if (this._autoStretchWidth) {\r\n this.width = Math.min(this._maxWidth.getValueInPixel(this._host, this._tempParentMeasure.width), this._textWidth + marginWidth) + \"px\";\r\n this._autoStretchWidth = true; // setting the width will have reset _autoStretchWidth to false!\r\n }\r\n\r\n const rootY = this._fontOffset.ascent + (this._currentMeasure.height - this._fontOffset.height) / 2;\r\n const availableWidth = this._width.getValueInPixel(this._host, this._tempParentMeasure.width) - marginWidth;\r\n\r\n context.save();\r\n context.beginPath();\r\n context.rect(clipTextLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, availableWidth + 2, this._currentMeasure.height);\r\n context.clip();\r\n\r\n if (this._isFocused && this._textWidth > availableWidth) {\r\n const textLeft = clipTextLeft - this._textWidth + availableWidth;\r\n if (!this._scrollLeft) {\r\n this._scrollLeft = textLeft;\r\n }\r\n } else {\r\n this._scrollLeft = clipTextLeft;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text.text, this._scrollLeft, this._currentMeasure.top + rootY);\r\n }\r\n\r\n context.fillText(text.text, this._scrollLeft, this._currentMeasure.top + rootY);\r\n\r\n // Cursor\r\n if (this._isFocused) {\r\n // Need to move cursor\r\n if (this._clickedCoordinate) {\r\n const rightPosition = this._scrollLeft + this._textWidth;\r\n const absoluteCursorPosition = rightPosition - this._clickedCoordinate;\r\n let currentSize = 0;\r\n this._cursorOffset = 0;\r\n let previousDist = 0;\r\n do {\r\n if (this._cursorOffset) {\r\n previousDist = Math.abs(absoluteCursorPosition - currentSize);\r\n }\r\n this._cursorOffset++;\r\n currentSize = context.measureText(text.substr(text.length - this._cursorOffset, this._cursorOffset)).width;\r\n } while (currentSize < absoluteCursorPosition && text.length >= this._cursorOffset);\r\n\r\n // Find closest move\r\n if (Math.abs(absoluteCursorPosition - currentSize) > previousDist) {\r\n this._cursorOffset--;\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._clickedCoordinate = null;\r\n }\r\n\r\n // Render cursor\r\n if (!this._blinkIsEven) {\r\n const cursorOffsetText = text.substr(text.length - this._cursorOffset);\r\n const cursorOffsetWidth = context.measureText(cursorOffsetText).width;\r\n let cursorLeft = this._scrollLeft + this._textWidth - cursorOffsetWidth;\r\n\r\n if (cursorLeft < clipTextLeft) {\r\n this._scrollLeft += clipTextLeft - cursorLeft;\r\n cursorLeft = clipTextLeft;\r\n this._markAsDirty();\r\n } else if (cursorLeft > clipTextLeft + availableWidth) {\r\n this._scrollLeft += clipTextLeft + availableWidth - cursorLeft;\r\n cursorLeft = clipTextLeft + availableWidth;\r\n this._markAsDirty();\r\n }\r\n if (!this.isTextHighlightOn) {\r\n context.fillRect(cursorLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, 2, this._fontOffset.height);\r\n }\r\n }\r\n\r\n clearTimeout(this._blinkTimeout);\r\n this._blinkTimeout = <any>setTimeout(() => {\r\n this._blinkIsEven = !this._blinkIsEven;\r\n this._markAsDirty();\r\n }, 500);\r\n\r\n //show the highlighted text\r\n if (this.isTextHighlightOn) {\r\n clearTimeout(this._blinkTimeout);\r\n const highlightCursorOffsetWidth = context.measureText(text.substring(this._startHighlightIndex)).width;\r\n let highlightCursorLeft = this._scrollLeft + this._textWidth - highlightCursorOffsetWidth;\r\n this._highlightedText = text.substring(this._startHighlightIndex, this._endHighlightIndex);\r\n let width = context.measureText(text.substring(this._startHighlightIndex, this._endHighlightIndex)).width;\r\n if (highlightCursorLeft < clipTextLeft) {\r\n width = width - (clipTextLeft - highlightCursorLeft);\r\n if (!width) {\r\n // when using left arrow on text.length > availableWidth;\r\n // assigns the width of the first letter after clipTextLeft\r\n width = context.measureText(text.charAt(text.length - this._cursorOffset)).width;\r\n }\r\n highlightCursorLeft = clipTextLeft;\r\n }\r\n //for transparancy\r\n context.globalAlpha = this._highligherOpacity;\r\n context.fillStyle = this._textHighlightColor;\r\n context.fillRect(highlightCursorLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, width, this._fontOffset.height);\r\n context.globalAlpha = 1.0;\r\n }\r\n }\r\n context.restore();\r\n\r\n // Border\r\n if (this._thickness) {\r\n if (this._isFocused) {\r\n if (this.focusedColor) {\r\n context.strokeStyle = this.focusedColor;\r\n }\r\n } else {\r\n if (this.color) {\r\n context.strokeStyle = this.color;\r\n }\r\n }\r\n\r\n context.lineWidth = this._thickness;\r\n\r\n context.strokeRect(\r\n this._currentMeasure.left + this._thickness / 2,\r\n this._currentMeasure.top + this._thickness / 2,\r\n this._currentMeasure.width - this._thickness,\r\n this._currentMeasure.height - this._thickness\r\n );\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n this._clickedCoordinate = coordinates.x;\r\n this.isTextHighlightOn = false;\r\n this._highlightedText = \"\";\r\n this._cursorIndex = -1;\r\n this._isPointerDown = true;\r\n this._host._capturingControl[pointerId] = this;\r\n this._focusedBy = (pi.event as IPointerEvent).pointerType;\r\n if (this._host.focusedControl === this) {\r\n // Move cursor\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n return true;\r\n }\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._host.focusedControl = this;\r\n\r\n return true;\r\n }\r\n public override _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\r\n if (this._host.focusedControl === this && this._isPointerDown && !this.isReadOnly) {\r\n this._clickedCoordinate = coordinates.x;\r\n this._markAsDirty();\r\n this._updateValueFromCursorIndex(this._cursorOffset);\r\n }\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n public override _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean): void {\r\n this._isPointerDown = false;\r\n delete this._host._capturingControl[pointerId];\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick);\r\n }\r\n\r\n protected _beforeRenderText(textWrapper: TextWrapper): TextWrapper {\r\n return textWrapper;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private set isTextHighlightOn(value: boolean) {\r\n if (this._isTextHighlightOn === value) {\r\n return;\r\n }\r\n if (value) {\r\n this.onTextHighlightObservable.notifyObservers(this);\r\n }\r\n this._isTextHighlightOn = value;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private get isTextHighlightOn(): boolean {\r\n return this._isTextHighlightOn;\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this.onBlurObservable.clear();\r\n this.onFocusObservable.clear();\r\n this.onTextChangedObservable.clear();\r\n this.onTextCopyObservable.clear();\r\n this.onTextCutObservable.clear();\r\n this.onTextPasteObservable.clear();\r\n this.onTextHighlightObservable.clear();\r\n this.onKeyboardEventProcessedObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.InputText\", InputText);\r\n"]}
|
1
|
+
{"version":3,"file":"inputText.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/inputText.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Vector2 } from \"core/Maths/math.vector\";\r\nimport type { ClipboardInfo } from \"core/Events/clipboardEvents\";\r\nimport { ClipboardEventTypes } from \"core/Events/clipboardEvents\";\r\nimport type { PointerInfo, PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport type { VirtualKeyboard } from \"./virtualKeyboard\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { TextWrapper } from \"./textWrapper\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport type { IKeyboardEvent, IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport type { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to create input text control\r\n */\r\nexport class InputText extends Control {\r\n protected _textWrapper: TextWrapper;\r\n protected _placeholderText = \"\";\r\n protected _background = \"#222222\";\r\n protected _focusedBackground = \"#000000\";\r\n protected _placeholderColor = \"gray\";\r\n protected _thickness = 1;\r\n protected _margin = new ValueAndUnit(10, ValueAndUnit.UNITMODE_PIXEL);\r\n protected _autoStretchWidth = true;\r\n protected _maxWidth = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** the type of device that most recently focused the input: \"mouse\", \"touch\" or \"pen\" */\r\n protected _focusedBy: string;\r\n protected _blinkTimeout: number;\r\n protected _blinkIsEven = false;\r\n private _cursorOffset = 0;\r\n protected _scrollLeft: Nullable<number>;\r\n protected _textWidth: number;\r\n protected _clickedCoordinate: Nullable<number>;\r\n protected _deadKey = false;\r\n protected _addKey = true;\r\n protected _currentKey = \"\";\r\n protected _isTextHighlightOn = false;\r\n protected _textHighlightColor = \"#d5e0ff\";\r\n protected _highligherOpacity = 0.4;\r\n protected _highlightedText = \"\";\r\n private _startHighlightIndex = 0;\r\n private _endHighlightIndex = 0;\r\n private _cursorIndex = -1;\r\n private _outlineWidth: number = 0;\r\n private _outlineColor: string = \"white\";\r\n protected _onFocusSelectAll = false;\r\n protected _isPointerDown = false;\r\n protected _onClipboardObserver: Nullable<Observer<ClipboardInfo>>;\r\n protected _onPointerDblTapObserver: Nullable<Observer<PointerInfo>>;\r\n\r\n /** @internal */\r\n public _connectedVirtualKeyboard: Nullable<VirtualKeyboard>;\r\n\r\n /** Gets or sets a string representing the message displayed on mobile when the control gets the focus */\r\n @serialize()\r\n public promptMessage = \"Please enter text:\";\r\n /** Force disable prompt on mobile device */\r\n @serialize()\r\n public disableMobilePrompt = false;\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n public get outlineWidth(): number {\r\n return this._outlineWidth;\r\n }\r\n\r\n public set outlineWidth(value: number) {\r\n if (this._outlineWidth === value) {\r\n return;\r\n }\r\n this._outlineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n public get outlineColor(): string {\r\n return this._outlineColor;\r\n }\r\n\r\n public set outlineColor(value: string) {\r\n if (this._outlineColor === value) {\r\n return;\r\n }\r\n this._outlineColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Observable raised when the text changes */\r\n public onTextChangedObservable = new Observable<InputText>();\r\n /** Observable raised just before an entered character is to be added */\r\n public onBeforeKeyAddObservable = new Observable<InputText>();\r\n /** Observable raised when the text is highlighted */\r\n public onTextHighlightObservable = new Observable<InputText>();\r\n /** Observable raised when copy event is triggered */\r\n public onTextCopyObservable = new Observable<InputText>();\r\n /** Observable raised when cut event is triggered */\r\n public onTextCutObservable = new Observable<InputText>();\r\n /** Observable raised when paste event is triggered */\r\n public onTextPasteObservable = new Observable<InputText>();\r\n\r\n /** Gets or sets the maximum width allowed by the control */\r\n @serialize()\r\n public get maxWidth(): string | number {\r\n return this._maxWidth.toString(this._host);\r\n }\r\n\r\n /** Gets the maximum width allowed by the control in pixels */\r\n public get maxWidthInPixels(): number {\r\n return this._maxWidth.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set maxWidth(value: string | number) {\r\n if (this._maxWidth.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._maxWidth.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets the text highlighter transparency; default: 0.4 */\r\n @serialize()\r\n public get highligherOpacity(): number {\r\n return this._highligherOpacity;\r\n }\r\n\r\n public set highligherOpacity(value: number) {\r\n if (this._highligherOpacity === value) {\r\n return;\r\n }\r\n this._highligherOpacity = value;\r\n this._markAsDirty();\r\n }\r\n /** Gets or sets a boolean indicating whether to select complete text by default on input focus */\r\n @serialize()\r\n public get onFocusSelectAll(): boolean {\r\n return this._onFocusSelectAll;\r\n }\r\n\r\n public set onFocusSelectAll(value: boolean) {\r\n if (this._onFocusSelectAll === value) {\r\n return;\r\n }\r\n\r\n this._onFocusSelectAll = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the text hightlight color */\r\n @serialize()\r\n public get textHighlightColor(): string {\r\n return this._textHighlightColor;\r\n }\r\n\r\n public set textHighlightColor(value: string) {\r\n if (this._textHighlightColor === value) {\r\n return;\r\n }\r\n this._textHighlightColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets control margin */\r\n @serialize()\r\n public get margin(): string {\r\n return this._margin.toString(this._host);\r\n }\r\n\r\n /** Gets control margin in pixels */\r\n public get marginInPixels(): number {\r\n return this._margin.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set margin(value: string) {\r\n if (this._margin.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._margin.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control can auto stretch its width to adapt to the text */\r\n @serialize()\r\n public get autoStretchWidth(): boolean {\r\n return this._autoStretchWidth;\r\n }\r\n\r\n public set autoStretchWidth(value: boolean) {\r\n if (this._autoStretchWidth === value) {\r\n return;\r\n }\r\n\r\n this._autoStretchWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets border thickness */\r\n @serialize()\r\n public get thickness(): number {\r\n return this._thickness;\r\n }\r\n\r\n public set thickness(value: number) {\r\n if (this._thickness === value) {\r\n return;\r\n }\r\n\r\n this._thickness = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color when focused */\r\n @serialize()\r\n public get focusedBackground(): string {\r\n return this._focusedBackground;\r\n }\r\n\r\n public set focusedBackground(value: string) {\r\n if (this._focusedBackground === value) {\r\n return;\r\n }\r\n\r\n this._focusedBackground = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color when focused */\r\n public override set focusedColor(value: string) {\r\n if (this._focusedColor === value) {\r\n return;\r\n }\r\n\r\n this._focusedColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the placeholder color */\r\n @serialize()\r\n public get placeholderColor(): string {\r\n return this._placeholderColor;\r\n }\r\n\r\n public set placeholderColor(value: string) {\r\n if (this._placeholderColor === value) {\r\n return;\r\n }\r\n\r\n this._placeholderColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the text displayed when the control is empty */\r\n @serialize()\r\n public get placeholderText(): string {\r\n return this._placeholderText;\r\n }\r\n\r\n public set placeholderText(value: string) {\r\n if (this._placeholderText === value) {\r\n return;\r\n }\r\n this._placeholderText = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the dead key. 0 to disable. */\r\n @serialize()\r\n public get deadKey(): boolean {\r\n return this._deadKey;\r\n }\r\n\r\n public set deadKey(flag: boolean) {\r\n this._deadKey = flag;\r\n }\r\n\r\n /** Gets or sets the highlight text */\r\n public get highlightedText(): string {\r\n return this._highlightedText;\r\n }\r\n public set highlightedText(text: string) {\r\n if (this._highlightedText === text) {\r\n return;\r\n }\r\n this._highlightedText = text;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets if the current key should be added */\r\n public get addKey(): boolean {\r\n return this._addKey;\r\n }\r\n\r\n public set addKey(flag: boolean) {\r\n this._addKey = flag;\r\n }\r\n\r\n /** Gets or sets the value of the current key being entered */\r\n public get currentKey(): string {\r\n return this._currentKey;\r\n }\r\n\r\n public set currentKey(key: string) {\r\n this._currentKey = key;\r\n }\r\n\r\n /** Gets or sets the text displayed in the control */\r\n @serialize()\r\n public get text(): string {\r\n return this._textWrapper.text;\r\n }\r\n\r\n public set text(value: string) {\r\n const valueAsString = value.toString(); // Forcing convertion\r\n\r\n if (!this._textWrapper) {\r\n this._textWrapper = new TextWrapper();\r\n }\r\n\r\n if (this._textWrapper.text === valueAsString) {\r\n return;\r\n }\r\n this._textWrapper.text = valueAsString;\r\n this._textHasChanged();\r\n }\r\n\r\n protected _textHasChanged(): void {\r\n this._markAsDirty();\r\n this.onTextChangedObservable.notifyObservers(this);\r\n }\r\n\r\n protected override _applyStates(context: ICanvasRenderingContext): void {\r\n super._applyStates(context);\r\n if (this.outlineWidth) {\r\n context.lineWidth = this.outlineWidth;\r\n context.strokeStyle = this.outlineColor;\r\n }\r\n }\r\n\r\n /** Gets or sets control width */\r\n @serialize()\r\n public override get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public override set width(value: string | number) {\r\n if (this._width.toString(this._host) === value && !this._autoStretchWidth) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n\r\n this.autoStretchWidth = false;\r\n }\r\n\r\n /**\r\n * Creates a new InputText\r\n * @param name defines the control name\r\n * @param text defines the text of the control\r\n */\r\n constructor(\r\n public override name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n this.isPointerBlocker = true;\r\n this._focusedColor = \"white\";\r\n }\r\n\r\n /** @internal */\r\n public override onBlur(): void {\r\n this._isFocused = false;\r\n this._scrollLeft = null;\r\n this._cursorOffset = 0;\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n\r\n this.onBlurObservable.notifyObservers(this);\r\n\r\n this._host.unRegisterClipboardEvents();\r\n if (this._onClipboardObserver) {\r\n this._host.onClipboardObservable.remove(this._onClipboardObserver);\r\n }\r\n const scene = this._host.getScene();\r\n if (this._onPointerDblTapObserver && scene) {\r\n scene.onPointerObservable.remove(this._onPointerDblTapObserver);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public override onFocus(): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._scrollLeft = null;\r\n this._isFocused = true;\r\n this._blinkIsEven = false;\r\n this._cursorOffset = 0;\r\n this._markAsDirty();\r\n\r\n this.onFocusObservable.notifyObservers(this as Control);\r\n\r\n if (this._focusedBy === \"touch\" && !this.disableMobilePrompt) {\r\n const value = prompt(this.promptMessage);\r\n\r\n if (value !== null) {\r\n this.text = value;\r\n }\r\n this._host.focusedControl = null;\r\n return;\r\n }\r\n\r\n this._host.registerClipboardEvents();\r\n\r\n this._onClipboardObserver = this._host.onClipboardObservable.add((clipboardInfo) => {\r\n // process clipboard event, can be configured.\r\n switch (clipboardInfo.type) {\r\n case ClipboardEventTypes.COPY:\r\n this._onCopyText(clipboardInfo.event);\r\n this.onTextCopyObservable.notifyObservers(this);\r\n break;\r\n case ClipboardEventTypes.CUT:\r\n this._onCutText(clipboardInfo.event);\r\n this.onTextCutObservable.notifyObservers(this);\r\n break;\r\n case ClipboardEventTypes.PASTE:\r\n this._onPasteText(clipboardInfo.event);\r\n this.onTextPasteObservable.notifyObservers(this);\r\n break;\r\n default:\r\n return;\r\n }\r\n });\r\n\r\n const scene = this._host.getScene();\r\n if (scene) {\r\n //register the pointer double tap event\r\n this._onPointerDblTapObserver = scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this._isFocused) {\r\n return;\r\n }\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOUBLETAP) {\r\n this._processDblClick(pointerInfo);\r\n }\r\n });\r\n }\r\n\r\n if (this._onFocusSelectAll) {\r\n this._selectAllText();\r\n }\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"InputText\";\r\n }\r\n\r\n /**\r\n * Function called to get the list of controls that should not steal the focus from this control\r\n * @returns an array of controls\r\n */\r\n public override keepsFocusWith(): Nullable<Control[]> {\r\n if (!this._connectedVirtualKeyboard) {\r\n return null;\r\n }\r\n return [this._connectedVirtualKeyboard];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public processKey(keyCode: number, key?: string, evt?: IKeyboardEvent) {\r\n if (this.isReadOnly) {\r\n return;\r\n }\r\n\r\n //return if clipboard event keys (i.e -ctr/cmd + c,v,x)\r\n if (evt && (evt.ctrlKey || evt.metaKey) && (keyCode === 67 || keyCode === 86 || keyCode === 88)) {\r\n return;\r\n }\r\n\r\n //select all\r\n if (evt && (evt.ctrlKey || evt.metaKey) && keyCode === 65) {\r\n this._selectAllText();\r\n evt.preventDefault();\r\n return;\r\n }\r\n // Specific cases\r\n switch (keyCode) {\r\n case 32: //SPACE\r\n key = \" \"; //ie11 key for space is \"Spacebar\"\r\n break;\r\n case 191: //SLASH\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n break;\r\n case 8: // BACKSPACE\r\n if (this._textWrapper.text && this._textWrapper.length > 0) {\r\n //delete the highlighted text\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n this._blinkIsEven = false;\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n }\r\n //delete single character\r\n if (this._cursorOffset === 0) {\r\n this.text = this._textWrapper.substring(0, this._textWrapper.length - 1);\r\n } else {\r\n const deletePosition = this._textWrapper.length - this._cursorOffset;\r\n if (deletePosition > 0) {\r\n this._textWrapper.removePart(deletePosition - 1, deletePosition);\r\n this._textHasChanged();\r\n }\r\n }\r\n }\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n case 46: // DELETE\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n }\r\n if (this._textWrapper.text && this._textWrapper.length > 0 && this._cursorOffset > 0) {\r\n const deletePosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(deletePosition, deletePosition + 1);\r\n this._textHasChanged();\r\n this._cursorOffset--;\r\n }\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n case 13: // RETURN\r\n this._host.focusedControl = null;\r\n this.isTextHighlightOn = false;\r\n return;\r\n case 35: // END\r\n this._cursorOffset = 0;\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case 36: // HOME\r\n this._cursorOffset = this._textWrapper.length;\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case 37: // LEFT\r\n this._cursorOffset++;\r\n if (this._cursorOffset > this._textWrapper.length) {\r\n this._cursorOffset = this._textWrapper.length;\r\n }\r\n\r\n if (evt && evt.shiftKey) {\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n // shift + ctrl/cmd + <-\r\n if (evt.ctrlKey || evt.metaKey) {\r\n if (!this.isTextHighlightOn) {\r\n if (this._textWrapper.length === this._cursorOffset) {\r\n return;\r\n } else {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset + 1;\r\n }\r\n }\r\n this._startHighlightIndex = 0;\r\n this._cursorIndex = this._textWrapper.length - this._endHighlightIndex;\r\n this._cursorOffset = this._textWrapper.length;\r\n this.isTextHighlightOn = true;\r\n this._markAsDirty();\r\n return;\r\n }\r\n //store the starting point\r\n if (!this.isTextHighlightOn) {\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._cursorOffset >= this._textWrapper.length ? this._textWrapper.length : this._cursorOffset - 1;\r\n }\r\n //if text is already highlighted\r\n else if (this._cursorIndex === -1) {\r\n this._cursorIndex = this._textWrapper.length - this._endHighlightIndex;\r\n this._cursorOffset = this._startHighlightIndex === 0 ? this._textWrapper.length : this._textWrapper.length - this._startHighlightIndex + 1;\r\n }\r\n //set the highlight indexes\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n }\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (this.isTextHighlightOn) {\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n this.isTextHighlightOn = false;\r\n }\r\n if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n this._cursorOffset = this._textWrapper.length;\r\n evt.preventDefault();\r\n }\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n return;\r\n case 39: // RIGHT\r\n this._cursorOffset--;\r\n if (this._cursorOffset < 0) {\r\n this._cursorOffset = 0;\r\n }\r\n if (evt && evt.shiftKey) {\r\n //update the cursor\r\n this._blinkIsEven = false;\r\n //shift + ctrl/cmd + ->\r\n if (evt.ctrlKey || evt.metaKey) {\r\n if (!this.isTextHighlightOn) {\r\n if (this._cursorOffset === 0) {\r\n return;\r\n } else {\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset - 1;\r\n }\r\n }\r\n this._endHighlightIndex = this._textWrapper.length;\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._textWrapper.length - this._startHighlightIndex;\r\n this._cursorOffset = 0;\r\n this._markAsDirty();\r\n return;\r\n }\r\n\r\n if (!this.isTextHighlightOn) {\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._cursorOffset <= 0 ? 0 : this._cursorOffset + 1;\r\n }\r\n //if text is already highlighted\r\n else if (this._cursorIndex === -1) {\r\n this._cursorIndex = this._textWrapper.length - this._startHighlightIndex;\r\n this._cursorOffset = this._textWrapper.length === this._endHighlightIndex ? 0 : this._textWrapper.length - this._endHighlightIndex - 1;\r\n }\r\n //set the highlight indexes\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n }\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (this.isTextHighlightOn) {\r\n this._cursorOffset = this._textWrapper.length - this._endHighlightIndex;\r\n this.isTextHighlightOn = false;\r\n }\r\n //ctr + ->\r\n if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n this._cursorOffset = 0;\r\n evt.preventDefault();\r\n }\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (keyCode === 32) {\r\n key = evt?.key ?? \" \";\r\n }\r\n this._deadKey = key === \"Dead\";\r\n // Printable characters\r\n if (\r\n key &&\r\n (keyCode === -1 || // Direct access\r\n keyCode === 32 || // Space\r\n keyCode === 34 || // \" add support for single and double quotes\r\n keyCode === 39 || // '\r\n (keyCode > 47 && keyCode < 64) || // Numbers\r\n (keyCode > 64 && keyCode < 91) || // Letters\r\n (keyCode > 159 && keyCode < 193) || // Special characters\r\n (keyCode > 218 && keyCode < 223) || // Special characters\r\n (keyCode > 95 && keyCode < 112))\r\n ) {\r\n // Numpad\r\n this._currentKey = key;\r\n this.onBeforeKeyAddObservable.notifyObservers(this);\r\n key = this._currentKey;\r\n if (this._addKey && !this._deadKey) {\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex, key);\r\n this._textHasChanged();\r\n this._cursorOffset = this._textWrapper.length - (this._startHighlightIndex + 1);\r\n this.isTextHighlightOn = false;\r\n this._blinkIsEven = false;\r\n this._markAsDirty();\r\n } else if (this._cursorOffset === 0) {\r\n this.text += this._deadKey && evt?.key ? evt.key : key;\r\n } else {\r\n const insertPosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(insertPosition, insertPosition, key);\r\n this._textHasChanged();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _updateValueFromCursorIndex(offset: number) {\r\n //update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (this._cursorIndex === -1) {\r\n this._cursorIndex = offset;\r\n } else {\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n }\r\n }\r\n this.isTextHighlightOn = true;\r\n this._markAsDirty();\r\n }\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _processDblClick(evt: PointerInfo) {\r\n //pre-find the start and end index of the word under cursor, speeds up the rendering\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._endHighlightIndex = this._startHighlightIndex;\r\n let moveLeft, moveRight;\r\n do {\r\n moveRight = this._endHighlightIndex < this._textWrapper.length && this._textWrapper.isWord(this._endHighlightIndex) ? ++this._endHighlightIndex : 0;\r\n moveLeft = this._startHighlightIndex > 0 && this._textWrapper.isWord(this._startHighlightIndex - 1) ? --this._startHighlightIndex : 0;\r\n } while (moveLeft || moveRight);\r\n\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n\r\n this.isTextHighlightOn = true;\r\n this._clickedCoordinate = null;\r\n this._blinkIsEven = true;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n }\r\n /** @internal */\r\n protected _selectAllText() {\r\n this._blinkIsEven = true;\r\n this.isTextHighlightOn = true;\r\n\r\n this._startHighlightIndex = 0;\r\n this._endHighlightIndex = this._textWrapper.length;\r\n this._cursorOffset = this._textWrapper.length;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public override processKeyboard(evt: IKeyboardEvent): void {\r\n // process pressed key\r\n this.processKey(evt.keyCode, evt.key, evt);\r\n\r\n super.processKeyboard(evt);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _onCopyText(ev: ClipboardEvent): void {\r\n this.isTextHighlightOn = false;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n this._host.clipboardData = this._highlightedText;\r\n }\r\n /**\r\n * @internal\r\n */\r\n protected _onCutText(ev: ClipboardEvent): void {\r\n if (!this._highlightedText) {\r\n return;\r\n }\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n\r\n this._host.clipboardData = this._highlightedText;\r\n this._highlightedText = \"\";\r\n }\r\n /**\r\n * @internal\r\n */\r\n protected _onPasteText(ev: ClipboardEvent): void {\r\n let data: string = \"\";\r\n if (ev.clipboardData && ev.clipboardData.types.indexOf(\"text/plain\") !== -1) {\r\n data = ev.clipboardData.getData(\"text/plain\");\r\n } else {\r\n //get the cached data; returns blank string by default\r\n data = this._host.clipboardData;\r\n }\r\n const insertPosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(insertPosition, insertPosition, data);\r\n this._textHasChanged();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n // Background\r\n if (this._isFocused) {\r\n if (this._focusedBackground) {\r\n context.fillStyle = this._isEnabled ? this._focusedBackground : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n } else if (this._background) {\r\n context.fillStyle = this._isEnabled ? this._background : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n if (!this._fontOffset || this._wasDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font, this._host.getScene()?.getEngine());\r\n }\r\n\r\n // Text\r\n const clipTextLeft = this._currentMeasure.left + this._margin.getValueInPixel(this._host, this._tempParentMeasure.width);\r\n if (this.color) {\r\n context.fillStyle = this.color;\r\n }\r\n\r\n let text = this._beforeRenderText(this._textWrapper);\r\n\r\n if (!this._isFocused && !this._textWrapper.text && this._placeholderText) {\r\n text = new TextWrapper();\r\n text.text = this._placeholderText;\r\n\r\n if (this._placeholderColor) {\r\n context.fillStyle = this._placeholderColor;\r\n }\r\n }\r\n\r\n this._textWidth = context.measureText(text.text).width;\r\n const marginWidth = this._margin.getValueInPixel(this._host, this._tempParentMeasure.width) * 2;\r\n if (this._autoStretchWidth) {\r\n this.width = Math.min(this._maxWidth.getValueInPixel(this._host, this._tempParentMeasure.width), this._textWidth + marginWidth) + \"px\";\r\n this._autoStretchWidth = true; // setting the width will have reset _autoStretchWidth to false!\r\n }\r\n\r\n const rootY = this._fontOffset.ascent + (this._currentMeasure.height - this._fontOffset.height) / 2;\r\n const availableWidth = this._width.getValueInPixel(this._host, this._tempParentMeasure.width) - marginWidth;\r\n\r\n context.save();\r\n context.beginPath();\r\n context.rect(clipTextLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, availableWidth + 2, this._currentMeasure.height);\r\n context.clip();\r\n\r\n if (this._isFocused && this._textWidth > availableWidth) {\r\n const textLeft = clipTextLeft - this._textWidth + availableWidth;\r\n if (!this._scrollLeft) {\r\n this._scrollLeft = textLeft;\r\n }\r\n } else {\r\n this._scrollLeft = clipTextLeft;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text.text, this._scrollLeft, this._currentMeasure.top + rootY);\r\n }\r\n\r\n context.fillText(text.text, this._scrollLeft, this._currentMeasure.top + rootY);\r\n\r\n // Cursor\r\n if (this._isFocused) {\r\n // Need to move cursor\r\n if (this._clickedCoordinate) {\r\n const rightPosition = this._scrollLeft + this._textWidth;\r\n const absoluteCursorPosition = rightPosition - this._clickedCoordinate;\r\n let currentSize = 0;\r\n this._cursorOffset = 0;\r\n let previousDist = 0;\r\n do {\r\n if (this._cursorOffset) {\r\n previousDist = Math.abs(absoluteCursorPosition - currentSize);\r\n }\r\n this._cursorOffset++;\r\n currentSize = context.measureText(text.substr(text.length - this._cursorOffset, this._cursorOffset)).width;\r\n } while (currentSize < absoluteCursorPosition && text.length >= this._cursorOffset);\r\n\r\n // Find closest move\r\n if (Math.abs(absoluteCursorPosition - currentSize) > previousDist) {\r\n this._cursorOffset--;\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._clickedCoordinate = null;\r\n }\r\n\r\n // Render cursor\r\n if (!this._blinkIsEven) {\r\n const cursorOffsetText = text.substr(text.length - this._cursorOffset);\r\n const cursorOffsetWidth = context.measureText(cursorOffsetText).width;\r\n let cursorLeft = this._scrollLeft + this._textWidth - cursorOffsetWidth;\r\n\r\n if (cursorLeft < clipTextLeft) {\r\n this._scrollLeft += clipTextLeft - cursorLeft;\r\n cursorLeft = clipTextLeft;\r\n this._markAsDirty();\r\n } else if (cursorLeft > clipTextLeft + availableWidth) {\r\n this._scrollLeft += clipTextLeft + availableWidth - cursorLeft;\r\n cursorLeft = clipTextLeft + availableWidth;\r\n this._markAsDirty();\r\n }\r\n if (!this.isTextHighlightOn) {\r\n context.fillRect(cursorLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, 2, this._fontOffset.height);\r\n }\r\n }\r\n\r\n clearTimeout(this._blinkTimeout);\r\n this._blinkTimeout = <any>setTimeout(() => {\r\n this._blinkIsEven = !this._blinkIsEven;\r\n this._markAsDirty();\r\n }, 500);\r\n\r\n //show the highlighted text\r\n if (this.isTextHighlightOn) {\r\n clearTimeout(this._blinkTimeout);\r\n const highlightCursorOffsetWidth = context.measureText(text.substring(this._startHighlightIndex)).width;\r\n let highlightCursorLeft = this._scrollLeft + this._textWidth - highlightCursorOffsetWidth;\r\n this._highlightedText = text.substring(this._startHighlightIndex, this._endHighlightIndex);\r\n let width = context.measureText(text.substring(this._startHighlightIndex, this._endHighlightIndex)).width;\r\n if (highlightCursorLeft < clipTextLeft) {\r\n width = width - (clipTextLeft - highlightCursorLeft);\r\n if (!width) {\r\n // when using left arrow on text.length > availableWidth;\r\n // assigns the width of the first letter after clipTextLeft\r\n width = context.measureText(text.charAt(text.length - this._cursorOffset)).width;\r\n }\r\n highlightCursorLeft = clipTextLeft;\r\n }\r\n //for transparancy\r\n context.globalAlpha = this._highligherOpacity;\r\n context.fillStyle = this._textHighlightColor;\r\n context.fillRect(highlightCursorLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, width, this._fontOffset.height);\r\n context.globalAlpha = 1.0;\r\n }\r\n }\r\n context.restore();\r\n\r\n // Border\r\n if (this._thickness) {\r\n if (this._isFocused) {\r\n if (this.focusedColor) {\r\n context.strokeStyle = this.focusedColor;\r\n }\r\n } else {\r\n if (this.color) {\r\n context.strokeStyle = this.color;\r\n }\r\n }\r\n\r\n context.lineWidth = this._thickness;\r\n\r\n context.strokeRect(\r\n this._currentMeasure.left + this._thickness / 2,\r\n this._currentMeasure.top + this._thickness / 2,\r\n this._currentMeasure.width - this._thickness,\r\n this._currentMeasure.height - this._thickness\r\n );\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n this._clickedCoordinate = coordinates.x;\r\n this.isTextHighlightOn = false;\r\n this._highlightedText = \"\";\r\n this._cursorIndex = -1;\r\n this._isPointerDown = true;\r\n this._host._capturingControl[pointerId] = this;\r\n this._focusedBy = (pi.event as IPointerEvent).pointerType;\r\n if (this._host.focusedControl === this) {\r\n // Move cursor\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n return true;\r\n }\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._host.focusedControl = this;\r\n\r\n return true;\r\n }\r\n public override _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\r\n if (this._host.focusedControl === this && this._isPointerDown && !this.isReadOnly) {\r\n this._clickedCoordinate = coordinates.x;\r\n this._markAsDirty();\r\n this._updateValueFromCursorIndex(this._cursorOffset);\r\n }\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n public override _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean): void {\r\n this._isPointerDown = false;\r\n delete this._host._capturingControl[pointerId];\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick);\r\n }\r\n\r\n protected _beforeRenderText(textWrapper: TextWrapper): TextWrapper {\r\n return textWrapper;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private set isTextHighlightOn(value: boolean) {\r\n if (this._isTextHighlightOn === value) {\r\n return;\r\n }\r\n if (value) {\r\n this.onTextHighlightObservable.notifyObservers(this);\r\n }\r\n this._isTextHighlightOn = value;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private get isTextHighlightOn(): boolean {\r\n return this._isTextHighlightOn;\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this.onBlurObservable.clear();\r\n this.onFocusObservable.clear();\r\n this.onTextChangedObservable.clear();\r\n this.onTextCopyObservable.clear();\r\n this.onTextCutObservable.clear();\r\n this.onTextPasteObservable.clear();\r\n this.onTextHighlightObservable.clear();\r\n this.onKeyboardEventProcessedObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.InputText\", InputText);\r\n"]}
|
@@ -289,7 +289,7 @@ export class InputTextArea extends InputText {
|
|
289
289
|
tmpIndex = this._cursorInfo.globalEndIndex;
|
290
290
|
relativeIndex = this._cursorInfo.relativeEndIndex;
|
291
291
|
}
|
292
|
-
const currentText = currentLine.text.
|
292
|
+
const currentText = currentLine.text.substring(0, relativeIndex);
|
293
293
|
const currentWidth = this._contextForBreakLines.measureText(currentText).width;
|
294
294
|
let upperWidth = 0;
|
295
295
|
let previousWidth = 0;
|
@@ -300,7 +300,7 @@ export class InputTextArea extends InputText {
|
|
300
300
|
tmpIndex++;
|
301
301
|
upperLineRelativeIndex++;
|
302
302
|
previousWidth = Math.abs(currentWidth - upperWidth);
|
303
|
-
upperWidth = this._contextForBreakLines.measureText(upperLine.text.
|
303
|
+
upperWidth = this._contextForBreakLines.measureText(upperLine.text.substring(0, upperLineRelativeIndex)).width;
|
304
304
|
}
|
305
305
|
// Find closest move
|
306
306
|
if (Math.abs(currentWidth - upperWidth) > previousWidth && upperLineRelativeIndex > 0) {
|
@@ -355,7 +355,7 @@ export class InputTextArea extends InputText {
|
|
355
355
|
tmpIndex = this._cursorInfo.globalEndIndex;
|
356
356
|
relativeIndex = this._cursorInfo.relativeEndIndex;
|
357
357
|
}
|
358
|
-
const currentText = currentLine.text.
|
358
|
+
const currentText = currentLine.text.substring(0, relativeIndex);
|
359
359
|
const currentWidth = this._contextForBreakLines.measureText(currentText).width;
|
360
360
|
let underWidth = 0;
|
361
361
|
let previousWidth = 0;
|
@@ -365,7 +365,7 @@ export class InputTextArea extends InputText {
|
|
365
365
|
tmpIndex++;
|
366
366
|
underLineRelativeIndex++;
|
367
367
|
previousWidth = Math.abs(currentWidth - underWidth);
|
368
|
-
underWidth = this._contextForBreakLines.measureText(underLine.text.
|
368
|
+
underWidth = this._contextForBreakLines.measureText(underLine.text.substring(0, underLineRelativeIndex)).width;
|
369
369
|
}
|
370
370
|
// Find closest move
|
371
371
|
if (Math.abs(currentWidth - underWidth) > previousWidth && underLineRelativeIndex > 0) {
|
@@ -726,7 +726,7 @@ export class InputTextArea extends InputText {
|
|
726
726
|
if (this._isFocused) {
|
727
727
|
// Render cursor
|
728
728
|
if (!this._blinkIsEven || this._isTextHighlightOn) {
|
729
|
-
let cursorLeft = this._scrollLeft + context.measureText(this._lines[this._cursorInfo.currentLineIndex].text.
|
729
|
+
let cursorLeft = this._scrollLeft + context.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substring(0, this._cursorInfo.relativeStartIndex)).width;
|
730
730
|
if (cursorLeft < this._clipTextLeft) {
|
731
731
|
this._scrollLeft += this._clipTextLeft - cursorLeft;
|
732
732
|
cursorLeft = this._clipTextLeft;
|
@@ -778,7 +778,7 @@ export class InputTextArea extends InputText {
|
|
778
778
|
}
|
779
779
|
const begin = i === startLineIndex ? this._cursorInfo.relativeStartIndex : 0;
|
780
780
|
const end = i === endLineIndex ? this._cursorInfo.relativeEndIndex : line.text.length;
|
781
|
-
const leftOffsetWidth = context.measureText(line.text.
|
781
|
+
const leftOffsetWidth = context.measureText(line.text.substring(0, begin)).width;
|
782
782
|
const selectedText = line.text.substring(begin, end);
|
783
783
|
const hightlightWidth = context.measureText(selectedText).width;
|
784
784
|
context.fillRect(highlightRootX + leftOffsetWidth, highlightRootY, hightlightWidth, this._fontOffset.height);
|
@@ -897,7 +897,7 @@ export class InputTextArea extends InputText {
|
|
897
897
|
while (currentSize < relativeXPosition && this._lines[this._cursorInfo.currentLineIndex].text.length > relativeIndex) {
|
898
898
|
relativeIndex++;
|
899
899
|
previousDist = Math.abs(relativeXPosition - currentSize);
|
900
|
-
currentSize = this._contextForBreakLines.measureText(this._lines[this._cursorInfo.currentLineIndex].text.
|
900
|
+
currentSize = this._contextForBreakLines.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substring(0, relativeIndex)).width;
|
901
901
|
}
|
902
902
|
// Find closest move
|
903
903
|
if (Math.abs(relativeXPosition - currentSize) > previousDist && relativeIndex > 0) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"inputTextArea.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/inputTextArea.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport type { VirtualKeyboard } from \"./virtualKeyboard\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport type { Measure } from \"../measure\";\r\nimport { InputText } from \"./inputText\";\r\nimport type { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport type { PointerInfo, PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport type { IKeyboardEvent } from \"core/Events/deviceInputEvents\";\r\n\r\nimport { serialize } from \"core/Misc/decorators\";\r\n\r\n/**\r\n * Class used to create input text control\r\n */\r\nexport class InputTextArea extends InputText {\r\n private _textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n private _textVerticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n private _prevText: string = this.text;\r\n\r\n private _lines: any[];\r\n private _lineSpacing: ValueAndUnit = new ValueAndUnit(0);\r\n private _maxHeight = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n\r\n private _clipTextTop: number;\r\n private _clipTextLeft: number;\r\n\r\n private _cursorInfo: { globalStartIndex: number; globalEndIndex: number; relativeStartIndex: number; relativeEndIndex: number; currentLineIndex: number };\r\n private _highlightCursorInfo: { initialStartIndex: number; initialRelativeStartIndex: number; initialLineIndex: number };\r\n\r\n /**\r\n * An event triggered after the text was broken up into lines\r\n */\r\n public onLinesReadyObservable = new Observable<InputTextArea>();\r\n\r\n /** @internal */\r\n public override _connectedVirtualKeyboard: Nullable<VirtualKeyboard>;\r\n private _contextForBreakLines: ICanvasRenderingContext;\r\n private _clickedCoordinateX: Nullable<number>;\r\n private _clickedCoordinateY: Nullable<number>;\r\n\r\n private _availableWidth: number;\r\n private _availableHeight: number;\r\n\r\n private _scrollTop: Nullable<number>;\r\n\r\n private _autoStretchHeight: boolean;\r\n\r\n /** Gets or sets a boolean indicating if the control can auto stretch its height to adapt to the text */\r\n @serialize()\r\n public get autoStretchHeight(): boolean {\r\n return this._autoStretchHeight;\r\n }\r\n\r\n public set autoStretchHeight(value: boolean) {\r\n if (this._autoStretchHeight === value) {\r\n return;\r\n }\r\n\r\n this._autoStretchHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n public override set height(value: string | number) {\r\n this.fixedRatioMasterIsWidth = false;\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n\r\n this._autoStretchHeight = false;\r\n }\r\n\r\n @serialize()\r\n public get maxHeight(): string | number {\r\n return this._maxHeight.toString(this._host);\r\n }\r\n\r\n /** Gets the maximum width allowed by the control in pixels */\r\n public get maxHeightInPixels(): number {\r\n return this._maxHeight.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set maxHeight(value: string | number) {\r\n if (this._maxHeight.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._maxHeight.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new InputTextArea\r\n * @param name defines the control name\r\n * @param text defines the text of the control\r\n */\r\n constructor(\r\n public override name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n\r\n this.isPointerBlocker = true;\r\n\r\n this.onLinesReadyObservable.add(() => this._updateCursorPosition());\r\n\r\n this._highlightCursorInfo = {\r\n initialStartIndex: -1,\r\n initialRelativeStartIndex: -1,\r\n initialLineIndex: -1,\r\n };\r\n\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: 0,\r\n relativeEndIndex: 0,\r\n relativeStartIndex: 0,\r\n currentLineIndex: 0,\r\n };\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"InputTextArea\";\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public override processKeyboard(evt: IKeyboardEvent): void {\r\n if (this.isReadOnly) {\r\n return;\r\n }\r\n\r\n // process pressed key\r\n this.alternativeProcessKey(evt.code, evt.key, evt);\r\n\r\n this.onKeyboardEventProcessedObservable.notifyObservers(evt);\r\n }\r\n\r\n /**\r\n * Process the last keyboard input\r\n *\r\n * @param code The ascii input number\r\n * @param key The key string representation\r\n * @param evt The keyboard event emits with input\r\n * @internal\r\n */\r\n public alternativeProcessKey(code: string, key?: string, evt?: IKeyboardEvent) {\r\n //return if clipboard event keys (i.e -ctr/cmd + c,v,x)\r\n if (evt && (evt.ctrlKey || evt.metaKey) && (key === \"c\" || key === \"v\" || key === \"x\")) {\r\n return;\r\n }\r\n\r\n // Specific cases\r\n switch (code) {\r\n case \"Period\": //SLASH\r\n if (evt && evt.shiftKey) {\r\n evt.preventDefault();\r\n }\r\n break;\r\n case \"Backspace\": // BACKSPACE\r\n if (!this._isTextHighlightOn && this._cursorInfo.globalStartIndex > 0) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n break;\r\n case \"Delete\": // DELETE\r\n if (!this._isTextHighlightOn && this._cursorInfo.globalEndIndex < this.text.length) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex + 1;\r\n }\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n break;\r\n case \"NumpadEnter\": // NUMPAD ENTER\r\n case \"Enter\": // RETURN\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, \"\\n\");\r\n this._cursorInfo.globalStartIndex++;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n return;\r\n case \"End\": // END\r\n this._cursorInfo.globalStartIndex = this.text.length;\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case \"Home\": // HOME\r\n this._cursorInfo.globalStartIndex = 0;\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case \"ArrowLeft\": // LEFT\r\n this._markAsDirty();\r\n\r\n if (evt && evt.shiftKey) {\r\n // shift + ctrl/cmd + <-\r\n if (evt.ctrlKey || evt.metaKey) {\r\n // Go to line's start by substract the relativeStartIndex to the globalStartIndex\r\n this._cursorInfo.globalStartIndex -= this._cursorInfo.relativeStartIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n // store the starting point\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex--;\r\n this._isTextHighlightOn = true;\r\n } else {\r\n if (this._cursorInfo.globalEndIndex > this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalEndIndex--;\r\n } else {\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n }\r\n this._blinkIsEven = true;\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n if (this._isTextHighlightOn) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n } else if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n // ctr + <-\r\n this._cursorInfo.globalStartIndex -= this._cursorInfo.relativeStartIndex;\r\n evt.preventDefault();\r\n } else if (this._cursorInfo.globalStartIndex > 0) {\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n return;\r\n case \"ArrowRight\": // RIGHT\r\n this._markAsDirty();\r\n\r\n if (evt && evt.shiftKey) {\r\n // shift + ctrl/cmd + ->\r\n if (evt.ctrlKey || evt.metaKey) {\r\n const rightDelta = this._lines[this._cursorInfo.currentLineIndex].text.length - this._cursorInfo.relativeEndIndex - 1;\r\n this._cursorInfo.globalEndIndex += rightDelta;\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n // store the starting point\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalEndIndex++;\r\n this._isTextHighlightOn = true;\r\n } else {\r\n if (this._cursorInfo.globalStartIndex < this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalStartIndex++;\r\n } else {\r\n this._cursorInfo.globalEndIndex++;\r\n }\r\n }\r\n this._blinkIsEven = true;\r\n evt.preventDefault();\r\n return;\r\n }\r\n if (this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = this._cursorInfo.globalEndIndex;\r\n } else if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n //ctr + ->\r\n const rightDelta = this._lines[this._cursorInfo.currentLineIndex].text.length - this._cursorInfo.relativeEndIndex;\r\n this._cursorInfo.globalStartIndex += rightDelta;\r\n } else if (this._cursorInfo.globalStartIndex < this.text.length) {\r\n this._cursorInfo.globalStartIndex++;\r\n }\r\n\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n return;\r\n case \"ArrowUp\": // UP\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (evt) {\r\n if (evt.shiftKey) {\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n }\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n } else {\r\n this._isTextHighlightOn = false;\r\n }\r\n evt.preventDefault();\r\n }\r\n\r\n if (this._cursorInfo.currentLineIndex === 0) {\r\n // First line\r\n this._cursorInfo.globalStartIndex = 0;\r\n } else {\r\n const currentLine = this._lines[this._cursorInfo.currentLineIndex];\r\n const upperLine = this._lines[this._cursorInfo.currentLineIndex - 1];\r\n\r\n let tmpIndex = 0;\r\n let relativeIndex = 0;\r\n if (!this._isTextHighlightOn || this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n tmpIndex = this._cursorInfo.globalStartIndex;\r\n relativeIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n tmpIndex = this._cursorInfo.globalEndIndex;\r\n relativeIndex = this._cursorInfo.relativeEndIndex;\r\n }\r\n\r\n const currentText = currentLine.text.substr(0, relativeIndex);\r\n const currentWidth = this._contextForBreakLines.measureText(currentText).width;\r\n\r\n let upperWidth = 0;\r\n let previousWidth = 0;\r\n\r\n tmpIndex -= relativeIndex; // Start of current line\r\n tmpIndex -= upperLine.text.length + upperLine.lineEnding.length; // Start of upper line\r\n let upperLineRelativeIndex = 0;\r\n\r\n while (upperWidth < currentWidth && upperLineRelativeIndex < upperLine.text.length) {\r\n tmpIndex++;\r\n upperLineRelativeIndex++;\r\n previousWidth = Math.abs(currentWidth - upperWidth);\r\n upperWidth = this._contextForBreakLines.measureText(upperLine.text.substr(0, upperLineRelativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(currentWidth - upperWidth) > previousWidth && upperLineRelativeIndex > 0) {\r\n tmpIndex--;\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n } else if (this._cursorInfo.currentLineIndex <= this._highlightCursorInfo.initialLineIndex) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n } else {\r\n this._cursorInfo.globalEndIndex = tmpIndex;\r\n }\r\n }\r\n\r\n this._markAsDirty();\r\n return;\r\n case \"ArrowDown\": // DOWN\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (evt) {\r\n if (evt.shiftKey) {\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n }\r\n\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n } else {\r\n this._isTextHighlightOn = false;\r\n }\r\n evt.preventDefault();\r\n }\r\n\r\n if (this._cursorInfo.currentLineIndex === this._lines.length - 1) {\r\n // Last line\r\n this._cursorInfo.globalStartIndex = this.text.length;\r\n } else {\r\n const currentLine = this._lines[this._cursorInfo.currentLineIndex];\r\n const underLine = this._lines[this._cursorInfo.currentLineIndex + 1];\r\n\r\n let tmpIndex = 0;\r\n let relativeIndex = 0;\r\n if (!this._isTextHighlightOn || this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n tmpIndex = this._cursorInfo.globalStartIndex;\r\n relativeIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n tmpIndex = this._cursorInfo.globalEndIndex;\r\n relativeIndex = this._cursorInfo.relativeEndIndex;\r\n }\r\n\r\n const currentText = currentLine.text.substr(0, relativeIndex);\r\n const currentWidth = this._contextForBreakLines.measureText(currentText).width;\r\n\r\n let underWidth = 0;\r\n let previousWidth = 0;\r\n\r\n tmpIndex += currentLine.text.length - relativeIndex + currentLine.lineEnding.length; // Start of current line\r\n let underLineRelativeIndex = 0;\r\n\r\n while (underWidth < currentWidth && underLineRelativeIndex < underLine.text.length) {\r\n tmpIndex++;\r\n underLineRelativeIndex++;\r\n previousWidth = Math.abs(currentWidth - underWidth);\r\n underWidth = this._contextForBreakLines.measureText(underLine.text.substr(0, underLineRelativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(currentWidth - underWidth) > previousWidth && underLineRelativeIndex > 0) {\r\n tmpIndex--;\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n } else if (this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n if (this._cursorInfo.globalStartIndex > this._cursorInfo.globalEndIndex) {\r\n this._cursorInfo.globalEndIndex += this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex = this._cursorInfo.globalEndIndex - this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalEndIndex -= this._cursorInfo.globalStartIndex;\r\n }\r\n } else {\r\n this._cursorInfo.globalEndIndex = tmpIndex;\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n }\r\n\r\n this._markAsDirty();\r\n return;\r\n }\r\n\r\n // special case - select all. Use key instead of code to support all keyboard layouts\r\n if (key === \"a\" && evt && (evt.ctrlKey || evt.metaKey)) {\r\n this._selectAllText();\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n // Printable characters\r\n if (key?.length === 1) {\r\n evt?.preventDefault();\r\n this._currentKey = key;\r\n this.onBeforeKeyAddObservable.notifyObservers(this);\r\n key = this._currentKey;\r\n if (this._addKey) {\r\n this._isTextHighlightOn = false;\r\n this._blinkIsEven = false;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, key);\r\n this._cursorInfo.globalStartIndex += key.length;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this._textHasChanged();\r\n }\r\n }\r\n }\r\n\r\n protected _parseLineWordWrap(line: string = \"\", width: number, context: ICanvasRenderingContext): { text: string; width: number; lineEnding: string }[] {\r\n const lines = [];\r\n const words = line.split(\" \");\r\n let lineWidth = 0;\r\n\r\n for (let n = 0; n < words.length; n++) {\r\n const testLine = n > 0 ? line + \" \" + words[n] : words[0];\r\n const metrics = context.measureText(testLine);\r\n const testWidth = metrics.width;\r\n if (testWidth > width) {\r\n if (n > 0) {\r\n // Avoid first word duplication if of too long\r\n lineWidth = context.measureText(line).width;\r\n lines.push({ text: line, width: lineWidth, lineEnding: \" \" });\r\n }\r\n\r\n line = words[n];\r\n\r\n let flushedLine = \"\";\r\n\r\n line.split(\"\").map((char) => {\r\n if (context.measureText(flushedLine + char).width > width) {\r\n lines.push({ text: flushedLine, width: context.measureText(flushedLine).width, lineEnding: \"\" });\r\n flushedLine = \"\";\r\n }\r\n flushedLine += char;\r\n });\r\n\r\n line = flushedLine;\r\n // Measure remaining characters\r\n lineWidth = context.measureText(line).width;\r\n } else {\r\n lineWidth = testWidth;\r\n line = testLine;\r\n }\r\n }\r\n lines.push({ text: line, width: lineWidth, lineEnding: \" \" });\r\n\r\n return lines;\r\n }\r\n\r\n protected _breakLines(refWidth: number, context: ICanvasRenderingContext): object[] {\r\n const lines: { text: string; width: number; lineEnding: string }[] = [];\r\n const _lines = (this.text || this.placeholderText).split(\"\\n\");\r\n\r\n if (this.clipContent) {\r\n for (const _line of _lines) {\r\n lines.push(...this._parseLineWordWrap(_line, refWidth, context));\r\n }\r\n } else {\r\n for (const _line of _lines) {\r\n lines.push(this._parseLine(_line, context));\r\n }\r\n }\r\n\r\n lines[lines.length - 1].lineEnding = \"\\n\";\r\n\r\n return lines;\r\n }\r\n\r\n protected _parseLine(line: string = \"\", context: ICanvasRenderingContext): { text: string; width: number; lineEnding: string } {\r\n return { text: line, width: context.measureText(line).width, lineEnding: \" \" };\r\n }\r\n\r\n /**\r\n * Processing of child right before the parent measurement update\r\n *\r\n * @param parentMeasure The parent measure\r\n * @param context The rendering canvas\r\n * @internal\r\n */\r\n protected override _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (!this._fontOffset || this._wasDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font, this._host.getScene()?.getEngine());\r\n }\r\n\r\n let text = this._beforeRenderText(this._textWrapper).text;\r\n\r\n // placeholder conditions and color setting\r\n if (!this.text && this._placeholderText) {\r\n text = this._placeholderText;\r\n }\r\n\r\n // measures the textlength -> this.measure.width\r\n this._textWidth = context.measureText(text).width;\r\n // we double up the margin width\r\n const marginWidth = this._margin.getValueInPixel(this._host, parentMeasure.width) * 2;\r\n\r\n if (this._autoStretchWidth) {\r\n const tmpLines = text.split(\"\\n\");\r\n const longerString = tmpLines.reduce((acc: string, val: string) => {\r\n const valueLength = context.measureText(val).width;\r\n const accLength = context.measureText(acc).width;\r\n return valueLength > accLength ? val : acc;\r\n }, \"\");\r\n\r\n const longerStringWidth = context.measureText(longerString).width;\r\n this.width = Math.min(this._maxWidth.getValueInPixel(this._host, parentMeasure.width), longerStringWidth + marginWidth) + \"px\";\r\n\r\n this.autoStretchWidth = true;\r\n }\r\n\r\n this._availableWidth = this._width.getValueInPixel(this._host, parentMeasure.width) - marginWidth;\r\n\r\n // Prepare lines\r\n this._lines = this._breakLines(this._availableWidth, context);\r\n // can we find a cleaner implementation here?\r\n this._contextForBreakLines = context;\r\n\r\n if (this._autoStretchHeight) {\r\n const textHeight = this._lines.length * this._fontOffset.height;\r\n const totalHeight = textHeight + this._margin.getValueInPixel(this._host, parentMeasure.height) * 2;\r\n this.height = Math.min(this._maxHeight.getValueInPixel(this._host, parentMeasure.height), totalHeight) + \"px\";\r\n\r\n this._autoStretchHeight = true;\r\n }\r\n\r\n this._availableHeight = this._height.getValueInPixel(this._host, parentMeasure.height) - marginWidth;\r\n\r\n if (this._isFocused) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n\r\n let lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n let tmpLength = 0;\r\n\r\n while (tmpLength + lineLength <= this._cursorInfo.globalStartIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected override _textHasChanged() {\r\n if (!this._prevText && this._textWrapper.text && this.placeholderText) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n this._cursorInfo.globalStartIndex = 1;\r\n this._cursorInfo.globalEndIndex = 1;\r\n this._cursorInfo.relativeStartIndex = 1;\r\n this._cursorInfo.relativeEndIndex = 1;\r\n }\r\n super._textHasChanged();\r\n }\r\n\r\n private _computeScroll() {\r\n this._clipTextLeft = this._currentMeasure.left + this._margin.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n this._clipTextTop = this._currentMeasure.top + this._margin.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n\r\n if (this._isFocused && this._lines[this._cursorInfo.currentLineIndex].width > this._availableWidth) {\r\n const textLeft = this._clipTextLeft - this._lines[this._cursorInfo.currentLineIndex].width + this._availableWidth;\r\n\r\n if (!this._scrollLeft) {\r\n this._scrollLeft = textLeft;\r\n }\r\n } else {\r\n this._scrollLeft = this._clipTextLeft;\r\n }\r\n\r\n if (this._isFocused) {\r\n const selectedHeight = (this._cursorInfo.currentLineIndex + 1) * this._fontOffset.height;\r\n const textTop = this._clipTextTop - selectedHeight;\r\n\r\n if (!this._scrollTop) {\r\n this._scrollTop = textTop;\r\n }\r\n } else {\r\n this._scrollTop = this._clipTextTop;\r\n }\r\n }\r\n\r\n /**\r\n * Processing of child after the parent measurement update\r\n *\r\n * @internal\r\n */\r\n protected override _additionalProcessing(): void {\r\n // Flush the highlighted text each frame\r\n this.highlightedText = \"\";\r\n\r\n this.onLinesReadyObservable.notifyObservers(this);\r\n }\r\n\r\n private _drawText(text: string, textWidth: number, y: number, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n let x = this._scrollLeft as number;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x += 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x += width - textWidth;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x += (width - textWidth) / 2;\r\n break;\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text, this._currentMeasure.left + x, y);\r\n }\r\n context.fillText(text, x, y);\r\n }\r\n\r\n /**\r\n * Copy the text in the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onCopyText(ev: ClipboardEvent): void {\r\n this._isTextHighlightOn = false;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n this._host.clipboardData = this._highlightedText;\r\n }\r\n\r\n /**\r\n * Cut the text and copy it in the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onCutText(ev: ClipboardEvent): void {\r\n if (!this._highlightedText) {\r\n return;\r\n }\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n\r\n this._host.clipboardData = this._highlightedText;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._textHasChanged();\r\n }\r\n\r\n /**\r\n * Paste the copied text from the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onPasteText(ev: ClipboardEvent): void {\r\n let data: string = \"\";\r\n if (ev.clipboardData && ev.clipboardData.types.indexOf(\"text/plain\") !== -1) {\r\n data = ev.clipboardData.getData(\"text/plain\");\r\n } else {\r\n //get the cached data; returns blank string by default\r\n data = this._host.clipboardData;\r\n }\r\n\r\n this._isTextHighlightOn = false;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, data);\r\n\r\n const deltaIndex = data.length - (this._cursorInfo.globalEndIndex - this._cursorInfo.globalStartIndex);\r\n\r\n this._cursorInfo.globalStartIndex += deltaIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._clickedCoordinateX = null;\r\n this._clickedCoordinateY = null;\r\n\r\n super._textHasChanged();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n this._computeScroll();\r\n\r\n this._scrollLeft = this._scrollLeft ?? 0;\r\n this._scrollTop = this._scrollTop ?? 0;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n // Background\r\n if (this._isFocused) {\r\n if (this._focusedBackground) {\r\n context.fillStyle = this._isEnabled ? this._focusedBackground : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n } else if (this._background) {\r\n context.fillStyle = this._isEnabled ? this._background : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n // sets the color of the rectangle (border if background available)\r\n if (this.color) {\r\n context.fillStyle = this.color;\r\n }\r\n\r\n const height = this._currentMeasure.height;\r\n const width = this._currentMeasure.width;\r\n let rootY = 0;\r\n\r\n switch (this._textVerticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n rootY = this._fontOffset.ascent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n rootY = height - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n rootY = this._fontOffset.ascent + (height - this._fontOffset.height * this._lines.length) / 2;\r\n break;\r\n }\r\n\r\n context.save();\r\n context.beginPath();\r\n context.fillStyle = this.fontStyle;\r\n if (!this._textWrapper.text && this.placeholderText) {\r\n context.fillStyle = this._placeholderColor;\r\n }\r\n // here we define the visible reactangle to clip it in next line\r\n context.rect(this._clipTextLeft, this._clipTextTop, this._availableWidth + 2, this._availableHeight + 2);\r\n context.clip();\r\n\r\n // Text\r\n rootY += this._scrollTop;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (i !== 0 && this._lineSpacing.internalValue !== 0) {\r\n if (this._lineSpacing.isPixel) {\r\n rootY += this._lineSpacing.getValue(this._host);\r\n } else {\r\n rootY = rootY + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n }\r\n\r\n this._drawText(line.text, line.width, rootY, context);\r\n rootY += this._fontOffset.height;\r\n }\r\n\r\n context.restore();\r\n\r\n // Cursor\r\n if (this._isFocused) {\r\n // Render cursor\r\n if (!this._blinkIsEven || this._isTextHighlightOn) {\r\n let cursorLeft = this._scrollLeft + context.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substr(0, this._cursorInfo.relativeStartIndex)).width;\r\n\r\n if (cursorLeft < this._clipTextLeft) {\r\n this._scrollLeft += this._clipTextLeft - cursorLeft;\r\n cursorLeft = this._clipTextLeft;\r\n this._markAsDirty();\r\n } else if (cursorLeft > this._clipTextLeft + this._availableWidth) {\r\n this._scrollLeft += this._clipTextLeft + this._availableWidth - cursorLeft;\r\n cursorLeft = this._clipTextLeft + this._availableWidth;\r\n this._markAsDirty();\r\n }\r\n\r\n let cursorTop = this._scrollTop + this._cursorInfo.currentLineIndex * this._fontOffset.height; //cursorTop distance from top to cursor start\r\n\r\n if (cursorTop < this._clipTextTop) {\r\n this._scrollTop += this._clipTextTop - cursorTop;\r\n cursorTop = this._clipTextTop;\r\n this._markAsDirty();\r\n } else if (cursorTop + this._fontOffset.height > this._clipTextTop + this._availableHeight && this._availableHeight > this._fontOffset.height) {\r\n this._scrollTop += this._clipTextTop + this._availableHeight - cursorTop - this._fontOffset.height;\r\n cursorTop = this._clipTextTop + this._availableHeight - this._fontOffset.height;\r\n this._markAsDirty();\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n context.fillRect(cursorLeft, cursorTop, 2, this._fontOffset.height);\r\n }\r\n }\r\n\r\n this._resetBlinking();\r\n\r\n //show the highlighted text\r\n if (this._isTextHighlightOn) {\r\n clearTimeout(this._blinkTimeout);\r\n\r\n this._highlightedText = this.text.substring(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n context.globalAlpha = this._highligherOpacity;\r\n context.fillStyle = this._textHighlightColor;\r\n\r\n const startLineIndex = Math.min(this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialLineIndex);\r\n const endLineIndex = Math.max(this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialLineIndex);\r\n\r\n let highlightRootY = this._scrollTop + startLineIndex * this._fontOffset.height;\r\n\r\n for (let i = startLineIndex; i <= endLineIndex; i++) {\r\n const line = this._lines[i];\r\n\r\n let highlightRootX = this._scrollLeft as number;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n highlightRootX += 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n highlightRootX += width - line.width;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n highlightRootX += (width - line.width) / 2;\r\n break;\r\n }\r\n\r\n const begin = i === startLineIndex ? this._cursorInfo.relativeStartIndex : 0;\r\n const end = i === endLineIndex ? this._cursorInfo.relativeEndIndex : line.text.length;\r\n\r\n const leftOffsetWidth = context.measureText(line.text.substr(0, begin)).width;\r\n const selectedText = line.text.substring(begin, end);\r\n const hightlightWidth = context.measureText(selectedText).width;\r\n\r\n context.fillRect(highlightRootX + leftOffsetWidth, highlightRootY, hightlightWidth, this._fontOffset.height);\r\n\r\n highlightRootY += this._fontOffset.height;\r\n }\r\n\r\n if (this._cursorInfo.globalEndIndex === this._cursorInfo.globalStartIndex) {\r\n this._resetBlinking();\r\n }\r\n }\r\n }\r\n\r\n context.restore();\r\n\r\n // Border\r\n if (this._thickness) {\r\n if (this._isFocused) {\r\n if (this.focusedColor) {\r\n context.strokeStyle = this.focusedColor;\r\n }\r\n } else {\r\n if (this.color) {\r\n context.strokeStyle = this.color;\r\n }\r\n }\r\n\r\n context.lineWidth = this._thickness;\r\n\r\n context.strokeRect(\r\n this._currentMeasure.left + this._thickness / 2,\r\n this._currentMeasure.top + this._thickness / 2,\r\n this._currentMeasure.width - this._thickness,\r\n this._currentMeasure.height - this._thickness\r\n );\r\n }\r\n }\r\n\r\n private _resetBlinking() {\r\n clearTimeout(this._blinkTimeout);\r\n this._blinkTimeout = <any>setTimeout(() => {\r\n this._blinkIsEven = !this._blinkIsEven;\r\n this._markAsDirty();\r\n }, 500);\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n this._clickedCoordinateX = coordinates.x;\r\n this._clickedCoordinateY = coordinates.y;\r\n\r\n this._isTextHighlightOn = false;\r\n this._highlightedText = \"\";\r\n this._isPointerDown = true;\r\n this._host._capturingControl[pointerId] = this;\r\n if (this._host.focusedControl === this) {\r\n // Move cursor\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n return true;\r\n }\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._host.focusedControl = this;\r\n\r\n return true;\r\n }\r\n\r\n // for textselection\r\n public override _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\r\n // Avoid Chromium-like beahavior when this event is fired right after onPointerDown\r\n if (pi.event.movementX === 0 && pi.event.movementY === 0) {\r\n return;\r\n }\r\n\r\n if (this._host.focusedControl === this && this._isPointerDown && !this.isReadOnly) {\r\n this._clickedCoordinateX = coordinates.x;\r\n this._clickedCoordinateY = coordinates.y;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._isTextHighlightOn = true;\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n /**\r\n * Apply the correct position of cursor according to current modification\r\n */\r\n private _updateCursorPosition() {\r\n if (!this._isFocused) {\r\n return;\r\n }\r\n\r\n if (!this._textWrapper.text && this.placeholderText) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n this._cursorInfo.globalStartIndex = 0;\r\n this._cursorInfo.globalEndIndex = 0;\r\n this._cursorInfo.relativeStartIndex = 0;\r\n this._cursorInfo.relativeEndIndex = 0;\r\n } else {\r\n if (this._clickedCoordinateX && this._clickedCoordinateY) {\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: 0,\r\n relativeStartIndex: 0,\r\n relativeEndIndex: 0,\r\n currentLineIndex: 0,\r\n };\r\n }\r\n\r\n let globalIndex = 0;\r\n let relativeIndex = 0;\r\n\r\n const lastClickedCoordinateY = this._clickedCoordinateY - (this._scrollTop as number);\r\n\r\n const relativeCoordinateY = Math.floor(lastClickedCoordinateY / this._fontOffset.height);\r\n this._cursorInfo.currentLineIndex = Math.min(Math.max(relativeCoordinateY, 0), this._lines.length - 1);\r\n\r\n let currentSize = 0;\r\n\r\n const relativeXPosition = this._clickedCoordinateX - (this._scrollLeft ?? 0);\r\n\r\n let previousDist = 0;\r\n\r\n for (let index = 0; index < this._cursorInfo.currentLineIndex; index++) {\r\n const line = this._lines[index];\r\n globalIndex += line.text.length + line.lineEnding.length;\r\n }\r\n\r\n while (currentSize < relativeXPosition && this._lines[this._cursorInfo.currentLineIndex].text.length > relativeIndex) {\r\n relativeIndex++;\r\n previousDist = Math.abs(relativeXPosition - currentSize);\r\n currentSize = this._contextForBreakLines.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substr(0, relativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(relativeXPosition - currentSize) > previousDist && relativeIndex > 0) {\r\n relativeIndex--;\r\n }\r\n\r\n globalIndex += relativeIndex;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = globalIndex;\r\n this._cursorInfo.relativeStartIndex = relativeIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n if (globalIndex < this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalStartIndex = globalIndex;\r\n this._cursorInfo.relativeStartIndex = relativeIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n } else {\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeStartIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n this._cursorInfo.globalEndIndex = globalIndex;\r\n this._cursorInfo.relativeEndIndex = relativeIndex;\r\n }\r\n }\r\n\r\n // Avoid the caret during highlighting\r\n this._blinkIsEven = this._isTextHighlightOn;\r\n this._clickedCoordinateX = null;\r\n this._clickedCoordinateY = null;\r\n } else {\r\n // Standard behavior same as Current line is at least above the initial highlight index\r\n this._cursorInfo.relativeStartIndex = 0;\r\n this._cursorInfo.currentLineIndex = 0;\r\n\r\n let lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n let tmpLength = 0;\r\n\r\n while (tmpLength + lineLength <= this._cursorInfo.globalStartIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n\r\n this._cursorInfo.relativeStartIndex = this._cursorInfo.globalStartIndex - tmpLength;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.relativeStartIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n } else if (this._highlightCursorInfo.initialStartIndex !== -1 && this._cursorInfo.globalStartIndex >= this._highlightCursorInfo.initialStartIndex) {\r\n // Current line is at least below the initial highlight index\r\n while (tmpLength + lineLength <= this._cursorInfo.globalEndIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.globalEndIndex - tmpLength;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update all values of cursor information based on cursorIndex value\r\n *\r\n * @param offset The index to take care of\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected override _updateValueFromCursorIndex(offset: number) {\r\n // Override to avoid parent behavior during _onPointerMove\r\n }\r\n\r\n /**\r\n * Select the word immediatly under the cursor on double click\r\n *\r\n * @param _evt Pointer informations of double click\r\n * @internal\r\n */\r\n protected override _processDblClick(_evt: PointerInfo) {\r\n //pre-find the start and end index of the word under cursor, speeds up the rendering\r\n let moveLeft, moveRight;\r\n do {\r\n moveLeft = this._cursorInfo.globalStartIndex > 0 && this._textWrapper.isWord(this._cursorInfo.globalStartIndex - 1) ? --this._cursorInfo.globalStartIndex : 0;\r\n moveRight =\r\n this._cursorInfo.globalEndIndex < this._textWrapper.length && this._textWrapper.isWord(this._cursorInfo.globalEndIndex) ? ++this._cursorInfo.globalEndIndex : 0;\r\n } while (moveLeft || moveRight);\r\n\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this.onTextHighlightObservable.notifyObservers(this);\r\n\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /** @internal */\r\n protected override _selectAllText() {\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n\r\n this._highlightCursorInfo = {\r\n initialStartIndex: 0,\r\n initialRelativeStartIndex: 0,\r\n initialLineIndex: 0,\r\n };\r\n\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: this._textWrapper.length,\r\n relativeEndIndex: this._lines[this._lines.length - 1].text.length,\r\n relativeStartIndex: 0,\r\n currentLineIndex: this._lines.length - 1,\r\n };\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this.onLinesReadyObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.InputTextArea\", InputTextArea);\r\n"]}
|
1
|
+
{"version":3,"file":"inputTextArea.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/inputTextArea.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAGlD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,0CAA4B;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAKxC,OAAO,EAAE,SAAS,EAAE,2CAA6B;AAEjD;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,SAAS;IAkCxC,wGAAwG;IAExG,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAc;QACvC,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE;YACnC,OAAO;SACV;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,IAAoB,MAAM,CAAC,KAAsB;QAC7C,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QAErC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YAC7C,OAAO;SACV;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAChC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IACpC,CAAC;IAGD,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,8DAA8D;IAC9D,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACzF,CAAC;IAED,IAAW,SAAS,CAAC,KAAsB;QACvC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YAChD,OAAO;SACV;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACnC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;;OAIG;IACH,YACoB,IAAa,EAC7B,OAAe,EAAE;QAEjB,KAAK,CAAC,IAAI,CAAC,CAAC;QAHI,SAAI,GAAJ,IAAI,CAAS;QAxFzB,6BAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;QAC7D,2BAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAExD,cAAS,GAAW,IAAI,CAAC,IAAI,CAAC;QAG9B,iBAAY,GAAiB,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACjD,eAAU,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAQlF;;WAEG;QACI,2BAAsB,GAAG,IAAI,UAAU,EAAiB,CAAC;QA2E5D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAEpE,IAAI,CAAC,oBAAoB,GAAG;YACxB,iBAAiB,EAAE,CAAC,CAAC;YACrB,yBAAyB,EAAE,CAAC,CAAC;YAC7B,gBAAgB,EAAE,CAAC,CAAC;SACvB,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG;YACf,gBAAgB,EAAE,CAAC;YACnB,cAAc,EAAE,CAAC;YACjB,gBAAgB,EAAE,CAAC;YACnB,kBAAkB,EAAE,CAAC;YACrB,gBAAgB,EAAE,CAAC;SACtB,CAAC;IACN,CAAC;IAEkB,YAAY;QAC3B,OAAO,eAAe,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACa,eAAe,CAAC,GAAmB;QAC/C,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,OAAO;SACV;QAED,sBAAsB;QACtB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEnD,IAAI,CAAC,kCAAkC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IAED;;;;;;;OAOG;IACI,qBAAqB,CAAC,IAAY,EAAE,GAAY,EAAE,GAAoB;QACzE,uDAAuD;QACvD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE;YACpF,OAAO;SACV;QAED,iBAAiB;QACjB,QAAQ,IAAI,EAAE;YACV,KAAK,QAAQ,EAAE,OAAO;gBAClB,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE;oBACrB,GAAG,CAAC,cAAc,EAAE,CAAC;iBACxB;gBACD,MAAM;YACV,KAAK,WAAW,EAAE,YAAY;gBAC1B,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,EAAE;oBACnE,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;oBACpE,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;iBACvC;gBACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;gBAEjG,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBAEpE,IAAI,GAAG,EAAE;oBACL,GAAG,CAAC,cAAc,EAAE,CAAC;iBACxB;gBAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAEhC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,MAAM;YACV,KAAK,QAAQ,EAAE,SAAS;gBACpB,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAChF,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;iBAC3E;gBACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;gBAEjG,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBAEpE,IAAI,GAAG,EAAE;oBACL,GAAG,CAAC,cAAc,EAAE,CAAC;iBACxB;gBAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAEhC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,MAAM;YACV,KAAK,aAAa,CAAC,CAAC,eAAe;YACnC,KAAK,OAAO,EAAE,SAAS;gBACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;gBACvG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;gBACpC,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBAEpE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAEhC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,OAAO;YACX,KAAK,KAAK,EAAE,MAAM;gBACd,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBACrD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,OAAO;YACX,KAAK,MAAM,EAAE,OAAO;gBAChB,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,OAAO;YACX,KAAK,WAAW,EAAE,OAAO;gBACrB,IAAI,CAAC,YAAY,EAAE,CAAC;gBAEpB,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE;oBACrB,wBAAwB;oBACxB,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE;wBAC5B,iFAAiF;wBACjF,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;wBACzE,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;qBACjF;oBACD,2BAA2B;oBAC3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;wBAC1B,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;wBAC/E,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;wBAChF,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;wBAE1F,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;wBACpE,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;wBACpC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;qBAClC;yBAAM;wBACH,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,EAAE;4BAC/E,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;yBACrC;6BAAM;4BACH,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;yBACvC;qBACJ;oBACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,GAAG,CAAC,cAAc,EAAE,CAAC;oBACrB,OAAO;iBACV;gBAED,IAAI,IAAI,CAAC,kBAAkB,EAAE;oBACzB,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;iBACvE;qBAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;oBAC5C,WAAW;oBACX,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;oBACzE,GAAG,CAAC,cAAc,EAAE,CAAC;iBACxB;qBAAM,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,EAAE;oBAC9C,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;iBACvC;gBAED,oBAAoB;gBACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,OAAO;YACX,KAAK,YAAY,EAAE,QAAQ;gBACvB,IAAI,CAAC,YAAY,EAAE,CAAC;gBAEpB,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE;oBACrB,wBAAwB;oBACxB,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE;wBAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;wBACtH,IAAI,CAAC,WAAW,CAAC,cAAc,IAAI,UAAU,CAAC;wBAC9C,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;qBACnF;oBACD,2BAA2B;oBAC3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;wBAC1B,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;wBAC/E,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;wBAChF,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;wBAE1F,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;wBACpE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;wBAClC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;qBAClC;yBAAM;wBACH,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,EAAE;4BACjF,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;yBACvC;6BAAM;4BACH,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;yBACrC;qBACJ;oBACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,GAAG,CAAC,cAAc,EAAE,CAAC;oBACrB,OAAO;iBACV;gBACD,IAAI,IAAI,CAAC,kBAAkB,EAAE;oBACzB,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;iBACvE;qBAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;oBAC5C,UAAU;oBACV,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;oBAClH,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,UAAU,CAAC;iBACnD;qBAAM,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAC7D,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;iBACvC;gBAED,oBAAoB;gBACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,OAAO;YACX,KAAK,SAAS,EAAE,KAAK;gBACjB,oBAAoB;gBACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAE1B,IAAI,GAAG,EAAE;oBACL,IAAI,GAAG,CAAC,QAAQ,EAAE;wBACd,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;4BAC1B,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;4BAC/E,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;4BAChF,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;yBAC7F;wBACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;wBAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;qBAC5B;yBAAM;wBACH,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;qBACnC;oBACD,GAAG,CAAC,cAAc,EAAE,CAAC;iBACxB;gBAED,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,KAAK,CAAC,EAAE;oBACzC,aAAa;oBACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;iBACzC;qBAAM;oBACH,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;oBACnE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;oBAErE,IAAI,QAAQ,GAAG,CAAC,CAAC;oBACjB,IAAI,aAAa,GAAG,CAAC,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE;wBAC5G,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;wBAC7C,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;qBACvD;yBAAM;wBACH,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;wBAC3C,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;qBACrD;oBAED,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;oBACjE,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;oBAE/E,IAAI,UAAU,GAAG,CAAC,CAAC;oBACnB,IAAI,aAAa,GAAG,CAAC,CAAC;oBAEtB,QAAQ,IAAI,aAAa,CAAC,CAAC,wBAAwB;oBACnD,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB;oBACvF,IAAI,sBAAsB,GAAG,CAAC,CAAC;oBAE/B,OAAO,UAAU,GAAG,YAAY,IAAI,sBAAsB,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE;wBAChF,QAAQ,EAAE,CAAC;wBACX,sBAAsB,EAAE,CAAC;wBACzB,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC;wBACpD,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC;qBAClH;oBAED,oBAAoB;oBACpB,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,aAAa,IAAI,sBAAsB,GAAG,CAAC,EAAE;wBACnF,QAAQ,EAAE,CAAC;qBACd;oBAED,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;wBAC1B,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,QAAQ,CAAC;qBAChD;yBAAM,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE;wBACxF,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,QAAQ,CAAC;wBAC7C,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;wBAC9E,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,CAAC;qBAC3F;yBAAM;wBACH,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,QAAQ,CAAC;qBAC9C;iBACJ;gBAED,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,OAAO;YACX,KAAK,WAAW,EAAE,OAAO;gBACrB,oBAAoB;gBACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAE1B,IAAI,GAAG,EAAE;oBACL,IAAI,GAAG,CAAC,QAAQ,EAAE;wBACd,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;4BAC1B,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;4BAC/E,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;4BAChF,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;yBAC7F;wBAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;wBAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;qBAC5B;yBAAM;wBACH,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;qBACnC;oBACD,GAAG,CAAC,cAAc,EAAE,CAAC;iBACxB;gBAED,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC9D,YAAY;oBACZ,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;iBACxD;qBAAM;oBACH,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;oBACnE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;oBAErE,IAAI,QAAQ,GAAG,CAAC,CAAC;oBACjB,IAAI,aAAa,GAAG,CAAC,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE;wBAC5G,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;wBAC7C,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;qBACvD;yBAAM;wBACH,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;wBAC3C,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;qBACrD;oBAED,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;oBACjE,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;oBAE/E,IAAI,UAAU,GAAG,CAAC,CAAC;oBACnB,IAAI,aAAa,GAAG,CAAC,CAAC;oBAEtB,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,wBAAwB;oBAC7G,IAAI,sBAAsB,GAAG,CAAC,CAAC;oBAE/B,OAAO,UAAU,GAAG,YAAY,IAAI,sBAAsB,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE;wBAChF,QAAQ,EAAE,CAAC;wBACX,sBAAsB,EAAE,CAAC;wBACzB,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC;wBACpD,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC;qBAClH;oBAED,oBAAoB;oBACpB,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,aAAa,IAAI,sBAAsB,GAAG,CAAC,EAAE;wBACnF,QAAQ,EAAE,CAAC;qBACd;oBAED,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;wBAC1B,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,QAAQ,CAAC;qBAChD;yBAAM,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE;wBACvF,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,QAAQ,CAAC;wBAC7C,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE;4BACrE,IAAI,CAAC,WAAW,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;4BACrE,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;4BACxG,IAAI,CAAC,WAAW,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;yBACxE;qBACJ;yBAAM;wBACH,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,QAAQ,CAAC;wBAC3C,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;qBACnF;iBACJ;gBAED,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,OAAO;SACd;QAED,qFAAqF;QACrF,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE;YACpD,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,GAAG,CAAC,cAAc,EAAE,CAAC;YACrB,OAAO;SACV;QAED,uBAAuB;QACvB,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC,EAAE;YACnB,GAAG,EAAE,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACvB,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACpD,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;YACvB,IAAI,IAAI,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;gBACtG,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,GAAG,CAAC,MAAM,CAAC;gBAChD,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBAEpE,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;SACJ;IACL,CAAC;IAES,kBAAkB,CAAC,OAAe,EAAE,EAAE,KAAa,EAAE,OAAgC;QAC3F,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;YAChC,IAAI,SAAS,GAAG,KAAK,EAAE;gBACnB,IAAI,CAAC,GAAG,CAAC,EAAE;oBACP,8CAA8C;oBAC9C,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;oBAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;iBACjE;gBAED,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEhB,IAAI,WAAW,GAAG,EAAE,CAAC;gBAErB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACxB,IAAI,OAAO,CAAC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE;wBACvD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;wBACjG,WAAW,GAAG,EAAE,CAAC;qBACpB;oBACD,WAAW,IAAI,IAAI,CAAC;gBACxB,CAAC,CAAC,CAAC;gBAEH,IAAI,GAAG,WAAW,CAAC;gBACnB,+BAA+B;gBAC/B,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;aAC/C;iBAAM;gBACH,SAAS,GAAG,SAAS,CAAC;gBACtB,IAAI,GAAG,QAAQ,CAAC;aACnB;SACJ;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAE9D,OAAO,KAAK,CAAC;IACjB,CAAC;IAES,WAAW,CAAC,QAAgB,EAAE,OAAgC;QACpE,MAAM,KAAK,GAA0D,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/D,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;aACpE;SACJ;aAAM;YACH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;aAC/C;SACJ;QAED,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC;QAE1C,OAAO,KAAK,CAAC;IACjB,CAAC;IAES,UAAU,CAAC,OAAe,EAAE,EAAE,OAAgC;QACpE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACnF,CAAC;IAED;;;;;;OAMG;IACgB,WAAW,CAAC,aAAsB,EAAE,OAAgC;QACnF,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE;YACrC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;SAC/F;QAED,IAAI,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;QAE1D,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACrC,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC;SAChC;QAED,gDAAgD;QAChD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;QAClD,gCAAgC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEtF,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;gBAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;gBACnD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;gBACjD,OAAO,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;YAEP,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC;YAClE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC;YAE/H,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;SAChC;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;QAElG,gBAAgB;QAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC9D,6CAA6C;QAC7C,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC;QAErC,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAChE,MAAM,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;YAE9G,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;SAClC;QAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;QAErG,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAEtC,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;YAC/I,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,OAAO,SAAS,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;gBAChE,SAAS,IAAI,UAAU,CAAC;gBAExB,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC5D,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;oBACpC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;iBAC9I;aACJ;SACJ;IACL,CAAC;IAEkB,eAAe;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;YACnE,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;SACzC;QACD,KAAK,CAAC,eAAe,EAAE,CAAC;IAC5B,CAAC;IAEO,cAAc;QAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3H,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAE1H,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;YAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC;YAElH,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACnB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;aAC/B;SACJ;aAAM;YACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;SACzC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzF,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC;YAEnD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBAClB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;aAC7B;SACJ;aAAM;YACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;SACvC;IACL,CAAC;IAED;;;;OAIG;IACgB,qBAAqB;QACpC,wCAAwC;QACxC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAE1B,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAEO,SAAS,CAAC,IAAY,EAAE,SAAiB,EAAE,CAAS,EAAE,OAAgC;QAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAqB,CAAC;QACnC,QAAQ,IAAI,CAAC,wBAAwB,EAAE;YACnC,KAAK,OAAO,CAAC,yBAAyB;gBAClC,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACV,KAAK,OAAO,CAAC,0BAA0B;gBACnC,CAAC,IAAI,KAAK,GAAG,SAAS,CAAC;gBACvB,MAAM;YACV,KAAK,OAAO,CAAC,2BAA2B;gBACpC,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC7B,MAAM;SACb;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;YAC7D,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACvC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACrC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YAC3C,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;SAC9C;QAED,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;SAC9D;QACD,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACgB,WAAW,CAAC,EAAkB;QAC7C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,mDAAmD;QACnD,IAAI;YACA,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACrF;QAAC,MAAM,GAAE,CAAC,MAAM;QACjB,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACrD,CAAC;IAED;;;;;OAKG;IACgB,UAAU,CAAC,EAAkB;QAC5C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACxB,OAAO;SACV;QACD,mDAAmD;QACnD,IAAI;YACA,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACrF;QAAC,MAAM,GAAE,CAAC,MAAM;QAEjB,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAEjG,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACgB,YAAY,CAAC,EAAkB;QAC9C,IAAI,IAAI,GAAW,EAAE,CAAC;QACtB,IAAI,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;YACzE,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;SACjD;aAAM;YACH,sDAAsD;YACtD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;SACnC;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAEvG,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAEvG,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,UAAU,CAAC;QAChD,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;QACpE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAEhC,KAAK,CAAC,eAAe,EAAE,CAAC;IAC5B,CAAC;IAEe,KAAK,CAAC,OAAgC;QAClD,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QAEvC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;YAC7D,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACvC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACrC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YAC3C,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;SAC9C;QAED,aAAa;QACb,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACzB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;gBAEpF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;aAClI;SACJ;aAAM,IAAI,IAAI,CAAC,WAAW,EAAE;YACzB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;YAE7E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SAClI;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;YAC7D,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;YACvB,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;YAC1B,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;SAC7B;QAED,mEAAmE;QACnE,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;SAClC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,QAAQ,IAAI,CAAC,sBAAsB,EAAE;YACjC,KAAK,OAAO,CAAC,sBAAsB;gBAC/B,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAChC,MAAM;YACV,KAAK,OAAO,CAAC,yBAAyB;gBAClC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;gBAC/F,MAAM;YACV,KAAK,OAAO,CAAC,yBAAyB;gBAClC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9F,MAAM;SACb;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;YACjD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC;SAC9C;QACD,gEAAgE;QAChE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QACzG,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,OAAO;QACP,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAE5B,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,KAAK,CAAC,EAAE;gBAClD,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;oBAC3B,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACnD;qBAAM;oBACH,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;iBACvI;aACJ;YAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACtD,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;SACpC;QAED,OAAO,CAAC,OAAO,EAAE,CAAC;QAElB,SAAS;QACT,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,gBAAgB;YAChB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBAC/C,IAAI,UAAU,GACV,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;gBAExJ,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;oBACjC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC;oBACpD,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC;oBAChC,IAAI,CAAC,YAAY,EAAE,CAAC;iBACvB;qBAAM,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE;oBAC/D,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC;oBAC3E,UAAU,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;oBACvD,IAAI,CAAC,YAAY,EAAE,CAAC;iBACvB;gBAED,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,6CAA6C;gBAE5I,IAAI,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;oBAC/B,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;oBACjD,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;oBAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;iBACvB;qBAAM,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;oBAC3I,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;oBACnG,SAAS,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;oBAChF,IAAI,CAAC,YAAY,EAAE,CAAC;iBACvB;gBAED,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;iBACvE;aACJ;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;YAEtB,2BAA2B;YAC3B,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACzB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAEjC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;gBAEhH,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBAC9C,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC;gBAE7C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;gBAC/G,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;gBAE7G,IAAI,cAAc,GAAG,IAAI,CAAC,UAAU,GAAG,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAEhF,KAAK,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE;oBACjD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAE5B,IAAI,cAAc,GAAG,IAAI,CAAC,WAAqB,CAAC;oBAChD,QAAQ,IAAI,CAAC,wBAAwB,EAAE;wBACnC,KAAK,OAAO,CAAC,yBAAyB;4BAClC,cAAc,IAAI,CAAC,CAAC;4BACpB,MAAM;wBACV,KAAK,OAAO,CAAC,0BAA0B;4BACnC,cAAc,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;4BACrC,MAAM;wBACV,KAAK,OAAO,CAAC,2BAA2B;4BACpC,cAAc,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BAC3C,MAAM;qBACb;oBAED,MAAM,KAAK,GAAG,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7E,MAAM,GAAG,GAAG,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;oBAEtF,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;oBACjF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACrD,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC;oBAEhE,OAAO,CAAC,QAAQ,CAAC,cAAc,GAAG,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAE7G,cAAc,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;iBAC7C;gBAED,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,KAAK,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;oBACvE,IAAI,CAAC,cAAc,EAAE,CAAC;iBACzB;aACJ;SACJ;QAED,OAAO,CAAC,OAAO,EAAE,CAAC;QAElB,SAAS;QACT,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,IAAI,IAAI,CAAC,YAAY,EAAE;oBACnB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;iBAC3C;aACJ;iBAAM;gBACH,IAAI,IAAI,CAAC,KAAK,EAAE;oBACZ,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;iBACpC;aACJ;YAED,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;YAEpC,OAAO,CAAC,UAAU,CACd,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAC9C,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAC5C,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAChD,CAAC;SACL;IACL,CAAC;IAEO,cAAc;QAClB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,aAAa,GAAQ,UAAU,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YACvC,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC,EAAE,GAAG,CAAC,CAAC;IACZ,CAAC;IAEe,cAAc,CAAC,MAAe,EAAE,WAAoB,EAAE,SAAiB,EAAE,WAAmB,EAAE,EAAmB;QAC7H,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE;YACxE,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,OAAO,IAAI,CAAC;SACf;QAED,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAC/C,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,IAAI,EAAE;YACpC,cAAc;YACd,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;SACf;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAEjC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,oBAAoB;IACJ,cAAc,CAAC,MAAe,EAAE,WAAoB,EAAE,SAAiB,EAAE,EAAmB;QACxG,mFAAmF;QACnF,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE;YACtD,OAAO;SACV;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAC/E,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,CAAC,CAAC;YAEzC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC1B,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBAC/E,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;gBAChF,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;gBAE1F,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;aAClC;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;QACD,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,qBAAqB;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO;SACV;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;YACjD,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;SACzC;aAAM;YACH,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBACtD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAC1B,IAAI,CAAC,WAAW,GAAG;wBACf,gBAAgB,EAAE,CAAC;wBACnB,cAAc,EAAE,CAAC;wBACjB,kBAAkB,EAAE,CAAC;wBACrB,gBAAgB,EAAE,CAAC;wBACnB,gBAAgB,EAAE,CAAC;qBACtB,CAAC;iBACL;gBAED,IAAI,WAAW,GAAG,CAAC,CAAC;gBACpB,IAAI,aAAa,GAAG,CAAC,CAAC;gBAEtB,MAAM,sBAAsB,GAAG,IAAI,CAAC,mBAAmB,GAAI,IAAI,CAAC,UAAqB,CAAC;gBAEtF,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACzF,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAEvG,IAAI,WAAW,GAAG,CAAC,CAAC;gBAEpB,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;gBAE7E,IAAI,YAAY,GAAG,CAAC,CAAC;gBAErB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE;oBACpE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;iBAC5D;gBAED,OAAO,WAAW,GAAG,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,EAAE;oBAClH,aAAa,EAAE,CAAC;oBAChB,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,WAAW,CAAC,CAAC;oBACzD,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;iBAC/I;gBAED,oBAAoB;gBACpB,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,WAAW,CAAC,GAAG,YAAY,IAAI,aAAa,GAAG,CAAC,EAAE;oBAC/E,aAAa,EAAE,CAAC;iBACnB;gBAED,WAAW,IAAI,aAAa,CAAC;gBAE7B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAC1B,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,WAAW,CAAC;oBAChD,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,aAAa,CAAC;oBACpD,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;oBACpE,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;iBAC3E;qBAAM;oBACH,IAAI,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,EAAE;wBAC3D,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,WAAW,CAAC;wBAChD,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,aAAa,CAAC;wBACpD,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;wBAC9E,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,CAAC;qBAC3F;yBAAM;wBACH,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;wBAChF,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,CAAC;wBAC1F,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,WAAW,CAAC;wBAC9C,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,aAAa,CAAC;qBACrD;iBACJ;gBAED,sCAAsC;gBACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBAC5C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAChC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACnC;iBAAM;gBACH,uFAAuF;gBACvF,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,CAAC,CAAC;gBACxC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC;gBAEtC,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC/I,IAAI,SAAS,GAAG,CAAC,CAAC;gBAElB,OAAO,SAAS,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;oBAChE,SAAS,IAAI,UAAU,CAAC;oBAExB,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC5D,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;wBACpC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;qBAC9I;iBACJ;gBAED,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAEpF,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAC1B,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC;oBACxE,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;iBACvE;qBAAM,IAAI,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,IAAI,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,EAAE;oBAC/I,6DAA6D;oBAC7D,OAAO,SAAS,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE;wBAC9D,SAAS,IAAI,UAAU,CAAC;wBAExB,IAAI,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;4BAC5D,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;4BACpC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;yBAC9I;qBACJ;oBAED,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,SAAS,CAAC;iBACnF;aACJ;SACJ;IACL,CAAC;IAED;;;;;OAKG;IACH,6DAA6D;IAC1C,2BAA2B,CAAC,MAAc;QACzD,0DAA0D;IAC9D,CAAC;IAED;;;;;OAKG;IACgB,gBAAgB,CAAC,IAAiB;QACjD,oFAAoF;QACpF,IAAI,QAAQ,EAAE,SAAS,CAAC;QACxB,GAAG;YACC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9J,SAAS;gBACL,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;SACvK,QAAQ,QAAQ,IAAI,SAAS,EAAE;QAEhC,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;QAC/E,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;QAEhF,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAErD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,gBAAgB;IACG,cAAc;QAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,IAAI,CAAC,oBAAoB,GAAG;YACxB,iBAAiB,EAAE,CAAC;YACpB,yBAAyB,EAAE,CAAC;YAC5B,gBAAgB,EAAE,CAAC;SACtB,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG;YACf,gBAAgB,EAAE,CAAC;YACnB,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;YACxC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;YACjE,kBAAkB,EAAE,CAAC;YACrB,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;SAC3C,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAEe,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;CACJ;AA1oCG;IADC,SAAS,EAAE;sDAGX;AA0BD;IADC,SAAS,EAAE;8CAGX;AA6mCL,aAAa,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport type { VirtualKeyboard } from \"./virtualKeyboard\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport type { Measure } from \"../measure\";\r\nimport { InputText } from \"./inputText\";\r\nimport type { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport type { PointerInfo, PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport type { IKeyboardEvent } from \"core/Events/deviceInputEvents\";\r\n\r\nimport { serialize } from \"core/Misc/decorators\";\r\n\r\n/**\r\n * Class used to create input text control\r\n */\r\nexport class InputTextArea extends InputText {\r\n private _textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n private _textVerticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n private _prevText: string = this.text;\r\n\r\n private _lines: any[];\r\n private _lineSpacing: ValueAndUnit = new ValueAndUnit(0);\r\n private _maxHeight = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n\r\n private _clipTextTop: number;\r\n private _clipTextLeft: number;\r\n\r\n private _cursorInfo: { globalStartIndex: number; globalEndIndex: number; relativeStartIndex: number; relativeEndIndex: number; currentLineIndex: number };\r\n private _highlightCursorInfo: { initialStartIndex: number; initialRelativeStartIndex: number; initialLineIndex: number };\r\n\r\n /**\r\n * An event triggered after the text was broken up into lines\r\n */\r\n public onLinesReadyObservable = new Observable<InputTextArea>();\r\n\r\n /** @internal */\r\n public override _connectedVirtualKeyboard: Nullable<VirtualKeyboard>;\r\n private _contextForBreakLines: ICanvasRenderingContext;\r\n private _clickedCoordinateX: Nullable<number>;\r\n private _clickedCoordinateY: Nullable<number>;\r\n\r\n private _availableWidth: number;\r\n private _availableHeight: number;\r\n\r\n private _scrollTop: Nullable<number>;\r\n\r\n private _autoStretchHeight: boolean;\r\n\r\n /** Gets or sets a boolean indicating if the control can auto stretch its height to adapt to the text */\r\n @serialize()\r\n public get autoStretchHeight(): boolean {\r\n return this._autoStretchHeight;\r\n }\r\n\r\n public set autoStretchHeight(value: boolean) {\r\n if (this._autoStretchHeight === value) {\r\n return;\r\n }\r\n\r\n this._autoStretchHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n public override set height(value: string | number) {\r\n this.fixedRatioMasterIsWidth = false;\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n\r\n this._autoStretchHeight = false;\r\n }\r\n\r\n @serialize()\r\n public get maxHeight(): string | number {\r\n return this._maxHeight.toString(this._host);\r\n }\r\n\r\n /** Gets the maximum width allowed by the control in pixels */\r\n public get maxHeightInPixels(): number {\r\n return this._maxHeight.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set maxHeight(value: string | number) {\r\n if (this._maxHeight.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._maxHeight.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new InputTextArea\r\n * @param name defines the control name\r\n * @param text defines the text of the control\r\n */\r\n constructor(\r\n public override name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n\r\n this.isPointerBlocker = true;\r\n\r\n this.onLinesReadyObservable.add(() => this._updateCursorPosition());\r\n\r\n this._highlightCursorInfo = {\r\n initialStartIndex: -1,\r\n initialRelativeStartIndex: -1,\r\n initialLineIndex: -1,\r\n };\r\n\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: 0,\r\n relativeEndIndex: 0,\r\n relativeStartIndex: 0,\r\n currentLineIndex: 0,\r\n };\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"InputTextArea\";\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public override processKeyboard(evt: IKeyboardEvent): void {\r\n if (this.isReadOnly) {\r\n return;\r\n }\r\n\r\n // process pressed key\r\n this.alternativeProcessKey(evt.code, evt.key, evt);\r\n\r\n this.onKeyboardEventProcessedObservable.notifyObservers(evt);\r\n }\r\n\r\n /**\r\n * Process the last keyboard input\r\n *\r\n * @param code The ascii input number\r\n * @param key The key string representation\r\n * @param evt The keyboard event emits with input\r\n * @internal\r\n */\r\n public alternativeProcessKey(code: string, key?: string, evt?: IKeyboardEvent) {\r\n //return if clipboard event keys (i.e -ctr/cmd + c,v,x)\r\n if (evt && (evt.ctrlKey || evt.metaKey) && (key === \"c\" || key === \"v\" || key === \"x\")) {\r\n return;\r\n }\r\n\r\n // Specific cases\r\n switch (code) {\r\n case \"Period\": //SLASH\r\n if (evt && evt.shiftKey) {\r\n evt.preventDefault();\r\n }\r\n break;\r\n case \"Backspace\": // BACKSPACE\r\n if (!this._isTextHighlightOn && this._cursorInfo.globalStartIndex > 0) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n break;\r\n case \"Delete\": // DELETE\r\n if (!this._isTextHighlightOn && this._cursorInfo.globalEndIndex < this.text.length) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex + 1;\r\n }\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n break;\r\n case \"NumpadEnter\": // NUMPAD ENTER\r\n case \"Enter\": // RETURN\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, \"\\n\");\r\n this._cursorInfo.globalStartIndex++;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n return;\r\n case \"End\": // END\r\n this._cursorInfo.globalStartIndex = this.text.length;\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case \"Home\": // HOME\r\n this._cursorInfo.globalStartIndex = 0;\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case \"ArrowLeft\": // LEFT\r\n this._markAsDirty();\r\n\r\n if (evt && evt.shiftKey) {\r\n // shift + ctrl/cmd + <-\r\n if (evt.ctrlKey || evt.metaKey) {\r\n // Go to line's start by substract the relativeStartIndex to the globalStartIndex\r\n this._cursorInfo.globalStartIndex -= this._cursorInfo.relativeStartIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n // store the starting point\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex--;\r\n this._isTextHighlightOn = true;\r\n } else {\r\n if (this._cursorInfo.globalEndIndex > this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalEndIndex--;\r\n } else {\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n }\r\n this._blinkIsEven = true;\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n if (this._isTextHighlightOn) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n } else if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n // ctr + <-\r\n this._cursorInfo.globalStartIndex -= this._cursorInfo.relativeStartIndex;\r\n evt.preventDefault();\r\n } else if (this._cursorInfo.globalStartIndex > 0) {\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n return;\r\n case \"ArrowRight\": // RIGHT\r\n this._markAsDirty();\r\n\r\n if (evt && evt.shiftKey) {\r\n // shift + ctrl/cmd + ->\r\n if (evt.ctrlKey || evt.metaKey) {\r\n const rightDelta = this._lines[this._cursorInfo.currentLineIndex].text.length - this._cursorInfo.relativeEndIndex - 1;\r\n this._cursorInfo.globalEndIndex += rightDelta;\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n // store the starting point\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalEndIndex++;\r\n this._isTextHighlightOn = true;\r\n } else {\r\n if (this._cursorInfo.globalStartIndex < this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalStartIndex++;\r\n } else {\r\n this._cursorInfo.globalEndIndex++;\r\n }\r\n }\r\n this._blinkIsEven = true;\r\n evt.preventDefault();\r\n return;\r\n }\r\n if (this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = this._cursorInfo.globalEndIndex;\r\n } else if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n //ctr + ->\r\n const rightDelta = this._lines[this._cursorInfo.currentLineIndex].text.length - this._cursorInfo.relativeEndIndex;\r\n this._cursorInfo.globalStartIndex += rightDelta;\r\n } else if (this._cursorInfo.globalStartIndex < this.text.length) {\r\n this._cursorInfo.globalStartIndex++;\r\n }\r\n\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n return;\r\n case \"ArrowUp\": // UP\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (evt) {\r\n if (evt.shiftKey) {\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n }\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n } else {\r\n this._isTextHighlightOn = false;\r\n }\r\n evt.preventDefault();\r\n }\r\n\r\n if (this._cursorInfo.currentLineIndex === 0) {\r\n // First line\r\n this._cursorInfo.globalStartIndex = 0;\r\n } else {\r\n const currentLine = this._lines[this._cursorInfo.currentLineIndex];\r\n const upperLine = this._lines[this._cursorInfo.currentLineIndex - 1];\r\n\r\n let tmpIndex = 0;\r\n let relativeIndex = 0;\r\n if (!this._isTextHighlightOn || this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n tmpIndex = this._cursorInfo.globalStartIndex;\r\n relativeIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n tmpIndex = this._cursorInfo.globalEndIndex;\r\n relativeIndex = this._cursorInfo.relativeEndIndex;\r\n }\r\n\r\n const currentText = currentLine.text.substring(0, relativeIndex);\r\n const currentWidth = this._contextForBreakLines.measureText(currentText).width;\r\n\r\n let upperWidth = 0;\r\n let previousWidth = 0;\r\n\r\n tmpIndex -= relativeIndex; // Start of current line\r\n tmpIndex -= upperLine.text.length + upperLine.lineEnding.length; // Start of upper line\r\n let upperLineRelativeIndex = 0;\r\n\r\n while (upperWidth < currentWidth && upperLineRelativeIndex < upperLine.text.length) {\r\n tmpIndex++;\r\n upperLineRelativeIndex++;\r\n previousWidth = Math.abs(currentWidth - upperWidth);\r\n upperWidth = this._contextForBreakLines.measureText(upperLine.text.substring(0, upperLineRelativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(currentWidth - upperWidth) > previousWidth && upperLineRelativeIndex > 0) {\r\n tmpIndex--;\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n } else if (this._cursorInfo.currentLineIndex <= this._highlightCursorInfo.initialLineIndex) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n } else {\r\n this._cursorInfo.globalEndIndex = tmpIndex;\r\n }\r\n }\r\n\r\n this._markAsDirty();\r\n return;\r\n case \"ArrowDown\": // DOWN\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (evt) {\r\n if (evt.shiftKey) {\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n }\r\n\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n } else {\r\n this._isTextHighlightOn = false;\r\n }\r\n evt.preventDefault();\r\n }\r\n\r\n if (this._cursorInfo.currentLineIndex === this._lines.length - 1) {\r\n // Last line\r\n this._cursorInfo.globalStartIndex = this.text.length;\r\n } else {\r\n const currentLine = this._lines[this._cursorInfo.currentLineIndex];\r\n const underLine = this._lines[this._cursorInfo.currentLineIndex + 1];\r\n\r\n let tmpIndex = 0;\r\n let relativeIndex = 0;\r\n if (!this._isTextHighlightOn || this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n tmpIndex = this._cursorInfo.globalStartIndex;\r\n relativeIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n tmpIndex = this._cursorInfo.globalEndIndex;\r\n relativeIndex = this._cursorInfo.relativeEndIndex;\r\n }\r\n\r\n const currentText = currentLine.text.substring(0, relativeIndex);\r\n const currentWidth = this._contextForBreakLines.measureText(currentText).width;\r\n\r\n let underWidth = 0;\r\n let previousWidth = 0;\r\n\r\n tmpIndex += currentLine.text.length - relativeIndex + currentLine.lineEnding.length; // Start of current line\r\n let underLineRelativeIndex = 0;\r\n\r\n while (underWidth < currentWidth && underLineRelativeIndex < underLine.text.length) {\r\n tmpIndex++;\r\n underLineRelativeIndex++;\r\n previousWidth = Math.abs(currentWidth - underWidth);\r\n underWidth = this._contextForBreakLines.measureText(underLine.text.substring(0, underLineRelativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(currentWidth - underWidth) > previousWidth && underLineRelativeIndex > 0) {\r\n tmpIndex--;\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n } else if (this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n if (this._cursorInfo.globalStartIndex > this._cursorInfo.globalEndIndex) {\r\n this._cursorInfo.globalEndIndex += this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex = this._cursorInfo.globalEndIndex - this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalEndIndex -= this._cursorInfo.globalStartIndex;\r\n }\r\n } else {\r\n this._cursorInfo.globalEndIndex = tmpIndex;\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n }\r\n\r\n this._markAsDirty();\r\n return;\r\n }\r\n\r\n // special case - select all. Use key instead of code to support all keyboard layouts\r\n if (key === \"a\" && evt && (evt.ctrlKey || evt.metaKey)) {\r\n this._selectAllText();\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n // Printable characters\r\n if (key?.length === 1) {\r\n evt?.preventDefault();\r\n this._currentKey = key;\r\n this.onBeforeKeyAddObservable.notifyObservers(this);\r\n key = this._currentKey;\r\n if (this._addKey) {\r\n this._isTextHighlightOn = false;\r\n this._blinkIsEven = false;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, key);\r\n this._cursorInfo.globalStartIndex += key.length;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this._textHasChanged();\r\n }\r\n }\r\n }\r\n\r\n protected _parseLineWordWrap(line: string = \"\", width: number, context: ICanvasRenderingContext): { text: string; width: number; lineEnding: string }[] {\r\n const lines = [];\r\n const words = line.split(\" \");\r\n let lineWidth = 0;\r\n\r\n for (let n = 0; n < words.length; n++) {\r\n const testLine = n > 0 ? line + \" \" + words[n] : words[0];\r\n const metrics = context.measureText(testLine);\r\n const testWidth = metrics.width;\r\n if (testWidth > width) {\r\n if (n > 0) {\r\n // Avoid first word duplication if of too long\r\n lineWidth = context.measureText(line).width;\r\n lines.push({ text: line, width: lineWidth, lineEnding: \" \" });\r\n }\r\n\r\n line = words[n];\r\n\r\n let flushedLine = \"\";\r\n\r\n line.split(\"\").map((char) => {\r\n if (context.measureText(flushedLine + char).width > width) {\r\n lines.push({ text: flushedLine, width: context.measureText(flushedLine).width, lineEnding: \"\" });\r\n flushedLine = \"\";\r\n }\r\n flushedLine += char;\r\n });\r\n\r\n line = flushedLine;\r\n // Measure remaining characters\r\n lineWidth = context.measureText(line).width;\r\n } else {\r\n lineWidth = testWidth;\r\n line = testLine;\r\n }\r\n }\r\n lines.push({ text: line, width: lineWidth, lineEnding: \" \" });\r\n\r\n return lines;\r\n }\r\n\r\n protected _breakLines(refWidth: number, context: ICanvasRenderingContext): object[] {\r\n const lines: { text: string; width: number; lineEnding: string }[] = [];\r\n const _lines = (this.text || this.placeholderText).split(\"\\n\");\r\n\r\n if (this.clipContent) {\r\n for (const _line of _lines) {\r\n lines.push(...this._parseLineWordWrap(_line, refWidth, context));\r\n }\r\n } else {\r\n for (const _line of _lines) {\r\n lines.push(this._parseLine(_line, context));\r\n }\r\n }\r\n\r\n lines[lines.length - 1].lineEnding = \"\\n\";\r\n\r\n return lines;\r\n }\r\n\r\n protected _parseLine(line: string = \"\", context: ICanvasRenderingContext): { text: string; width: number; lineEnding: string } {\r\n return { text: line, width: context.measureText(line).width, lineEnding: \" \" };\r\n }\r\n\r\n /**\r\n * Processing of child right before the parent measurement update\r\n *\r\n * @param parentMeasure The parent measure\r\n * @param context The rendering canvas\r\n * @internal\r\n */\r\n protected override _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (!this._fontOffset || this._wasDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font, this._host.getScene()?.getEngine());\r\n }\r\n\r\n let text = this._beforeRenderText(this._textWrapper).text;\r\n\r\n // placeholder conditions and color setting\r\n if (!this.text && this._placeholderText) {\r\n text = this._placeholderText;\r\n }\r\n\r\n // measures the textlength -> this.measure.width\r\n this._textWidth = context.measureText(text).width;\r\n // we double up the margin width\r\n const marginWidth = this._margin.getValueInPixel(this._host, parentMeasure.width) * 2;\r\n\r\n if (this._autoStretchWidth) {\r\n const tmpLines = text.split(\"\\n\");\r\n const longerString = tmpLines.reduce((acc: string, val: string) => {\r\n const valueLength = context.measureText(val).width;\r\n const accLength = context.measureText(acc).width;\r\n return valueLength > accLength ? val : acc;\r\n }, \"\");\r\n\r\n const longerStringWidth = context.measureText(longerString).width;\r\n this.width = Math.min(this._maxWidth.getValueInPixel(this._host, parentMeasure.width), longerStringWidth + marginWidth) + \"px\";\r\n\r\n this.autoStretchWidth = true;\r\n }\r\n\r\n this._availableWidth = this._width.getValueInPixel(this._host, parentMeasure.width) - marginWidth;\r\n\r\n // Prepare lines\r\n this._lines = this._breakLines(this._availableWidth, context);\r\n // can we find a cleaner implementation here?\r\n this._contextForBreakLines = context;\r\n\r\n if (this._autoStretchHeight) {\r\n const textHeight = this._lines.length * this._fontOffset.height;\r\n const totalHeight = textHeight + this._margin.getValueInPixel(this._host, parentMeasure.height) * 2;\r\n this.height = Math.min(this._maxHeight.getValueInPixel(this._host, parentMeasure.height), totalHeight) + \"px\";\r\n\r\n this._autoStretchHeight = true;\r\n }\r\n\r\n this._availableHeight = this._height.getValueInPixel(this._host, parentMeasure.height) - marginWidth;\r\n\r\n if (this._isFocused) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n\r\n let lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n let tmpLength = 0;\r\n\r\n while (tmpLength + lineLength <= this._cursorInfo.globalStartIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected override _textHasChanged() {\r\n if (!this._prevText && this._textWrapper.text && this.placeholderText) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n this._cursorInfo.globalStartIndex = 1;\r\n this._cursorInfo.globalEndIndex = 1;\r\n this._cursorInfo.relativeStartIndex = 1;\r\n this._cursorInfo.relativeEndIndex = 1;\r\n }\r\n super._textHasChanged();\r\n }\r\n\r\n private _computeScroll() {\r\n this._clipTextLeft = this._currentMeasure.left + this._margin.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n this._clipTextTop = this._currentMeasure.top + this._margin.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n\r\n if (this._isFocused && this._lines[this._cursorInfo.currentLineIndex].width > this._availableWidth) {\r\n const textLeft = this._clipTextLeft - this._lines[this._cursorInfo.currentLineIndex].width + this._availableWidth;\r\n\r\n if (!this._scrollLeft) {\r\n this._scrollLeft = textLeft;\r\n }\r\n } else {\r\n this._scrollLeft = this._clipTextLeft;\r\n }\r\n\r\n if (this._isFocused) {\r\n const selectedHeight = (this._cursorInfo.currentLineIndex + 1) * this._fontOffset.height;\r\n const textTop = this._clipTextTop - selectedHeight;\r\n\r\n if (!this._scrollTop) {\r\n this._scrollTop = textTop;\r\n }\r\n } else {\r\n this._scrollTop = this._clipTextTop;\r\n }\r\n }\r\n\r\n /**\r\n * Processing of child after the parent measurement update\r\n *\r\n * @internal\r\n */\r\n protected override _additionalProcessing(): void {\r\n // Flush the highlighted text each frame\r\n this.highlightedText = \"\";\r\n\r\n this.onLinesReadyObservable.notifyObservers(this);\r\n }\r\n\r\n private _drawText(text: string, textWidth: number, y: number, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n let x = this._scrollLeft as number;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x += 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x += width - textWidth;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x += (width - textWidth) / 2;\r\n break;\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text, this._currentMeasure.left + x, y);\r\n }\r\n context.fillText(text, x, y);\r\n }\r\n\r\n /**\r\n * Copy the text in the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onCopyText(ev: ClipboardEvent): void {\r\n this._isTextHighlightOn = false;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n this._host.clipboardData = this._highlightedText;\r\n }\r\n\r\n /**\r\n * Cut the text and copy it in the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onCutText(ev: ClipboardEvent): void {\r\n if (!this._highlightedText) {\r\n return;\r\n }\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n\r\n this._host.clipboardData = this._highlightedText;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._textHasChanged();\r\n }\r\n\r\n /**\r\n * Paste the copied text from the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onPasteText(ev: ClipboardEvent): void {\r\n let data: string = \"\";\r\n if (ev.clipboardData && ev.clipboardData.types.indexOf(\"text/plain\") !== -1) {\r\n data = ev.clipboardData.getData(\"text/plain\");\r\n } else {\r\n //get the cached data; returns blank string by default\r\n data = this._host.clipboardData;\r\n }\r\n\r\n this._isTextHighlightOn = false;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, data);\r\n\r\n const deltaIndex = data.length - (this._cursorInfo.globalEndIndex - this._cursorInfo.globalStartIndex);\r\n\r\n this._cursorInfo.globalStartIndex += deltaIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._clickedCoordinateX = null;\r\n this._clickedCoordinateY = null;\r\n\r\n super._textHasChanged();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n this._computeScroll();\r\n\r\n this._scrollLeft = this._scrollLeft ?? 0;\r\n this._scrollTop = this._scrollTop ?? 0;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n // Background\r\n if (this._isFocused) {\r\n if (this._focusedBackground) {\r\n context.fillStyle = this._isEnabled ? this._focusedBackground : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n } else if (this._background) {\r\n context.fillStyle = this._isEnabled ? this._background : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n // sets the color of the rectangle (border if background available)\r\n if (this.color) {\r\n context.fillStyle = this.color;\r\n }\r\n\r\n const height = this._currentMeasure.height;\r\n const width = this._currentMeasure.width;\r\n let rootY = 0;\r\n\r\n switch (this._textVerticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n rootY = this._fontOffset.ascent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n rootY = height - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n rootY = this._fontOffset.ascent + (height - this._fontOffset.height * this._lines.length) / 2;\r\n break;\r\n }\r\n\r\n context.save();\r\n context.beginPath();\r\n context.fillStyle = this.fontStyle;\r\n if (!this._textWrapper.text && this.placeholderText) {\r\n context.fillStyle = this._placeholderColor;\r\n }\r\n // here we define the visible reactangle to clip it in next line\r\n context.rect(this._clipTextLeft, this._clipTextTop, this._availableWidth + 2, this._availableHeight + 2);\r\n context.clip();\r\n\r\n // Text\r\n rootY += this._scrollTop;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (i !== 0 && this._lineSpacing.internalValue !== 0) {\r\n if (this._lineSpacing.isPixel) {\r\n rootY += this._lineSpacing.getValue(this._host);\r\n } else {\r\n rootY = rootY + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n }\r\n\r\n this._drawText(line.text, line.width, rootY, context);\r\n rootY += this._fontOffset.height;\r\n }\r\n\r\n context.restore();\r\n\r\n // Cursor\r\n if (this._isFocused) {\r\n // Render cursor\r\n if (!this._blinkIsEven || this._isTextHighlightOn) {\r\n let cursorLeft =\r\n this._scrollLeft + context.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substring(0, this._cursorInfo.relativeStartIndex)).width;\r\n\r\n if (cursorLeft < this._clipTextLeft) {\r\n this._scrollLeft += this._clipTextLeft - cursorLeft;\r\n cursorLeft = this._clipTextLeft;\r\n this._markAsDirty();\r\n } else if (cursorLeft > this._clipTextLeft + this._availableWidth) {\r\n this._scrollLeft += this._clipTextLeft + this._availableWidth - cursorLeft;\r\n cursorLeft = this._clipTextLeft + this._availableWidth;\r\n this._markAsDirty();\r\n }\r\n\r\n let cursorTop = this._scrollTop + this._cursorInfo.currentLineIndex * this._fontOffset.height; //cursorTop distance from top to cursor start\r\n\r\n if (cursorTop < this._clipTextTop) {\r\n this._scrollTop += this._clipTextTop - cursorTop;\r\n cursorTop = this._clipTextTop;\r\n this._markAsDirty();\r\n } else if (cursorTop + this._fontOffset.height > this._clipTextTop + this._availableHeight && this._availableHeight > this._fontOffset.height) {\r\n this._scrollTop += this._clipTextTop + this._availableHeight - cursorTop - this._fontOffset.height;\r\n cursorTop = this._clipTextTop + this._availableHeight - this._fontOffset.height;\r\n this._markAsDirty();\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n context.fillRect(cursorLeft, cursorTop, 2, this._fontOffset.height);\r\n }\r\n }\r\n\r\n this._resetBlinking();\r\n\r\n //show the highlighted text\r\n if (this._isTextHighlightOn) {\r\n clearTimeout(this._blinkTimeout);\r\n\r\n this._highlightedText = this.text.substring(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n context.globalAlpha = this._highligherOpacity;\r\n context.fillStyle = this._textHighlightColor;\r\n\r\n const startLineIndex = Math.min(this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialLineIndex);\r\n const endLineIndex = Math.max(this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialLineIndex);\r\n\r\n let highlightRootY = this._scrollTop + startLineIndex * this._fontOffset.height;\r\n\r\n for (let i = startLineIndex; i <= endLineIndex; i++) {\r\n const line = this._lines[i];\r\n\r\n let highlightRootX = this._scrollLeft as number;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n highlightRootX += 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n highlightRootX += width - line.width;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n highlightRootX += (width - line.width) / 2;\r\n break;\r\n }\r\n\r\n const begin = i === startLineIndex ? this._cursorInfo.relativeStartIndex : 0;\r\n const end = i === endLineIndex ? this._cursorInfo.relativeEndIndex : line.text.length;\r\n\r\n const leftOffsetWidth = context.measureText(line.text.substring(0, begin)).width;\r\n const selectedText = line.text.substring(begin, end);\r\n const hightlightWidth = context.measureText(selectedText).width;\r\n\r\n context.fillRect(highlightRootX + leftOffsetWidth, highlightRootY, hightlightWidth, this._fontOffset.height);\r\n\r\n highlightRootY += this._fontOffset.height;\r\n }\r\n\r\n if (this._cursorInfo.globalEndIndex === this._cursorInfo.globalStartIndex) {\r\n this._resetBlinking();\r\n }\r\n }\r\n }\r\n\r\n context.restore();\r\n\r\n // Border\r\n if (this._thickness) {\r\n if (this._isFocused) {\r\n if (this.focusedColor) {\r\n context.strokeStyle = this.focusedColor;\r\n }\r\n } else {\r\n if (this.color) {\r\n context.strokeStyle = this.color;\r\n }\r\n }\r\n\r\n context.lineWidth = this._thickness;\r\n\r\n context.strokeRect(\r\n this._currentMeasure.left + this._thickness / 2,\r\n this._currentMeasure.top + this._thickness / 2,\r\n this._currentMeasure.width - this._thickness,\r\n this._currentMeasure.height - this._thickness\r\n );\r\n }\r\n }\r\n\r\n private _resetBlinking() {\r\n clearTimeout(this._blinkTimeout);\r\n this._blinkTimeout = <any>setTimeout(() => {\r\n this._blinkIsEven = !this._blinkIsEven;\r\n this._markAsDirty();\r\n }, 500);\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n this._clickedCoordinateX = coordinates.x;\r\n this._clickedCoordinateY = coordinates.y;\r\n\r\n this._isTextHighlightOn = false;\r\n this._highlightedText = \"\";\r\n this._isPointerDown = true;\r\n this._host._capturingControl[pointerId] = this;\r\n if (this._host.focusedControl === this) {\r\n // Move cursor\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n return true;\r\n }\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._host.focusedControl = this;\r\n\r\n return true;\r\n }\r\n\r\n // for textselection\r\n public override _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\r\n // Avoid Chromium-like beahavior when this event is fired right after onPointerDown\r\n if (pi.event.movementX === 0 && pi.event.movementY === 0) {\r\n return;\r\n }\r\n\r\n if (this._host.focusedControl === this && this._isPointerDown && !this.isReadOnly) {\r\n this._clickedCoordinateX = coordinates.x;\r\n this._clickedCoordinateY = coordinates.y;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._isTextHighlightOn = true;\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n /**\r\n * Apply the correct position of cursor according to current modification\r\n */\r\n private _updateCursorPosition() {\r\n if (!this._isFocused) {\r\n return;\r\n }\r\n\r\n if (!this._textWrapper.text && this.placeholderText) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n this._cursorInfo.globalStartIndex = 0;\r\n this._cursorInfo.globalEndIndex = 0;\r\n this._cursorInfo.relativeStartIndex = 0;\r\n this._cursorInfo.relativeEndIndex = 0;\r\n } else {\r\n if (this._clickedCoordinateX && this._clickedCoordinateY) {\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: 0,\r\n relativeStartIndex: 0,\r\n relativeEndIndex: 0,\r\n currentLineIndex: 0,\r\n };\r\n }\r\n\r\n let globalIndex = 0;\r\n let relativeIndex = 0;\r\n\r\n const lastClickedCoordinateY = this._clickedCoordinateY - (this._scrollTop as number);\r\n\r\n const relativeCoordinateY = Math.floor(lastClickedCoordinateY / this._fontOffset.height);\r\n this._cursorInfo.currentLineIndex = Math.min(Math.max(relativeCoordinateY, 0), this._lines.length - 1);\r\n\r\n let currentSize = 0;\r\n\r\n const relativeXPosition = this._clickedCoordinateX - (this._scrollLeft ?? 0);\r\n\r\n let previousDist = 0;\r\n\r\n for (let index = 0; index < this._cursorInfo.currentLineIndex; index++) {\r\n const line = this._lines[index];\r\n globalIndex += line.text.length + line.lineEnding.length;\r\n }\r\n\r\n while (currentSize < relativeXPosition && this._lines[this._cursorInfo.currentLineIndex].text.length > relativeIndex) {\r\n relativeIndex++;\r\n previousDist = Math.abs(relativeXPosition - currentSize);\r\n currentSize = this._contextForBreakLines.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substring(0, relativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(relativeXPosition - currentSize) > previousDist && relativeIndex > 0) {\r\n relativeIndex--;\r\n }\r\n\r\n globalIndex += relativeIndex;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = globalIndex;\r\n this._cursorInfo.relativeStartIndex = relativeIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n if (globalIndex < this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalStartIndex = globalIndex;\r\n this._cursorInfo.relativeStartIndex = relativeIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n } else {\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeStartIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n this._cursorInfo.globalEndIndex = globalIndex;\r\n this._cursorInfo.relativeEndIndex = relativeIndex;\r\n }\r\n }\r\n\r\n // Avoid the caret during highlighting\r\n this._blinkIsEven = this._isTextHighlightOn;\r\n this._clickedCoordinateX = null;\r\n this._clickedCoordinateY = null;\r\n } else {\r\n // Standard behavior same as Current line is at least above the initial highlight index\r\n this._cursorInfo.relativeStartIndex = 0;\r\n this._cursorInfo.currentLineIndex = 0;\r\n\r\n let lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n let tmpLength = 0;\r\n\r\n while (tmpLength + lineLength <= this._cursorInfo.globalStartIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n\r\n this._cursorInfo.relativeStartIndex = this._cursorInfo.globalStartIndex - tmpLength;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.relativeStartIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n } else if (this._highlightCursorInfo.initialStartIndex !== -1 && this._cursorInfo.globalStartIndex >= this._highlightCursorInfo.initialStartIndex) {\r\n // Current line is at least below the initial highlight index\r\n while (tmpLength + lineLength <= this._cursorInfo.globalEndIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.globalEndIndex - tmpLength;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update all values of cursor information based on cursorIndex value\r\n *\r\n * @param offset The index to take care of\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected override _updateValueFromCursorIndex(offset: number) {\r\n // Override to avoid parent behavior during _onPointerMove\r\n }\r\n\r\n /**\r\n * Select the word immediatly under the cursor on double click\r\n *\r\n * @param _evt Pointer informations of double click\r\n * @internal\r\n */\r\n protected override _processDblClick(_evt: PointerInfo) {\r\n //pre-find the start and end index of the word under cursor, speeds up the rendering\r\n let moveLeft, moveRight;\r\n do {\r\n moveLeft = this._cursorInfo.globalStartIndex > 0 && this._textWrapper.isWord(this._cursorInfo.globalStartIndex - 1) ? --this._cursorInfo.globalStartIndex : 0;\r\n moveRight =\r\n this._cursorInfo.globalEndIndex < this._textWrapper.length && this._textWrapper.isWord(this._cursorInfo.globalEndIndex) ? ++this._cursorInfo.globalEndIndex : 0;\r\n } while (moveLeft || moveRight);\r\n\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this.onTextHighlightObservable.notifyObservers(this);\r\n\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /** @internal */\r\n protected override _selectAllText() {\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n\r\n this._highlightCursorInfo = {\r\n initialStartIndex: 0,\r\n initialRelativeStartIndex: 0,\r\n initialLineIndex: 0,\r\n };\r\n\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: this._textWrapper.length,\r\n relativeEndIndex: this._lines[this._lines.length - 1].text.length,\r\n relativeStartIndex: 0,\r\n currentLineIndex: this._lines.length - 1,\r\n };\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this.onLinesReadyObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.InputTextArea\", InputTextArea);\r\n"]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"textWrapper.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/textWrapper.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,MAAM,OAAO,WAAW;IAIpB,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACrE,CAAC;IAED,IAAW,IAAI,CAAC,GAAW;QACvB,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1E,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,MAAc,EAAE,SAAkB;QAClE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrG,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,aAAa,CAAC,CAAC;SAC1E;IACL,CAAC;IAEM,MAAM,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7E,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,MAAe;QACvC,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;gBACb,IAAI,GAAG,CAAC,CAAC;aACZ;iBAAM,IAAI,IAAI,IAAI,CAAC,EAAE;gBAClB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aAClD;iBAAM;gBACH,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aAC7E;YACD,IAAI,MAAM,KAAK,SAAS,EAAE;gBACtB,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC;aAC3C;iBAAM,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;gBACtB,MAAM,GAAG,CAAC,CAAC;aACd;iBAAM,IAAI,MAAM,GAAG,CAAC,EAAE;gBACnB,MAAM,GAAG,CAAC,CAAC;aACd;YACD,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE;gBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;aAClD;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACxB;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,
|
1
|
+
{"version":3,"file":"textWrapper.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/textWrapper.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,MAAM,OAAO,WAAW;IAIpB,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACrE,CAAC;IAED,IAAW,IAAI,CAAC,GAAW;QACvB,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1E,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,MAAc,EAAE,SAAkB;QAClE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrG,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,aAAa,CAAC,CAAC;SAC1E;IACL,CAAC;IAEM,MAAM,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7E,CAAC;IAEM,MAAM,CAAC,IAAY,EAAE,MAAe;QACvC,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;gBACb,IAAI,GAAG,CAAC,CAAC;aACZ;iBAAM,IAAI,IAAI,IAAI,CAAC,EAAE;gBAClB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aAClD;iBAAM;gBACH,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aAC7E;YACD,IAAI,MAAM,KAAK,SAAS,EAAE;gBACtB,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC;aAC3C;iBAAM,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;gBACtB,MAAM,GAAG,CAAC,CAAC;aACd;iBAAM,IAAI,MAAM,GAAG,CAAC,EAAE;gBACnB,MAAM,GAAG,CAAC,CAAC;aACd;YACD,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE;gBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;aAClD;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACxB;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1E,CAAC;IAEM,SAAS,CAAC,IAAY,EAAE,EAAW;QACtC,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;gBACb,IAAI,GAAG,CAAC,CAAC;aACZ;iBAAM,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBACvC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;aAClC;iBAAM,IAAI,IAAI,GAAG,CAAC,EAAE;gBACjB,IAAI,GAAG,CAAC,CAAC;aACZ;YACD,IAAI,EAAE,KAAK,SAAS,EAAE;gBAClB,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;aAChC;iBAAM,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE;gBAClB,EAAE,GAAG,CAAC,CAAC;aACV;iBAAM,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBACrC,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;aAChC;iBAAM,IAAI,EAAE,GAAG,CAAC,EAAE;gBACf,EAAE,GAAG,CAAC,CAAC;aACV;YACD,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,OAAO,IAAI,GAAG,EAAE,EAAE;gBACd,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;aAC1C;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACxB;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEM,MAAM,CAAC,KAAa;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7G,CAAC;CACJ","sourcesContent":["/** @internal */\r\nexport class TextWrapper {\r\n private _text: string;\r\n private _characters: string[] | undefined;\r\n\r\n public get text(): string {\r\n return this._characters ? this._characters.join(\"\") : this._text;\r\n }\r\n\r\n public set text(txt: string) {\r\n this._text = txt;\r\n this._characters = Array.from && Array.from(txt);\r\n }\r\n\r\n public get length(): number {\r\n return this._characters ? this._characters.length : this._text.length;\r\n }\r\n\r\n public removePart(idxStart: number, idxEnd: number, insertTxt?: string): void {\r\n this._text = this._text.slice(0, idxStart) + (insertTxt ? insertTxt : \"\") + this._text.slice(idxEnd);\r\n if (this._characters) {\r\n const newCharacters = insertTxt ? Array.from(insertTxt) : [];\r\n this._characters.splice(idxStart, idxEnd - idxStart, ...newCharacters);\r\n }\r\n }\r\n\r\n public charAt(idx: number): string {\r\n return this._characters ? this._characters[idx] : this._text.charAt(idx);\r\n }\r\n\r\n public substr(from: number, length?: number): string {\r\n if (this._characters) {\r\n if (isNaN(from)) {\r\n from = 0;\r\n } else if (from >= 0) {\r\n from = Math.min(from, this._characters.length);\r\n } else {\r\n from = this._characters.length + Math.max(from, -this._characters.length);\r\n }\r\n if (length === undefined) {\r\n length = this._characters.length - from;\r\n } else if (isNaN(length)) {\r\n length = 0;\r\n } else if (length < 0) {\r\n length = 0;\r\n }\r\n const temp = [];\r\n while (--length >= 0) {\r\n temp[length] = this._characters[from + length];\r\n }\r\n return temp.join(\"\");\r\n }\r\n\r\n return this._text.substring(from, length ? length + from : undefined);\r\n }\r\n\r\n public substring(from: number, to?: number): string {\r\n if (this._characters) {\r\n if (isNaN(from)) {\r\n from = 0;\r\n } else if (from > this._characters.length) {\r\n from = this._characters.length;\r\n } else if (from < 0) {\r\n from = 0;\r\n }\r\n if (to === undefined) {\r\n to = this._characters.length;\r\n } else if (isNaN(to)) {\r\n to = 0;\r\n } else if (to > this._characters.length) {\r\n to = this._characters.length;\r\n } else if (to < 0) {\r\n to = 0;\r\n }\r\n const temp = [];\r\n let idx = 0;\r\n while (from < to) {\r\n temp[idx++] = this._characters[from++];\r\n }\r\n return temp.join(\"\");\r\n }\r\n\r\n return this._text.substring(from, to);\r\n }\r\n\r\n public isWord(index: number): boolean {\r\n const rWord = /\\w/g;\r\n return this._characters ? this._characters[index].search(rWord) !== -1 : this._text.search(rWord) !== -1;\r\n }\r\n}\r\n"]}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { Tools } from "@babylonjs/core/Misc/tools.js";
|
2
|
-
import {
|
2
|
+
import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
|
3
3
|
import { Container3D } from "./container3D.js";
|
4
4
|
/**
|
5
5
|
* Abstract class used to create a container panel deployed on the surface of a volume
|
@@ -82,7 +82,6 @@ export class VolumeBasedPanel extends Container3D {
|
|
82
82
|
let rows = 0;
|
83
83
|
let columns = 0;
|
84
84
|
let controlCount = 0;
|
85
|
-
const currentInverseWorld = Matrix.Invert(this.node.computeWorldMatrix(true));
|
86
85
|
// Measure
|
87
86
|
for (const child of this._children) {
|
88
87
|
if (!child.mesh) {
|
@@ -90,13 +89,19 @@ export class VolumeBasedPanel extends Container3D {
|
|
90
89
|
}
|
91
90
|
controlCount++;
|
92
91
|
child.mesh.computeWorldMatrix(true);
|
93
|
-
|
94
|
-
|
95
|
-
const
|
96
|
-
const
|
97
|
-
|
98
|
-
|
99
|
-
|
92
|
+
const extendSize = child.mesh.getBoundingInfo().boundingBox.extendSize;
|
93
|
+
// to be safe, check descendants
|
94
|
+
const descendants = child.mesh.getDescendants(false);
|
95
|
+
for (const descendant of descendants) {
|
96
|
+
descendant.computeWorldMatrix(true);
|
97
|
+
const casted = descendant;
|
98
|
+
if (typeof casted.getBoundingInfo === "function") {
|
99
|
+
const extendSizeChild = casted.getBoundingInfo().boundingBox.extendSize;
|
100
|
+
extendSize.x = Math.max(extendSize.x, extendSizeChild.x);
|
101
|
+
extendSize.y = Math.max(extendSize.y, extendSizeChild.y);
|
102
|
+
extendSize.z = Math.max(extendSize.z, extendSizeChild.z);
|
103
|
+
}
|
104
|
+
}
|
100
105
|
this._cellWidth = Math.max(this._cellWidth, extendSize.x * 2);
|
101
106
|
this._cellHeight = Math.max(this._cellHeight, extendSize.y * 2);
|
102
107
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"volumeBasedPanel.js","sourceRoot":"","sources":["../../../../../dev/gui/src/3D/controls/volumeBasedPanel.ts"],"names":[],"mappings":"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","sourcesContent":["import { Tools } from \"core/Misc/tools\";\r\nimport { Matrix, Vector3, TmpVectors } from \"core/Maths/math.vector\";\r\nimport type { int } from \"core/types\";\r\n\r\nimport { Container3D } from \"./container3D\";\r\nimport type { Control3D } from \"./control3D\";\r\n\r\n/**\r\n * Abstract class used to create a container panel deployed on the surface of a volume\r\n */\r\nexport abstract class VolumeBasedPanel extends Container3D {\r\n private _columns = 10;\r\n private _rows = 0;\r\n private _rowThenColum = true;\r\n\r\n private _orientation = Container3D.FACEORIGIN_ORIENTATION;\r\n\r\n protected _cellWidth: number;\r\n protected _cellHeight: number;\r\n\r\n /**\r\n * Gets or sets the distance between elements\r\n */\r\n public margin = 0;\r\n\r\n /**\r\n * Gets or sets the orientation to apply to all controls (BABYLON.Container3D.FaceOriginReversedOrientation by default)\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | UNSET_ORIENTATION | Control rotation will remain unchanged |\r\n * | 1 | FACEORIGIN_ORIENTATION | Control will rotate to make it look at sphere central axis |\r\n * | 2 | FACEORIGINREVERSED_ORIENTATION | Control will rotate to make it look back at sphere central axis |\r\n * | 3 | FACEFORWARD_ORIENTATION | Control will rotate to look at z axis (0, 0, 1) |\r\n * | 4 | FACEFORWARDREVERSED_ORIENTATION | Control will rotate to look at negative z axis (0, 0, -1) |\r\n */\r\n public get orientation(): number {\r\n return this._orientation;\r\n }\r\n\r\n public set orientation(value: number) {\r\n if (this._orientation === value) {\r\n return;\r\n }\r\n\r\n this._orientation = value;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets the number of columns requested (10 by default).\r\n * The panel will automatically compute the number of rows based on number of child controls.\r\n */\r\n public get columns(): int {\r\n return this._columns;\r\n }\r\n\r\n public set columns(value: int) {\r\n if (this._columns === value) {\r\n return;\r\n }\r\n\r\n this._columns = value;\r\n this._rowThenColum = true;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets a the number of rows requested.\r\n * The panel will automatically compute the number of columns based on number of child controls.\r\n */\r\n public get rows(): int {\r\n return this._rows;\r\n }\r\n\r\n public set rows(value: int) {\r\n if (this._rows === value) {\r\n return;\r\n }\r\n\r\n this._rows = value;\r\n this._rowThenColum = false;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Creates new VolumeBasedPanel\r\n * @param name\r\n */\r\n public constructor(name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _arrangeChildren() {\r\n this._cellWidth = 0;\r\n this._cellHeight = 0;\r\n let rows = 0;\r\n let columns = 0;\r\n let controlCount = 0;\r\n\r\n const currentInverseWorld = Matrix.Invert(this.node!.computeWorldMatrix(true));\r\n\r\n // Measure\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n\r\n controlCount++;\r\n child.mesh.computeWorldMatrix(true);\r\n // child.mesh.getWorldMatrix().multiplyToRef(currentInverseWorld, Tmp.Matrix[0]);\r\n\r\n const boundingBox = child.mesh.getHierarchyBoundingVectors();\r\n const extendSize = TmpVectors.Vector3[0];\r\n const diff = TmpVectors.Vector3[1];\r\n\r\n boundingBox.max.subtractToRef(boundingBox.min, diff);\r\n\r\n diff.scaleInPlace(0.5);\r\n\r\n Vector3.TransformNormalToRef(diff, currentInverseWorld, extendSize);\r\n\r\n this._cellWidth = Math.max(this._cellWidth, extendSize.x * 2);\r\n this._cellHeight = Math.max(this._cellHeight, extendSize.y * 2);\r\n }\r\n\r\n this._cellWidth += this.margin * 2;\r\n this._cellHeight += this.margin * 2;\r\n\r\n // Arrange\r\n if (this._rowThenColum) {\r\n columns = this._columns;\r\n rows = Math.ceil(controlCount / this._columns);\r\n } else {\r\n rows = this._rows;\r\n columns = Math.ceil(controlCount / this._rows);\r\n }\r\n\r\n const startOffsetX = columns * 0.5 * this._cellWidth;\r\n const startOffsetY = rows * 0.5 * this._cellHeight;\r\n const nodeGrid = [];\r\n let cellCounter = 0;\r\n\r\n if (this._rowThenColum) {\r\n for (let r = 0; r < rows; r++) {\r\n for (let c = 0; c < columns; c++) {\r\n nodeGrid.push(new Vector3(c * this._cellWidth - startOffsetX + this._cellWidth / 2, r * this._cellHeight - startOffsetY + this._cellHeight / 2, 0));\r\n cellCounter++;\r\n if (cellCounter > controlCount) {\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (let c = 0; c < columns; c++) {\r\n for (let r = 0; r < rows; r++) {\r\n nodeGrid.push(new Vector3(c * this._cellWidth - startOffsetX + this._cellWidth / 2, r * this._cellHeight - startOffsetY + this._cellHeight / 2, 0));\r\n cellCounter++;\r\n if (cellCounter > controlCount) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n cellCounter = 0;\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n\r\n this._mapGridNode(child, nodeGrid[cellCounter]);\r\n\r\n cellCounter++;\r\n }\r\n\r\n this._finalProcessing();\r\n }\r\n\r\n /** Child classes must implement this function to provide correct control positioning */\r\n protected abstract _mapGridNode(control: Control3D, nodePosition: Vector3): void;\r\n\r\n /** Child classes can implement this function to provide additional processing */\r\n protected _finalProcessing() {}\r\n}\r\n"]}
|
1
|
+
{"version":3,"file":"volumeBasedPanel.js","sourceRoot":"","sources":["../../../../../dev/gui/src/3D/controls/volumeBasedPanel.ts"],"names":[],"mappings":"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","sourcesContent":["import { Tools } from \"core/Misc/tools\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport type { int } from \"core/types\";\r\n\r\nimport { Container3D } from \"./container3D\";\r\nimport type { Control3D } from \"./control3D\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\n\r\n/**\r\n * Abstract class used to create a container panel deployed on the surface of a volume\r\n */\r\nexport abstract class VolumeBasedPanel extends Container3D {\r\n private _columns = 10;\r\n private _rows = 0;\r\n private _rowThenColum = true;\r\n\r\n private _orientation = Container3D.FACEORIGIN_ORIENTATION;\r\n\r\n protected _cellWidth: number;\r\n protected _cellHeight: number;\r\n\r\n /**\r\n * Gets or sets the distance between elements\r\n */\r\n public margin = 0;\r\n\r\n /**\r\n * Gets or sets the orientation to apply to all controls (BABYLON.Container3D.FaceOriginReversedOrientation by default)\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | UNSET_ORIENTATION | Control rotation will remain unchanged |\r\n * | 1 | FACEORIGIN_ORIENTATION | Control will rotate to make it look at sphere central axis |\r\n * | 2 | FACEORIGINREVERSED_ORIENTATION | Control will rotate to make it look back at sphere central axis |\r\n * | 3 | FACEFORWARD_ORIENTATION | Control will rotate to look at z axis (0, 0, 1) |\r\n * | 4 | FACEFORWARDREVERSED_ORIENTATION | Control will rotate to look at negative z axis (0, 0, -1) |\r\n */\r\n public get orientation(): number {\r\n return this._orientation;\r\n }\r\n\r\n public set orientation(value: number) {\r\n if (this._orientation === value) {\r\n return;\r\n }\r\n\r\n this._orientation = value;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets the number of columns requested (10 by default).\r\n * The panel will automatically compute the number of rows based on number of child controls.\r\n */\r\n public get columns(): int {\r\n return this._columns;\r\n }\r\n\r\n public set columns(value: int) {\r\n if (this._columns === value) {\r\n return;\r\n }\r\n\r\n this._columns = value;\r\n this._rowThenColum = true;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets a the number of rows requested.\r\n * The panel will automatically compute the number of columns based on number of child controls.\r\n */\r\n public get rows(): int {\r\n return this._rows;\r\n }\r\n\r\n public set rows(value: int) {\r\n if (this._rows === value) {\r\n return;\r\n }\r\n\r\n this._rows = value;\r\n this._rowThenColum = false;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Creates new VolumeBasedPanel\r\n * @param name\r\n */\r\n public constructor(name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _arrangeChildren() {\r\n this._cellWidth = 0;\r\n this._cellHeight = 0;\r\n let rows = 0;\r\n let columns = 0;\r\n let controlCount = 0;\r\n // Measure\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n\r\n controlCount++;\r\n child.mesh.computeWorldMatrix(true);\r\n const extendSize = child.mesh.getBoundingInfo().boundingBox.extendSize;\r\n // to be safe, check descendants\r\n const descendants = child.mesh.getDescendants(false);\r\n for (const descendant of descendants) {\r\n descendant.computeWorldMatrix(true);\r\n const casted = descendant as AbstractMesh;\r\n if (typeof casted.getBoundingInfo === \"function\") {\r\n const extendSizeChild = casted.getBoundingInfo().boundingBox.extendSize;\r\n extendSize.x = Math.max(extendSize.x, extendSizeChild.x);\r\n extendSize.y = Math.max(extendSize.y, extendSizeChild.y);\r\n extendSize.z = Math.max(extendSize.z, extendSizeChild.z);\r\n }\r\n }\r\n\r\n this._cellWidth = Math.max(this._cellWidth, extendSize.x * 2);\r\n this._cellHeight = Math.max(this._cellHeight, extendSize.y * 2);\r\n }\r\n\r\n this._cellWidth += this.margin * 2;\r\n this._cellHeight += this.margin * 2;\r\n\r\n // Arrange\r\n if (this._rowThenColum) {\r\n columns = this._columns;\r\n rows = Math.ceil(controlCount / this._columns);\r\n } else {\r\n rows = this._rows;\r\n columns = Math.ceil(controlCount / this._rows);\r\n }\r\n\r\n const startOffsetX = columns * 0.5 * this._cellWidth;\r\n const startOffsetY = rows * 0.5 * this._cellHeight;\r\n const nodeGrid = [];\r\n let cellCounter = 0;\r\n\r\n if (this._rowThenColum) {\r\n for (let r = 0; r < rows; r++) {\r\n for (let c = 0; c < columns; c++) {\r\n nodeGrid.push(new Vector3(c * this._cellWidth - startOffsetX + this._cellWidth / 2, r * this._cellHeight - startOffsetY + this._cellHeight / 2, 0));\r\n cellCounter++;\r\n if (cellCounter > controlCount) {\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (let c = 0; c < columns; c++) {\r\n for (let r = 0; r < rows; r++) {\r\n nodeGrid.push(new Vector3(c * this._cellWidth - startOffsetX + this._cellWidth / 2, r * this._cellHeight - startOffsetY + this._cellHeight / 2, 0));\r\n cellCounter++;\r\n if (cellCounter > controlCount) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n cellCounter = 0;\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n\r\n this._mapGridNode(child, nodeGrid[cellCounter]);\r\n\r\n cellCounter++;\r\n }\r\n\r\n this._finalProcessing();\r\n }\r\n\r\n /** Child classes must implement this function to provide correct control positioning */\r\n protected abstract _mapGridNode(control: Control3D, nodePosition: Vector3): void;\r\n\r\n /** Child classes can implement this function to provide additional processing */\r\n protected _finalProcessing() {}\r\n}\r\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@babylonjs/gui",
|
3
|
-
"version": "7.
|
3
|
+
"version": "7.25.0",
|
4
4
|
"main": "index.js",
|
5
5
|
"module": "index.js",
|
6
6
|
"types": "index.d.ts",
|
@@ -13,12 +13,12 @@
|
|
13
13
|
],
|
14
14
|
"scripts": {
|
15
15
|
"build": "npm run clean && npm run compile",
|
16
|
-
"clean": "rimraf dist && rimraf *.tsbuildinfo && rimraf \"./**/*.!(md|json|build.json|lts.json)\"",
|
16
|
+
"clean": "rimraf dist && rimraf *.tsbuildinfo -g && rimraf \"./**/*.!(md|json|build.json|lts.json)\" -g",
|
17
17
|
"compile": "tsc -b tsconfig.build.json && tsc -b tsconfig.lts.json",
|
18
18
|
"postcompile": "build-tools -c add-js-to-es6"
|
19
19
|
},
|
20
20
|
"devDependencies": {
|
21
|
-
"@babylonjs/core": "^7.
|
21
|
+
"@babylonjs/core": "^7.25.0",
|
22
22
|
"@dev/build-tools": "^1.0.0",
|
23
23
|
"@lts/gui": "1.0.0"
|
24
24
|
},
|