eventHandler.ts 2.53 KB
import type { LightboxModeWebsocketService } from '.'
import { useNodeEvent } from '@/core/Library/hook/useNodeEvent'
import { EventTypeEnum } from '@/enums/datasource'
import type { MxState } from '@/fitCore/types'

interface MxEvent {
  state: MxState
}

type DispathFn = (eventName: EventTypeEnum, event: MxEvent) => void

export class EventHandler {
  constructor(public dispathEvent: DispathFn) {
    this.initEventListener()
  }

  initEventListener() {
    this.addClickEventListener()
    this.addDbClickEventListener()
    this.addMouseUpOrDownEventListener()
  }

  addDbClickEventListener() {
    const graphDblClick = window.DrawApp.editor.graph.dblClick
    const dispathEvent = this.dispathEvent
    window.DrawApp.editor.graph.dblClick = function (...args) {
      dispathEvent(EventTypeEnum.DOUBLE, args[0])
      graphDblClick.apply(this, args)
    }
  }

  addClickEventListener() {
    const graphDblClick = window.DrawApp.editor.graph.click
    const dispathEvent = this.dispathEvent
    window.DrawApp.editor.graph.click = function (...args) {
      dispathEvent(EventTypeEnum.SINGLE, ...args)
      graphDblClick.apply(this, args)
    }
  }

  addMouseUpOrDownEventListener() {
    const graphFireMouseEvent = window.DrawApp.editor.graph.fireMouseEvent
    window.DrawApp.editor.graph.fireMouseEvent = (eventName, event, sender) => {
      if (eventName === 'mouseUp')
        this.dispathEvent(EventTypeEnum.UP, event)

      if (eventName === 'mouseDown')
        this.dispathEvent(EventTypeEnum.DOWN, event)

      graphFireMouseEvent.apply(window.DrawApp.editor.graph, [eventName, event, sender])
    }
  }
}

export class DispathEvent {
  constructor(public service: LightboxModeWebsocketService) {
  }

  get nodeUtils() {
    return this.service.nodeUtils
  }

  dispathEvent(eventName: EventTypeEnum, event: MxEvent) {
    const { state } = event
    if (!state) return
    const { cell } = state
    if (!cell) return

    const id = cell.getId()
    const node = this.service.dataSource.find(item => item.id === id)
    if (node && node.eventJson) {
      const { handlerMouseDown, handlerMouseClick, handlerMouseDoubleClick, handlerMouseUp } = useNodeEvent(node.eventJson, node.dataSourceJson)
      switch (eventName) {
        case EventTypeEnum.DOWN:
          handlerMouseDown()
          break
        case EventTypeEnum.UP:
          handlerMouseUp()
          break
        case EventTypeEnum.SINGLE:
          handlerMouseClick()
          break
        case EventTypeEnum.DOUBLE:
          handlerMouseDoubleClick()
          break
      }
    }
  }
}