| 
/* 
 | 
* 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 SymbolDraw from '../helper/SymbolDraw.js'; 
 | 
import LineDraw from '../helper/LineDraw.js'; 
 | 
import RoamController from '../../component/helper/RoamController.js'; 
 | 
import * as roamHelper from '../../component/helper/roamHelper.js'; 
 | 
import { onIrrelevantElement } from '../../component/helper/cursorHelper.js'; 
 | 
import * as graphic from '../../util/graphic.js'; 
 | 
import adjustEdge from './adjustEdge.js'; 
 | 
import { getNodeGlobalScale } from './graphHelper.js'; 
 | 
import ChartView from '../../view/Chart.js'; 
 | 
import { getECData } from '../../util/innerStore.js'; 
 | 
import { simpleLayoutEdge } from './simpleLayoutHelper.js'; 
 | 
import { circularLayout, rotateNodeLabel } from './circularLayoutHelper.js'; 
 | 
function isViewCoordSys(coordSys) { 
 | 
  return coordSys.type === 'view'; 
 | 
} 
 | 
var GraphView = /** @class */function (_super) { 
 | 
  __extends(GraphView, _super); 
 | 
  function GraphView() { 
 | 
    var _this = _super !== null && _super.apply(this, arguments) || this; 
 | 
    _this.type = GraphView.type; 
 | 
    return _this; 
 | 
  } 
 | 
  GraphView.prototype.init = function (ecModel, api) { 
 | 
    var symbolDraw = new SymbolDraw(); 
 | 
    var lineDraw = new LineDraw(); 
 | 
    var group = this.group; 
 | 
    this._controller = new RoamController(api.getZr()); 
 | 
    this._controllerHost = { 
 | 
      target: group 
 | 
    }; 
 | 
    group.add(symbolDraw.group); 
 | 
    group.add(lineDraw.group); 
 | 
    this._symbolDraw = symbolDraw; 
 | 
    this._lineDraw = lineDraw; 
 | 
    this._firstRender = true; 
 | 
  }; 
 | 
  GraphView.prototype.render = function (seriesModel, ecModel, api) { 
 | 
    var _this = this; 
 | 
    var coordSys = seriesModel.coordinateSystem; 
 | 
    this._model = seriesModel; 
 | 
    var symbolDraw = this._symbolDraw; 
 | 
    var lineDraw = this._lineDraw; 
 | 
    var group = this.group; 
 | 
    if (isViewCoordSys(coordSys)) { 
 | 
      var groupNewProp = { 
 | 
        x: coordSys.x, 
 | 
        y: coordSys.y, 
 | 
        scaleX: coordSys.scaleX, 
 | 
        scaleY: coordSys.scaleY 
 | 
      }; 
 | 
      if (this._firstRender) { 
 | 
        group.attr(groupNewProp); 
 | 
      } else { 
 | 
        graphic.updateProps(group, groupNewProp, seriesModel); 
 | 
      } 
 | 
    } 
 | 
    // Fix edge contact point with node 
 | 
    adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); 
 | 
    var data = seriesModel.getData(); 
 | 
    symbolDraw.updateData(data); 
 | 
    var edgeData = seriesModel.getEdgeData(); 
 | 
    // TODO: TYPE 
 | 
    lineDraw.updateData(edgeData); 
 | 
    this._updateNodeAndLinkScale(); 
 | 
    this._updateController(seriesModel, ecModel, api); 
 | 
    clearTimeout(this._layoutTimeout); 
 | 
    var forceLayout = seriesModel.forceLayout; 
 | 
    var layoutAnimation = seriesModel.get(['force', 'layoutAnimation']); 
 | 
    if (forceLayout) { 
 | 
      this._startForceLayoutIteration(forceLayout, layoutAnimation); 
 | 
    } 
 | 
    var layout = seriesModel.get('layout'); 
 | 
    data.graph.eachNode(function (node) { 
 | 
      var idx = node.dataIndex; 
 | 
      var el = node.getGraphicEl(); 
 | 
      var itemModel = node.getModel(); 
 | 
      if (!el) { 
 | 
        return; 
 | 
      } 
 | 
      // Update draggable 
 | 
      el.off('drag').off('dragend'); 
 | 
      var draggable = itemModel.get('draggable'); 
 | 
      if (draggable) { 
 | 
        el.on('drag', function (e) { 
 | 
          switch (layout) { 
 | 
            case 'force': 
 | 
              forceLayout.warmUp(); 
 | 
              !_this._layouting && _this._startForceLayoutIteration(forceLayout, layoutAnimation); 
 | 
              forceLayout.setFixed(idx); 
 | 
              // Write position back to layout 
 | 
              data.setItemLayout(idx, [el.x, el.y]); 
 | 
              break; 
 | 
            case 'circular': 
 | 
              data.setItemLayout(idx, [el.x, el.y]); 
 | 
              // mark node fixed 
 | 
              node.setLayout({ 
 | 
                fixed: true 
 | 
              }, true); 
 | 
              // recalculate circular layout 
 | 
              circularLayout(seriesModel, 'symbolSize', node, [e.offsetX, e.offsetY]); 
 | 
              _this.updateLayout(seriesModel); 
 | 
              break; 
 | 
            case 'none': 
 | 
            default: 
 | 
              data.setItemLayout(idx, [el.x, el.y]); 
 | 
              // update edge 
 | 
              simpleLayoutEdge(seriesModel.getGraph(), seriesModel); 
 | 
              _this.updateLayout(seriesModel); 
 | 
              break; 
 | 
          } 
 | 
        }).on('dragend', function () { 
 | 
          if (forceLayout) { 
 | 
            forceLayout.setUnfixed(idx); 
 | 
          } 
 | 
        }); 
 | 
      } 
 | 
      el.setDraggable(draggable, !!itemModel.get('cursor')); 
 | 
      var focus = itemModel.get(['emphasis', 'focus']); 
 | 
      if (focus === 'adjacency') { 
 | 
        getECData(el).focus = node.getAdjacentDataIndices(); 
 | 
      } 
 | 
    }); 
 | 
    data.graph.eachEdge(function (edge) { 
 | 
      var el = edge.getGraphicEl(); 
 | 
      var focus = edge.getModel().get(['emphasis', 'focus']); 
 | 
      if (!el) { 
 | 
        return; 
 | 
      } 
 | 
      if (focus === 'adjacency') { 
 | 
        getECData(el).focus = { 
 | 
          edge: [edge.dataIndex], 
 | 
          node: [edge.node1.dataIndex, edge.node2.dataIndex] 
 | 
        }; 
 | 
      } 
 | 
    }); 
 | 
    var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get(['circular', 'rotateLabel']); 
 | 
    var cx = data.getLayout('cx'); 
 | 
    var cy = data.getLayout('cy'); 
 | 
    data.graph.eachNode(function (node) { 
 | 
      rotateNodeLabel(node, circularRotateLabel, cx, cy); 
 | 
    }); 
 | 
    this._firstRender = false; 
 | 
  }; 
 | 
  GraphView.prototype.dispose = function () { 
 | 
    this.remove(); 
 | 
    this._controller && this._controller.dispose(); 
 | 
    this._controllerHost = null; 
 | 
  }; 
 | 
  GraphView.prototype._startForceLayoutIteration = function (forceLayout, layoutAnimation) { 
 | 
    var self = this; 
 | 
    (function step() { 
 | 
      forceLayout.step(function (stopped) { 
 | 
        self.updateLayout(self._model); 
 | 
        (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step()); 
 | 
      }); 
 | 
    })(); 
 | 
  }; 
 | 
  GraphView.prototype._updateController = function (seriesModel, ecModel, api) { 
 | 
    var _this = this; 
 | 
    var controller = this._controller; 
 | 
    var controllerHost = this._controllerHost; 
 | 
    var group = this.group; 
 | 
    controller.setPointerChecker(function (e, x, y) { 
 | 
      var rect = group.getBoundingRect(); 
 | 
      rect.applyTransform(group.transform); 
 | 
      return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); 
 | 
    }); 
 | 
    if (!isViewCoordSys(seriesModel.coordinateSystem)) { 
 | 
      controller.disable(); 
 | 
      return; 
 | 
    } 
 | 
    controller.enable(seriesModel.get('roam')); 
 | 
    controllerHost.zoomLimit = seriesModel.get('scaleLimit'); 
 | 
    controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); 
 | 
    controller.off('pan').off('zoom').on('pan', function (e) { 
 | 
      roamHelper.updateViewOnPan(controllerHost, e.dx, e.dy); 
 | 
      api.dispatchAction({ 
 | 
        seriesId: seriesModel.id, 
 | 
        type: 'graphRoam', 
 | 
        dx: e.dx, 
 | 
        dy: e.dy 
 | 
      }); 
 | 
    }).on('zoom', function (e) { 
 | 
      roamHelper.updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); 
 | 
      api.dispatchAction({ 
 | 
        seriesId: seriesModel.id, 
 | 
        type: 'graphRoam', 
 | 
        zoom: e.scale, 
 | 
        originX: e.originX, 
 | 
        originY: e.originY 
 | 
      }); 
 | 
      _this._updateNodeAndLinkScale(); 
 | 
      adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); 
 | 
      _this._lineDraw.updateLayout(); 
 | 
      // Only update label layout on zoom 
 | 
      api.updateLabelLayout(); 
 | 
    }); 
 | 
  }; 
 | 
  GraphView.prototype._updateNodeAndLinkScale = function () { 
 | 
    var seriesModel = this._model; 
 | 
    var data = seriesModel.getData(); 
 | 
    var nodeScale = getNodeGlobalScale(seriesModel); 
 | 
    data.eachItemGraphicEl(function (el, idx) { 
 | 
      el && el.setSymbolScale(nodeScale); 
 | 
    }); 
 | 
  }; 
 | 
  GraphView.prototype.updateLayout = function (seriesModel) { 
 | 
    adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); 
 | 
    this._symbolDraw.updateLayout(); 
 | 
    this._lineDraw.updateLayout(); 
 | 
  }; 
 | 
  GraphView.prototype.remove = function () { 
 | 
    clearTimeout(this._layoutTimeout); 
 | 
    this._layouting = false; 
 | 
    this._layoutTimeout = null; 
 | 
    this._symbolDraw && this._symbolDraw.remove(); 
 | 
    this._lineDraw && this._lineDraw.remove(); 
 | 
  }; 
 | 
  GraphView.type = 'graph'; 
 | 
  return GraphView; 
 | 
}(ChartView); 
 | 
export default GraphView; 
 |