{"version":3,"file":"ITextClickBehavior.mjs","sources":["../../../../src/shapes/IText/ITextClickBehavior.ts"],"sourcesContent":["import type { TPointerEvent, TPointerEventInfo } from '../../EventTypeDefs';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport { stopEvent } from '../../util/dom_event';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\n\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n  Props extends TOptions<TextProps> = Partial<TextProps>,\n  SProps extends SerializedTextProps = SerializedTextProps,\n  EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior<Props, SProps, EventSpec> {\n  private declare __lastSelected: boolean;\n  private declare __lastClickTime: number;\n  private declare __lastLastClickTime: number;\n  private declare __lastPointer: XY | Record<string, never>;\n  private declare __newClickTime: number;\n\n  protected draggableTextDelegate: DraggableTextDelegate;\n\n  initBehavior() {\n    // Initializes event handlers related to cursor or selection\n    this.on('mousedown', this._mouseDownHandler);\n    this.on('mousedown:before', this._mouseDownHandlerBefore);\n    this.on('mouseup', this.mouseUpHandler);\n    this.on('mousedblclick', this.doubleClickHandler);\n    this.on('tripleclick', this.tripleClickHandler);\n\n    // Initializes \"dbclick\" event handler\n    this.__lastClickTime = +new Date();\n    // for triple click\n    this.__lastLastClickTime = +new Date();\n    this.__lastPointer = {};\n    this.on('mousedown', this.onMouseDown);\n\n    // @ts-expect-error in reality it is an IText instance\n    this.draggableTextDelegate = new DraggableTextDelegate(this);\n\n    super.initBehavior();\n  }\n\n  /**\n   * If this method returns true a mouse move operation over a text selection\n   * will not prevent the native mouse event allowing the browser to start a drag operation.\n   * shouldStartDragging can be read 'do not prevent default for mouse move event'\n   * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n   * @returns\n   */\n  shouldStartDragging() {\n    return this.draggableTextDelegate.isActive();\n  }\n\n  /**\n   * @public override this method to control whether instance should/shouldn't become a drag source,\n   * @see also {@link DraggableTextDelegate#isActive}\n   * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n   * @returns {boolean} should handle event\n   */\n  onDragStart(e: DragEvent) {\n    return this.draggableTextDelegate.onDragStart(e);\n  }\n\n  /**\n   * @public override this method to control whether instance should/shouldn't become a drop target\n   */\n  canDrop(e: DragEvent) {\n    return this.draggableTextDelegate.canDrop(e);\n  }\n\n  /**\n   * Default event handler to simulate triple click\n   * @private\n   */\n  onMouseDown(options: TPointerEventInfo) {\n    if (!this.canvas) {\n      return;\n    }\n    this.__newClickTime = +new Date();\n    const newPointer = options.pointer;\n    if (this.isTripleClick(newPointer)) {\n      this.fire('tripleclick', options);\n      stopEvent(options.e);\n    }\n    this.__lastLastClickTime = this.__lastClickTime;\n    this.__lastClickTime = this.__newClickTime;\n    this.__lastPointer = newPointer;\n    this.__lastSelected = this.selected && !this.getActiveControl();\n  }\n\n  isTripleClick(newPointer: XY) {\n    return (\n      this.__newClickTime - this.__lastClickTime < 500 &&\n      this.__lastClickTime - this.__lastLastClickTime < 500 &&\n      this.__lastPointer.x === newPointer.x &&\n      this.__lastPointer.y === newPointer.y\n    );\n  }\n\n  /**\n   * Default handler for double click, select a word\n   */\n  doubleClickHandler(options: TPointerEventInfo) {\n    if (!this.isEditing) {\n      return;\n    }\n    this.selectWord(this.getSelectionStartFromPointer(options.e));\n  }\n\n  /**\n   * Default handler for triple click, select a line\n   */\n  tripleClickHandler(options: TPointerEventInfo) {\n    if (!this.isEditing) {\n      return;\n    }\n    this.selectLine(this.getSelectionStartFromPointer(options.e));\n  }\n\n  /**\n   * Default event handler for the basic functionalities needed on _mouseDown\n   * can be overridden to do something different.\n   * Scope of this implementation is: find the click position, set selectionStart\n   * find selectionEnd, initialize the drawing of either cursor or selection area\n   * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n   * current compositionMode. It will be set to false.\n   */\n  _mouseDownHandler({ e }: TPointerEventInfo) {\n    if (\n      !this.canvas ||\n      !this.editable ||\n      notALeftClick(e) ||\n      this.getActiveControl()\n    ) {\n      return;\n    }\n\n    if (this.draggableTextDelegate.start(e)) {\n      return;\n    }\n\n    this.canvas.textEditingManager.register(this);\n\n    if (this.selected) {\n      this.inCompositionMode = false;\n      this.setCursorByClick(e);\n    }\n\n    if (this.isEditing) {\n      this.__selectionStartOnMouseDown = this.selectionStart;\n      if (this.selectionStart === this.selectionEnd) {\n        this.abortCursorAnimation();\n      }\n      this.renderCursorOrSelection();\n    }\n  }\n\n  /**\n   * Default event handler for the basic functionalities needed on mousedown:before\n   * can be overridden to do something different.\n   * Scope of this implementation is: verify the object is already selected when mousing down\n   */\n  _mouseDownHandlerBefore({ e }: TPointerEventInfo) {\n    if (!this.canvas || !this.editable || notALeftClick(e)) {\n      return;\n    }\n    // we want to avoid that an object that was selected and then becomes unselectable,\n    // may trigger editing mode in some way.\n    this.selected = this === this.canvas._activeObject;\n  }\n\n  /**\n   * standard handler for mouse up, overridable\n   * @private\n   */\n  mouseUpHandler({ e, transform }: TPointerEventInfo) {\n    const didDrag = this.draggableTextDelegate.end(e);\n    if (this.canvas) {\n      this.canvas.textEditingManager.unregister(this);\n\n      const activeObject = this.canvas._activeObject;\n      if (activeObject && activeObject !== this) {\n        // avoid running this logic when there is an active object\n        // this because is possible with shift click and fast clicks,\n        // to rapidly deselect and reselect this object and trigger an enterEdit\n        return;\n      }\n    }\n    if (\n      !this.editable ||\n      (this.group && !this.group.interactive) ||\n      (transform && transform.actionPerformed) ||\n      notALeftClick(e) ||\n      didDrag\n    ) {\n      return;\n    }\n\n    if (this.__lastSelected && !this.getActiveControl()) {\n      this.selected = false;\n      this.__lastSelected = false;\n      this.enterEditing(e);\n      if (this.selectionStart === this.selectionEnd) {\n        this.initDelayedCursor(true);\n      } else {\n        this.renderCursorOrSelection();\n      }\n    } else {\n      this.selected = true;\n    }\n  }\n\n  /**\n   * Changes cursor location in a text depending on passed pointer (x/y) object\n   * @param {TPointerEvent} e Event object\n   */\n  setCursorByClick(e: TPointerEvent) {\n    const newSelection = this.getSelectionStartFromPointer(e),\n      start = this.selectionStart,\n      end = this.selectionEnd;\n    if (e.shiftKey) {\n      this.setSelectionStartEndWithShift(start, end, newSelection);\n    } else {\n      this.selectionStart = newSelection;\n      this.selectionEnd = newSelection;\n    }\n    if (this.isEditing) {\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  }\n\n  /**\n   * Returns index of a character corresponding to where an object was clicked\n   * @param {TPointerEvent} e Event object\n   * @return {Number} Index of a character\n   */\n  getSelectionStartFromPointer(e: TPointerEvent): number {\n    const mouseOffset = this.canvas!.getScenePoint(e)\n      .transform(invertTransform(this.calcTransformMatrix()))\n      .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n    let height = 0,\n      charIndex = 0,\n      lineIndex = 0;\n\n    for (let i = 0; i < this._textLines.length; i++) {\n      if (height <= mouseOffset.y) {\n        height += this.getHeightOfLine(i);\n        lineIndex = i;\n        if (i > 0) {\n          charIndex +=\n            this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n        }\n      } else {\n        break;\n      }\n    }\n    const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n    let width = lineLeftOffset;\n    const charLength = this._textLines[lineIndex].length;\n    const chars = this.__charBounds[lineIndex];\n    for (let j = 0; j < charLength; j++) {\n      // i removed something about flipX here, check.\n      const charWidth = chars[j].kernedWidth;\n      const widthAfter = width + charWidth;\n      if (mouseOffset.x <= widthAfter) {\n        // if the pointer is closer to the end of the char we increment charIndex\n        // in order to position the cursor after the char\n        if (\n          Math.abs(mouseOffset.x - widthAfter) <=\n          Math.abs(mouseOffset.x - width)\n        ) {\n          charIndex++;\n        }\n        break;\n      }\n      width = widthAfter;\n      charIndex++;\n    }\n\n    return Math.min(\n      // if object is horizontally flipped, mirror cursor location from the end\n      this.flipX ? charLength - charIndex : charIndex,\n      this._text.length,\n    );\n  }\n}\n"],"names":["notALeftClick","e","button","ITextClickBehavior","ITextKeyBehavior","constructor","arguments","_defineProperty","initBehavior","on","_mouseDownHandler","_mouseDownHandlerBefore","mouseUpHandler","doubleClickHandler","tripleClickHandler","__lastClickTime","Date","__lastLastClickTime","__lastPointer","onMouseDown","draggableTextDelegate","DraggableTextDelegate","shouldStartDragging","isActive","onDragStart","canDrop","options","canvas","__newClickTime","newPointer","pointer","isTripleClick","fire","stopEvent","__lastSelected","selected","getActiveControl","x","y","isEditing","selectWord","getSelectionStartFromPointer","selectLine","_ref","editable","start","textEditingManager","register","inCompositionMode","setCursorByClick","__selectionStartOnMouseDown","selectionStart","selectionEnd","abortCursorAnimation","renderCursorOrSelection","_ref2","_activeObject","_ref3","transform","didDrag","end","unregister","activeObject","group","interactive","actionPerformed","enterEditing","initDelayedCursor","newSelection","shiftKey","setSelectionStartEndWithShift","_fireSelectionChanged","_updateTextarea","mouseOffset","getScenePoint","invertTransform","calcTransformMatrix","add","Point","_getLeftOffset","_getTopOffset","height","charIndex","lineIndex","i","_textLines","length","getHeightOfLine","missingNewlineOffset","lineLeftOffset","Math","abs","_getLineLeftOffset","width","charLength","chars","__charBounds","j","charWidth","kernedWidth","widthAfter","min","flipX","_text"],"mappings":"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"}