|   | 
| /* | 
| * 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 Model from '../../model/Model.js'; | 
| import { each, curry, clone, defaults, isArray, indexOf } from 'zrender/lib/core/util.js'; | 
| // Build axisPointerModel, mergin tooltip.axisPointer model for each axis. | 
| // allAxesInfo should be updated when setOption performed. | 
| export function collect(ecModel, api) { | 
|   var result = { | 
|     /** | 
|      * key: makeKey(axis.model) | 
|      * value: { | 
|      *      axis, | 
|      *      coordSys, | 
|      *      axisPointerModel, | 
|      *      triggerTooltip, | 
|      *      triggerEmphasis, | 
|      *      involveSeries, | 
|      *      snap, | 
|      *      seriesModels, | 
|      *      seriesDataCount | 
|      * } | 
|      */ | 
|     axesInfo: {}, | 
|     seriesInvolved: false, | 
|     /** | 
|      * key: makeKey(coordSys.model) | 
|      * value: Object: key makeKey(axis.model), value: axisInfo | 
|      */ | 
|     coordSysAxesInfo: {}, | 
|     coordSysMap: {} | 
|   }; | 
|   collectAxesInfo(result, ecModel, api); | 
|   // Check seriesInvolved for performance, in case too many series in some chart. | 
|   result.seriesInvolved && collectSeriesInfo(result, ecModel); | 
|   return result; | 
| } | 
| function collectAxesInfo(result, ecModel, api) { | 
|   var globalTooltipModel = ecModel.getComponent('tooltip'); | 
|   var globalAxisPointerModel = ecModel.getComponent('axisPointer'); | 
|   // links can only be set on global. | 
|   var linksOption = globalAxisPointerModel.get('link', true) || []; | 
|   var linkGroups = []; | 
|   // Collect axes info. | 
|   each(api.getCoordinateSystems(), function (coordSys) { | 
|     // Some coordinate system do not support axes, like geo. | 
|     if (!coordSys.axisPointerEnabled) { | 
|       return; | 
|     } | 
|     var coordSysKey = makeKey(coordSys.model); | 
|     var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; | 
|     result.coordSysMap[coordSysKey] = coordSys; | 
|     // Set tooltip (like 'cross') is a convenient way to show axisPointer | 
|     // for user. So we enable setting tooltip on coordSys model. | 
|     var coordSysModel = coordSys.model; | 
|     var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel); | 
|     each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null)); | 
|     // If axis tooltip used, choose tooltip axis for each coordSys. | 
|     // Notice this case: coordSys is `grid` but not `cartesian2D` here. | 
|     if (coordSys.getTooltipAxes && globalTooltipModel | 
|     // If tooltip.showContent is set as false, tooltip will not | 
|     // show but axisPointer will show as normal. | 
|     && baseTooltipModel.get('show')) { | 
|       // Compatible with previous logic. But series.tooltip.trigger: 'axis' | 
|       // or series.data[n].tooltip.trigger: 'axis' are not support any more. | 
|       var triggerAxis = baseTooltipModel.get('trigger') === 'axis'; | 
|       var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross'; | 
|       var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis'])); | 
|       if (triggerAxis || cross) { | 
|         each(tooltipAxes.baseAxes, curry(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis)); | 
|       } | 
|       if (cross) { | 
|         each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false)); | 
|       } | 
|     } | 
|     // fromTooltip: true | false | 'cross' | 
|     // triggerTooltip: true | false | null | 
|     function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { | 
|       var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel); | 
|       var axisPointerShow = axisPointerModel.get('show'); | 
|       if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) { | 
|         return; | 
|       } | 
|       if (triggerTooltip == null) { | 
|         triggerTooltip = axisPointerModel.get('triggerTooltip'); | 
|       } | 
|       axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel; | 
|       var snap = axisPointerModel.get('snap'); | 
|       var triggerEmphasis = axisPointerModel.get('triggerEmphasis'); | 
|       var axisKey = makeKey(axis.model); | 
|       var involveSeries = triggerTooltip || snap || axis.type === 'category'; | 
|       // If result.axesInfo[key] exist, override it (tooltip has higher priority). | 
|       var axisInfo = result.axesInfo[axisKey] = { | 
|         key: axisKey, | 
|         axis: axis, | 
|         coordSys: coordSys, | 
|         axisPointerModel: axisPointerModel, | 
|         triggerTooltip: triggerTooltip, | 
|         triggerEmphasis: triggerEmphasis, | 
|         involveSeries: involveSeries, | 
|         snap: snap, | 
|         useHandle: isHandleTrigger(axisPointerModel), | 
|         seriesModels: [], | 
|         linkGroup: null | 
|       }; | 
|       axesInfoInCoordSys[axisKey] = axisInfo; | 
|       result.seriesInvolved = result.seriesInvolved || involveSeries; | 
|       var groupIndex = getLinkGroupIndex(linksOption, axis); | 
|       if (groupIndex != null) { | 
|         var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = { | 
|           axesInfo: {} | 
|         }); | 
|         linkGroup.axesInfo[axisKey] = axisInfo; | 
|         linkGroup.mapper = linksOption[groupIndex].mapper; | 
|         axisInfo.linkGroup = linkGroup; | 
|       } | 
|     } | 
|   }); | 
| } | 
| function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) { | 
|   var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer'); | 
|   var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z']; | 
|   var volatileOption = {}; | 
|   each(fields, function (field) { | 
|     volatileOption[field] = clone(tooltipAxisPointerModel.get(field)); | 
|   }); | 
|   // category axis do not auto snap, otherwise some tick that do not | 
|   // has value can not be hovered. value/time/log axis default snap if | 
|   // triggered from tooltip and trigger tooltip. | 
|   volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; | 
|   // Compatible with previous behavior, tooltip axis does not show label by default. | 
|   // Only these properties can be overridden from tooltip to axisPointer. | 
|   if (tooltipAxisPointerModel.get('type') === 'cross') { | 
|     volatileOption.type = 'line'; | 
|   } | 
|   var labelOption = volatileOption.label || (volatileOption.label = {}); | 
|   // Follow the convention, do not show label when triggered by tooltip by default. | 
|   labelOption.show == null && (labelOption.show = false); | 
|   if (fromTooltip === 'cross') { | 
|     // When 'cross', both axes show labels. | 
|     var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']); | 
|     labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; | 
|     // If triggerTooltip, this is a base axis, which should better not use cross style | 
|     // (cross style is dashed by default) | 
|     if (!triggerTooltip) { | 
|       var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle'); | 
|       crossStyle && defaults(labelOption, crossStyle.textStyle); | 
|     } | 
|   } | 
|   return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel)); | 
| } | 
| function collectSeriesInfo(result, ecModel) { | 
|   // Prepare data for axis trigger | 
|   ecModel.eachSeries(function (seriesModel) { | 
|     // Notice this case: this coordSys is `cartesian2D` but not `grid`. | 
|     var coordSys = seriesModel.coordinateSystem; | 
|     var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true); | 
|     var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true); | 
|     if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) { | 
|       return; | 
|     } | 
|     each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) { | 
|       var axis = axisInfo.axis; | 
|       if (coordSys.getAxis(axis.dim) === axis) { | 
|         axisInfo.seriesModels.push(seriesModel); | 
|         axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); | 
|         axisInfo.seriesDataCount += seriesModel.getData().count(); | 
|       } | 
|     }); | 
|   }); | 
| } | 
| /** | 
|  * For example: | 
|  * { | 
|  *     axisPointer: { | 
|  *         links: [{ | 
|  *             xAxisIndex: [2, 4], | 
|  *             yAxisIndex: 'all' | 
|  *         }, { | 
|  *             xAxisId: ['a5', 'a7'], | 
|  *             xAxisName: 'xxx' | 
|  *         }] | 
|  *     } | 
|  * } | 
|  */ | 
| function getLinkGroupIndex(linksOption, axis) { | 
|   var axisModel = axis.model; | 
|   var dim = axis.dim; | 
|   for (var i = 0; i < linksOption.length; i++) { | 
|     var linkOption = linksOption[i] || {}; | 
|     if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) { | 
|       return i; | 
|     } | 
|   } | 
| } | 
| function checkPropInLink(linkPropValue, axisPropValue) { | 
|   return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue; | 
| } | 
| export function fixValue(axisModel) { | 
|   var axisInfo = getAxisInfo(axisModel); | 
|   if (!axisInfo) { | 
|     return; | 
|   } | 
|   var axisPointerModel = axisInfo.axisPointerModel; | 
|   var scale = axisInfo.axis.scale; | 
|   var option = axisPointerModel.option; | 
|   var status = axisPointerModel.get('status'); | 
|   var value = axisPointerModel.get('value'); | 
|   // Parse init value for category and time axis. | 
|   if (value != null) { | 
|     value = scale.parse(value); | 
|   } | 
|   var useHandle = isHandleTrigger(axisPointerModel); | 
|   // If `handle` used, `axisPointer` will always be displayed, so value | 
|   // and status should be initialized. | 
|   if (status == null) { | 
|     option.status = useHandle ? 'show' : 'hide'; | 
|   } | 
|   var extent = scale.getExtent().slice(); | 
|   extent[0] > extent[1] && extent.reverse(); | 
|   if ( | 
|   // Pick a value on axis when initializing. | 
|   value == null | 
|   // If both `handle` and `dataZoom` are used, value may be out of axis extent, | 
|   // where we should re-pick a value to keep `handle` displaying normally. | 
|   || value > extent[1]) { | 
|     // Make handle displayed on the end of the axis when init, which looks better. | 
|     value = extent[1]; | 
|   } | 
|   if (value < extent[0]) { | 
|     value = extent[0]; | 
|   } | 
|   option.value = value; | 
|   if (useHandle) { | 
|     option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show'; | 
|   } | 
| } | 
| export function getAxisInfo(axisModel) { | 
|   var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo; | 
|   return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; | 
| } | 
| export function getAxisPointerModel(axisModel) { | 
|   var axisInfo = getAxisInfo(axisModel); | 
|   return axisInfo && axisInfo.axisPointerModel; | 
| } | 
| function isHandleTrigger(axisPointerModel) { | 
|   return !!axisPointerModel.get(['handle', 'show']); | 
| } | 
| /** | 
|  * @param {module:echarts/model/Model} model | 
|  * @return {string} unique key | 
|  */ | 
| export function makeKey(model) { | 
|   return model.type + '||' + model.id; | 
| } |