| 
/* 
 | 
* 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 * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import Displayable from 'zrender/lib/graphic/Displayable.js'; 
 | 
import * as modelUtil from '../../util/model.js'; 
 | 
import * as graphicUtil from '../../util/graphic.js'; 
 | 
import * as layoutUtil from '../../util/layout.js'; 
 | 
import { parsePercent } from '../../util/number.js'; 
 | 
import ComponentView from '../../view/Component.js'; 
 | 
import { getECData } from '../../util/innerStore.js'; 
 | 
import { isEC4CompatibleStyle, convertFromEC4CompatibleStyle } from '../../util/styleCompat.js'; 
 | 
import { applyLeaveTransition, applyUpdateTransition, isTransitionAll, updateLeaveTo } from '../../animation/customGraphicTransition.js'; 
 | 
import { updateProps } from '../../animation/basicTransition.js'; 
 | 
import { applyKeyframeAnimation, stopPreviousKeyframeAnimationAndRestore } from '../../animation/customGraphicKeyframeAnimation.js'; 
 | 
var nonShapeGraphicElements = { 
 | 
  // Reserved but not supported in graphic component. 
 | 
  path: null, 
 | 
  compoundPath: null, 
 | 
  // Supported in graphic component. 
 | 
  group: graphicUtil.Group, 
 | 
  image: graphicUtil.Image, 
 | 
  text: graphicUtil.Text 
 | 
}; 
 | 
export var inner = modelUtil.makeInner(); 
 | 
// ------------------------ 
 | 
// View 
 | 
// ------------------------ 
 | 
var GraphicComponentView = /** @class */function (_super) { 
 | 
  __extends(GraphicComponentView, _super); 
 | 
  function GraphicComponentView() { 
 | 
    var _this = _super !== null && _super.apply(this, arguments) || this; 
 | 
    _this.type = GraphicComponentView.type; 
 | 
    return _this; 
 | 
  } 
 | 
  GraphicComponentView.prototype.init = function () { 
 | 
    this._elMap = zrUtil.createHashMap(); 
 | 
  }; 
 | 
  GraphicComponentView.prototype.render = function (graphicModel, ecModel, api) { 
 | 
    // Having leveraged between use cases and algorithm complexity, a very 
 | 
    // simple layout mechanism is used: 
 | 
    // The size(width/height) can be determined by itself or its parent (not 
 | 
    // implemented yet), but can not by its children. (Top-down travel) 
 | 
    // The location(x/y) can be determined by the bounding rect of itself 
 | 
    // (can including its descendants or not) and the size of its parent. 
 | 
    // (Bottom-up travel) 
 | 
    // When `chart.clear()` or `chart.setOption({...}, true)` with the same id, 
 | 
    // view will be reused. 
 | 
    if (graphicModel !== this._lastGraphicModel) { 
 | 
      this._clear(); 
 | 
    } 
 | 
    this._lastGraphicModel = graphicModel; 
 | 
    this._updateElements(graphicModel); 
 | 
    this._relocate(graphicModel, api); 
 | 
  }; 
 | 
  /** 
 | 
   * Update graphic elements. 
 | 
   */ 
 | 
  GraphicComponentView.prototype._updateElements = function (graphicModel) { 
 | 
    var elOptionsToUpdate = graphicModel.useElOptionsToUpdate(); 
 | 
    if (!elOptionsToUpdate) { 
 | 
      return; 
 | 
    } 
 | 
    var elMap = this._elMap; 
 | 
    var rootGroup = this.group; 
 | 
    var globalZ = graphicModel.get('z'); 
 | 
    var globalZLevel = graphicModel.get('zlevel'); 
 | 
    // Top-down tranverse to assign graphic settings to each elements. 
 | 
    zrUtil.each(elOptionsToUpdate, function (elOption) { 
 | 
      var id = modelUtil.convertOptionIdName(elOption.id, null); 
 | 
      var elExisting = id != null ? elMap.get(id) : null; 
 | 
      var parentId = modelUtil.convertOptionIdName(elOption.parentId, null); 
 | 
      var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup; 
 | 
      var elType = elOption.type; 
 | 
      var elOptionStyle = elOption.style; 
 | 
      if (elType === 'text' && elOptionStyle) { 
 | 
        // In top/bottom mode, textVerticalAlign should not be used, which cause 
 | 
        // inaccurately locating. 
 | 
        if (elOption.hv && elOption.hv[1]) { 
 | 
          elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = elOptionStyle.verticalAlign = elOptionStyle.align = null; 
 | 
        } 
 | 
      } 
 | 
      var textContentOption = elOption.textContent; 
 | 
      var textConfig = elOption.textConfig; 
 | 
      if (elOptionStyle && isEC4CompatibleStyle(elOptionStyle, elType, !!textConfig, !!textContentOption)) { 
 | 
        var convertResult = convertFromEC4CompatibleStyle(elOptionStyle, elType, true); 
 | 
        if (!textConfig && convertResult.textConfig) { 
 | 
          textConfig = elOption.textConfig = convertResult.textConfig; 
 | 
        } 
 | 
        if (!textContentOption && convertResult.textContent) { 
 | 
          textContentOption = convertResult.textContent; 
 | 
        } 
 | 
      } 
 | 
      // Remove unnecessary props to avoid potential problems. 
 | 
      var elOptionCleaned = getCleanedElOption(elOption); 
 | 
      // For simple, do not support parent change, otherwise reorder is needed. 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        elExisting && zrUtil.assert(targetElParent === elExisting.parent, 'Changing parent is not supported.'); 
 | 
      } 
 | 
      var $action = elOption.$action || 'merge'; 
 | 
      var isMerge = $action === 'merge'; 
 | 
      var isReplace = $action === 'replace'; 
 | 
      if (isMerge) { 
 | 
        var isInit = !elExisting; 
 | 
        var el_1 = elExisting; 
 | 
        if (isInit) { 
 | 
          el_1 = createEl(id, targetElParent, elOption.type, elMap); 
 | 
        } else { 
 | 
          el_1 && (inner(el_1).isNew = false); 
 | 
          // Stop and restore before update any other attributes. 
 | 
          stopPreviousKeyframeAnimationAndRestore(el_1); 
 | 
        } 
 | 
        if (el_1) { 
 | 
          applyUpdateTransition(el_1, elOptionCleaned, graphicModel, { 
 | 
            isInit: isInit 
 | 
          }); 
 | 
          updateCommonAttrs(el_1, elOption, globalZ, globalZLevel); 
 | 
        } 
 | 
      } else if (isReplace) { 
 | 
        removeEl(elExisting, elOption, elMap, graphicModel); 
 | 
        var el_2 = createEl(id, targetElParent, elOption.type, elMap); 
 | 
        if (el_2) { 
 | 
          applyUpdateTransition(el_2, elOptionCleaned, graphicModel, { 
 | 
            isInit: true 
 | 
          }); 
 | 
          updateCommonAttrs(el_2, elOption, globalZ, globalZLevel); 
 | 
        } 
 | 
      } else if ($action === 'remove') { 
 | 
        updateLeaveTo(elExisting, elOption); 
 | 
        removeEl(elExisting, elOption, elMap, graphicModel); 
 | 
      } 
 | 
      var el = elMap.get(id); 
 | 
      if (el && textContentOption) { 
 | 
        if (isMerge) { 
 | 
          var textContentExisting = el.getTextContent(); 
 | 
          textContentExisting ? textContentExisting.attr(textContentOption) : el.setTextContent(new graphicUtil.Text(textContentOption)); 
 | 
        } else if (isReplace) { 
 | 
          el.setTextContent(new graphicUtil.Text(textContentOption)); 
 | 
        } 
 | 
      } 
 | 
      if (el) { 
 | 
        var clipPathOption = elOption.clipPath; 
 | 
        if (clipPathOption) { 
 | 
          var clipPathType = clipPathOption.type; 
 | 
          var clipPath = void 0; 
 | 
          var isInit = false; 
 | 
          if (isMerge) { 
 | 
            var oldClipPath = el.getClipPath(); 
 | 
            isInit = !oldClipPath || inner(oldClipPath).type !== clipPathType; 
 | 
            clipPath = isInit ? newEl(clipPathType) : oldClipPath; 
 | 
          } else if (isReplace) { 
 | 
            isInit = true; 
 | 
            clipPath = newEl(clipPathType); 
 | 
          } 
 | 
          el.setClipPath(clipPath); 
 | 
          applyUpdateTransition(clipPath, clipPathOption, graphicModel, { 
 | 
            isInit: isInit 
 | 
          }); 
 | 
          applyKeyframeAnimation(clipPath, clipPathOption.keyframeAnimation, graphicModel); 
 | 
        } 
 | 
        var elInner = inner(el); 
 | 
        el.setTextConfig(textConfig); 
 | 
        elInner.option = elOption; 
 | 
        setEventData(el, graphicModel, elOption); 
 | 
        graphicUtil.setTooltipConfig({ 
 | 
          el: el, 
 | 
          componentModel: graphicModel, 
 | 
          itemName: el.name, 
 | 
          itemTooltipOption: elOption.tooltip 
 | 
        }); 
 | 
        applyKeyframeAnimation(el, elOption.keyframeAnimation, graphicModel); 
 | 
      } 
 | 
    }); 
 | 
  }; 
 | 
  /** 
 | 
   * Locate graphic elements. 
 | 
   */ 
 | 
  GraphicComponentView.prototype._relocate = function (graphicModel, api) { 
 | 
    var elOptions = graphicModel.option.elements; 
 | 
    var rootGroup = this.group; 
 | 
    var elMap = this._elMap; 
 | 
    var apiWidth = api.getWidth(); 
 | 
    var apiHeight = api.getHeight(); 
 | 
    var xy = ['x', 'y']; 
 | 
    // Top-down to calculate percentage width/height of group 
 | 
    for (var i = 0; i < elOptions.length; i++) { 
 | 
      var elOption = elOptions[i]; 
 | 
      var id = modelUtil.convertOptionIdName(elOption.id, null); 
 | 
      var el = id != null ? elMap.get(id) : null; 
 | 
      if (!el || !el.isGroup) { 
 | 
        continue; 
 | 
      } 
 | 
      var parentEl = el.parent; 
 | 
      var isParentRoot = parentEl === rootGroup; 
 | 
      // Like 'position:absolut' in css, default 0. 
 | 
      var elInner = inner(el); 
 | 
      var parentElInner = inner(parentEl); 
 | 
      elInner.width = parsePercent(elInner.option.width, isParentRoot ? apiWidth : parentElInner.width) || 0; 
 | 
      elInner.height = parsePercent(elInner.option.height, isParentRoot ? apiHeight : parentElInner.height) || 0; 
 | 
    } 
 | 
    // Bottom-up tranvese all elements (consider ec resize) to locate elements. 
 | 
    for (var i = elOptions.length - 1; i >= 0; i--) { 
 | 
      var elOption = elOptions[i]; 
 | 
      var id = modelUtil.convertOptionIdName(elOption.id, null); 
 | 
      var el = id != null ? elMap.get(id) : null; 
 | 
      if (!el) { 
 | 
        continue; 
 | 
      } 
 | 
      var parentEl = el.parent; 
 | 
      var parentElInner = inner(parentEl); 
 | 
      var containerInfo = parentEl === rootGroup ? { 
 | 
        width: apiWidth, 
 | 
        height: apiHeight 
 | 
      } : { 
 | 
        width: parentElInner.width, 
 | 
        height: parentElInner.height 
 | 
      }; 
 | 
      // PENDING 
 | 
      // Currently, when `bounding: 'all'`, the union bounding rect of the group 
 | 
      // does not include the rect of [0, 0, group.width, group.height], which 
 | 
      // is probably weird for users. Should we make a break change for it? 
 | 
      var layoutPos = {}; 
 | 
      var layouted = layoutUtil.positionElement(el, elOption, containerInfo, null, { 
 | 
        hv: elOption.hv, 
 | 
        boundingMode: elOption.bounding 
 | 
      }, layoutPos); 
 | 
      if (!inner(el).isNew && layouted) { 
 | 
        var transition = elOption.transition; 
 | 
        var animatePos = {}; 
 | 
        for (var k = 0; k < xy.length; k++) { 
 | 
          var key = xy[k]; 
 | 
          var val = layoutPos[key]; 
 | 
          if (transition && (isTransitionAll(transition) || zrUtil.indexOf(transition, key) >= 0)) { 
 | 
            animatePos[key] = val; 
 | 
          } else { 
 | 
            el[key] = val; 
 | 
          } 
 | 
        } 
 | 
        updateProps(el, animatePos, graphicModel, 0); 
 | 
      } else { 
 | 
        el.attr(layoutPos); 
 | 
      } 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * Clear all elements. 
 | 
   */ 
 | 
  GraphicComponentView.prototype._clear = function () { 
 | 
    var _this = this; 
 | 
    var elMap = this._elMap; 
 | 
    elMap.each(function (el) { 
 | 
      removeEl(el, inner(el).option, elMap, _this._lastGraphicModel); 
 | 
    }); 
 | 
    this._elMap = zrUtil.createHashMap(); 
 | 
  }; 
 | 
  GraphicComponentView.prototype.dispose = function () { 
 | 
    this._clear(); 
 | 
  }; 
 | 
  GraphicComponentView.type = 'graphic'; 
 | 
  return GraphicComponentView; 
 | 
}(ComponentView); 
 | 
export { GraphicComponentView }; 
 | 
function newEl(graphicType) { 
 | 
  if (process.env.NODE_ENV !== 'production') { 
 | 
    zrUtil.assert(graphicType, 'graphic type MUST be set'); 
 | 
  } 
 | 
  var Clz = zrUtil.hasOwn(nonShapeGraphicElements, graphicType) 
 | 
  // Those graphic elements are not shapes. They should not be 
 | 
  // overwritten by users, so do them first. 
 | 
  ? nonShapeGraphicElements[graphicType] : graphicUtil.getShapeClass(graphicType); 
 | 
  if (process.env.NODE_ENV !== 'production') { 
 | 
    zrUtil.assert(Clz, "graphic type " + graphicType + " can not be found"); 
 | 
  } 
 | 
  var el = new Clz({}); 
 | 
  inner(el).type = graphicType; 
 | 
  return el; 
 | 
} 
 | 
function createEl(id, targetElParent, graphicType, elMap) { 
 | 
  var el = newEl(graphicType); 
 | 
  targetElParent.add(el); 
 | 
  elMap.set(id, el); 
 | 
  inner(el).id = id; 
 | 
  inner(el).isNew = true; 
 | 
  return el; 
 | 
} 
 | 
function removeEl(elExisting, elOption, elMap, graphicModel) { 
 | 
  var existElParent = elExisting && elExisting.parent; 
 | 
  if (existElParent) { 
 | 
    elExisting.type === 'group' && elExisting.traverse(function (el) { 
 | 
      removeEl(el, elOption, elMap, graphicModel); 
 | 
    }); 
 | 
    applyLeaveTransition(elExisting, elOption, graphicModel); 
 | 
    elMap.removeKey(inner(elExisting).id); 
 | 
  } 
 | 
} 
 | 
function updateCommonAttrs(el, elOption, defaultZ, defaultZlevel) { 
 | 
  if (!el.isGroup) { 
 | 
    zrUtil.each([['cursor', Displayable.prototype.cursor], 
 | 
    // We should not support configure z and zlevel in the element level. 
 | 
    // But seems we didn't limit it previously. So here still use it to avoid breaking. 
 | 
    ['zlevel', defaultZlevel || 0], ['z', defaultZ || 0], 
 | 
    // z2 must not be null/undefined, otherwise sort error may occur. 
 | 
    ['z2', 0]], function (item) { 
 | 
      var prop = item[0]; 
 | 
      if (zrUtil.hasOwn(elOption, prop)) { 
 | 
        el[prop] = zrUtil.retrieve2(elOption[prop], item[1]); 
 | 
      } else if (el[prop] == null) { 
 | 
        el[prop] = item[1]; 
 | 
      } 
 | 
    }); 
 | 
  } 
 | 
  zrUtil.each(zrUtil.keys(elOption), function (key) { 
 | 
    // Assign event handlers. 
 | 
    // PENDING: should enumerate all event names or use pattern matching? 
 | 
    if (key.indexOf('on') === 0) { 
 | 
      var val = elOption[key]; 
 | 
      el[key] = zrUtil.isFunction(val) ? val : null; 
 | 
    } 
 | 
  }); 
 | 
  if (zrUtil.hasOwn(elOption, 'draggable')) { 
 | 
    el.draggable = elOption.draggable; 
 | 
  } 
 | 
  // Other attributes 
 | 
  elOption.name != null && (el.name = elOption.name); 
 | 
  elOption.id != null && (el.id = elOption.id); 
 | 
} 
 | 
// Remove unnecessary props to avoid potential problems. 
 | 
function getCleanedElOption(elOption) { 
 | 
  elOption = zrUtil.extend({}, elOption); 
 | 
  zrUtil.each(['id', 'parentId', '$action', 'hv', 'bounding', 'textContent', 'clipPath'].concat(layoutUtil.LOCATION_PARAMS), function (name) { 
 | 
    delete elOption[name]; 
 | 
  }); 
 | 
  return elOption; 
 | 
} 
 | 
function setEventData(el, graphicModel, elOption) { 
 | 
  var eventData = getECData(el).eventData; 
 | 
  // Simple optimize for large amount of elements that no need event. 
 | 
  if (!el.silent && !el.ignore && !eventData) { 
 | 
    eventData = getECData(el).eventData = { 
 | 
      componentType: 'graphic', 
 | 
      componentIndex: graphicModel.componentIndex, 
 | 
      name: el.name 
 | 
    }; 
 | 
  } 
 | 
  // `elOption.info` enables user to mount some info on 
 | 
  // elements and use them in event handlers. 
 | 
  if (eventData) { 
 | 
    eventData.info = elOption.info; 
 | 
  } 
 | 
} 
 |