| 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
import { __extends } from "tslib"; 
 | 
import Eventful from 'zrender/lib/core/Eventful.js'; 
 | 
import * as eventTool from 'zrender/lib/core/event.js'; 
 | 
import * as interactionMutex from './interactionMutex.js'; 
 | 
import { isString, bind, defaults, clone } from 'zrender/lib/core/util.js'; 
 | 
; 
 | 
var RoamController = /** @class */function (_super) { 
 | 
  __extends(RoamController, _super); 
 | 
  function RoamController(zr) { 
 | 
    var _this = _super.call(this) || this; 
 | 
    _this._zr = zr; 
 | 
    // Avoid two roamController bind the same handler 
 | 
    var mousedownHandler = bind(_this._mousedownHandler, _this); 
 | 
    var mousemoveHandler = bind(_this._mousemoveHandler, _this); 
 | 
    var mouseupHandler = bind(_this._mouseupHandler, _this); 
 | 
    var mousewheelHandler = bind(_this._mousewheelHandler, _this); 
 | 
    var pinchHandler = bind(_this._pinchHandler, _this); 
 | 
    /** 
 | 
     * Notice: only enable needed types. For example, if 'zoom' 
 | 
     * is not needed, 'zoom' should not be enabled, otherwise 
 | 
     * default mousewheel behaviour (scroll page) will be disabled. 
 | 
     */ 
 | 
    _this.enable = function (controlType, opt) { 
 | 
      // Disable previous first 
 | 
      this.disable(); 
 | 
      this._opt = defaults(clone(opt) || {}, { 
 | 
        zoomOnMouseWheel: true, 
 | 
        moveOnMouseMove: true, 
 | 
        // By default, wheel do not trigger move. 
 | 
        moveOnMouseWheel: false, 
 | 
        preventDefaultMouseMove: true 
 | 
      }); 
 | 
      if (controlType == null) { 
 | 
        controlType = true; 
 | 
      } 
 | 
      if (controlType === true || controlType === 'move' || controlType === 'pan') { 
 | 
        zr.on('mousedown', mousedownHandler); 
 | 
        zr.on('mousemove', mousemoveHandler); 
 | 
        zr.on('mouseup', mouseupHandler); 
 | 
      } 
 | 
      if (controlType === true || controlType === 'scale' || controlType === 'zoom') { 
 | 
        zr.on('mousewheel', mousewheelHandler); 
 | 
        zr.on('pinch', pinchHandler); 
 | 
      } 
 | 
    }; 
 | 
    _this.disable = function () { 
 | 
      zr.off('mousedown', mousedownHandler); 
 | 
      zr.off('mousemove', mousemoveHandler); 
 | 
      zr.off('mouseup', mouseupHandler); 
 | 
      zr.off('mousewheel', mousewheelHandler); 
 | 
      zr.off('pinch', pinchHandler); 
 | 
    }; 
 | 
    return _this; 
 | 
  } 
 | 
  RoamController.prototype.isDragging = function () { 
 | 
    return this._dragging; 
 | 
  }; 
 | 
  RoamController.prototype.isPinching = function () { 
 | 
    return this._pinching; 
 | 
  }; 
 | 
  RoamController.prototype.setPointerChecker = function (pointerChecker) { 
 | 
    this.pointerChecker = pointerChecker; 
 | 
  }; 
 | 
  RoamController.prototype.dispose = function () { 
 | 
    this.disable(); 
 | 
  }; 
 | 
  RoamController.prototype._mousedownHandler = function (e) { 
 | 
    if (eventTool.isMiddleOrRightButtonOnMouseUpDown(e)) { 
 | 
      return; 
 | 
    } 
 | 
    var el = e.target; 
 | 
    while (el) { 
 | 
      if (el.draggable) { 
 | 
        return; 
 | 
      } 
 | 
      // check if host is draggable 
 | 
      el = el.__hostTarget || el.parent; 
 | 
    } 
 | 
    var x = e.offsetX; 
 | 
    var y = e.offsetY; 
 | 
    // Only check on mosedown, but not mousemove. 
 | 
    // Mouse can be out of target when mouse moving. 
 | 
    if (this.pointerChecker && this.pointerChecker(e, x, y)) { 
 | 
      this._x = x; 
 | 
      this._y = y; 
 | 
      this._dragging = true; 
 | 
    } 
 | 
  }; 
 | 
  RoamController.prototype._mousemoveHandler = function (e) { 
 | 
    if (!this._dragging || !isAvailableBehavior('moveOnMouseMove', e, this._opt) || e.gestureEvent === 'pinch' || interactionMutex.isTaken(this._zr, 'globalPan')) { 
 | 
      return; 
 | 
    } 
 | 
    var x = e.offsetX; 
 | 
    var y = e.offsetY; 
 | 
    var oldX = this._x; 
 | 
    var oldY = this._y; 
 | 
    var dx = x - oldX; 
 | 
    var dy = y - oldY; 
 | 
    this._x = x; 
 | 
    this._y = y; 
 | 
    this._opt.preventDefaultMouseMove && eventTool.stop(e.event); 
 | 
    trigger(this, 'pan', 'moveOnMouseMove', e, { 
 | 
      dx: dx, 
 | 
      dy: dy, 
 | 
      oldX: oldX, 
 | 
      oldY: oldY, 
 | 
      newX: x, 
 | 
      newY: y, 
 | 
      isAvailableBehavior: null 
 | 
    }); 
 | 
  }; 
 | 
  RoamController.prototype._mouseupHandler = function (e) { 
 | 
    if (!eventTool.isMiddleOrRightButtonOnMouseUpDown(e)) { 
 | 
      this._dragging = false; 
 | 
    } 
 | 
  }; 
 | 
  RoamController.prototype._mousewheelHandler = function (e) { 
 | 
    var shouldZoom = isAvailableBehavior('zoomOnMouseWheel', e, this._opt); 
 | 
    var shouldMove = isAvailableBehavior('moveOnMouseWheel', e, this._opt); 
 | 
    var wheelDelta = e.wheelDelta; 
 | 
    var absWheelDeltaDelta = Math.abs(wheelDelta); 
 | 
    var originX = e.offsetX; 
 | 
    var originY = e.offsetY; 
 | 
    // wheelDelta maybe -0 in chrome mac. 
 | 
    if (wheelDelta === 0 || !shouldZoom && !shouldMove) { 
 | 
      return; 
 | 
    } 
 | 
    // If both `shouldZoom` and `shouldMove` is true, trigger 
 | 
    // their event both, and the final behavior is determined 
 | 
    // by event listener themselves. 
 | 
    if (shouldZoom) { 
 | 
      // Convenience: 
 | 
      // Mac and VM Windows on Mac: scroll up: zoom out. 
 | 
      // Windows: scroll up: zoom in. 
 | 
      // FIXME: Should do more test in different environment. 
 | 
      // wheelDelta is too complicated in difference nvironment 
 | 
      // (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel), 
 | 
      // although it has been normallized by zrender. 
 | 
      // wheelDelta of mouse wheel is bigger than touch pad. 
 | 
      var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1; 
 | 
      var scale = wheelDelta > 0 ? factor : 1 / factor; 
 | 
      checkPointerAndTrigger(this, 'zoom', 'zoomOnMouseWheel', e, { 
 | 
        scale: scale, 
 | 
        originX: originX, 
 | 
        originY: originY, 
 | 
        isAvailableBehavior: null 
 | 
      }); 
 | 
    } 
 | 
    if (shouldMove) { 
 | 
      // FIXME: Should do more test in different environment. 
 | 
      var absDelta = Math.abs(wheelDelta); 
 | 
      // wheelDelta of mouse wheel is bigger than touch pad. 
 | 
      var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05); 
 | 
      checkPointerAndTrigger(this, 'scrollMove', 'moveOnMouseWheel', e, { 
 | 
        scrollDelta: scrollDelta, 
 | 
        originX: originX, 
 | 
        originY: originY, 
 | 
        isAvailableBehavior: null 
 | 
      }); 
 | 
    } 
 | 
  }; 
 | 
  RoamController.prototype._pinchHandler = function (e) { 
 | 
    if (interactionMutex.isTaken(this._zr, 'globalPan')) { 
 | 
      return; 
 | 
    } 
 | 
    var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1; 
 | 
    checkPointerAndTrigger(this, 'zoom', null, e, { 
 | 
      scale: scale, 
 | 
      originX: e.pinchX, 
 | 
      originY: e.pinchY, 
 | 
      isAvailableBehavior: null 
 | 
    }); 
 | 
  }; 
 | 
  return RoamController; 
 | 
}(Eventful); 
 | 
function checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) { 
 | 
  if (controller.pointerChecker && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)) { 
 | 
    // When mouse is out of roamController rect, 
 | 
    // default befavoius should not be be disabled, otherwise 
 | 
    // page sliding is disabled, contrary to expectation. 
 | 
    eventTool.stop(e.event); 
 | 
    trigger(controller, eventName, behaviorToCheck, e, contollerEvent); 
 | 
  } 
 | 
} 
 | 
function trigger(controller, eventName, behaviorToCheck, e, contollerEvent) { 
 | 
  // Also provide behavior checker for event listener, for some case that 
 | 
  // multiple components share one listener. 
 | 
  contollerEvent.isAvailableBehavior = bind(isAvailableBehavior, null, behaviorToCheck, e); 
 | 
  // TODO should not have type issue. 
 | 
  controller.trigger(eventName, contollerEvent); 
 | 
} 
 | 
// settings: { 
 | 
//     zoomOnMouseWheel 
 | 
//     moveOnMouseMove 
 | 
//     moveOnMouseWheel 
 | 
// } 
 | 
// The value can be: true / false / 'shift' / 'ctrl' / 'alt'. 
 | 
function isAvailableBehavior(behaviorToCheck, e, settings) { 
 | 
  var setting = settings[behaviorToCheck]; 
 | 
  return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + 'Key']); 
 | 
} 
 | 
export default RoamController; 
 |