|   | 
| /* | 
| * 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 { each, indexOf, curry, assert, map, createHashMap } from 'zrender/lib/core/util.js'; | 
| import * as graphic from '../../util/graphic.js'; | 
| import * as brushHelper from './brushHelper.js'; | 
| import { parseFinder as modelUtilParseFinder } from '../../util/model.js'; | 
| // FIXME | 
| // how to genarialize to more coordinate systems. | 
| var INCLUDE_FINDER_MAIN_TYPES = ['grid', 'xAxis', 'yAxis', 'geo', 'graph', 'polar', 'radiusAxis', 'angleAxis', 'bmap']; | 
| var BrushTargetManager = /** @class */function () { | 
|   /** | 
|    * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid | 
|    *        Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]} | 
|    * @param opt.include include coordinate system types. | 
|    */ | 
|   function BrushTargetManager(finder, ecModel, opt) { | 
|     var _this = this; | 
|     this._targetInfoList = []; | 
|     var foundCpts = parseFinder(ecModel, finder); | 
|     each(targetInfoBuilders, function (builder, type) { | 
|       if (!opt || !opt.include || indexOf(opt.include, type) >= 0) { | 
|         builder(foundCpts, _this._targetInfoList); | 
|       } | 
|     }); | 
|   } | 
|   BrushTargetManager.prototype.setOutputRanges = function (areas, ecModel) { | 
|     this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { | 
|       (area.coordRanges || (area.coordRanges = [])).push(coordRange); | 
|       // area.coordRange is the first of area.coordRanges | 
|       if (!area.coordRange) { | 
|         area.coordRange = coordRange; | 
|         // In 'category' axis, coord to pixel is not reversible, so we can not | 
|         // rebuild range by coordRange accrately, which may bring trouble when | 
|         // brushing only one item. So we use __rangeOffset to rebuilding range | 
|         // by coordRange. And this it only used in brush component so it is no | 
|         // need to be adapted to coordRanges. | 
|         var result = coordConvert[area.brushType](0, coordSys, coordRange); | 
|         area.__rangeOffset = { | 
|           offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]), | 
|           xyMinMax: result.xyMinMax | 
|         }; | 
|       } | 
|     }); | 
|     return areas; | 
|   }; | 
|   BrushTargetManager.prototype.matchOutputRanges = function (areas, ecModel, cb) { | 
|     each(areas, function (area) { | 
|       var targetInfo = this.findTargetInfo(area, ecModel); | 
|       if (targetInfo && targetInfo !== true) { | 
|         each(targetInfo.coordSyses, function (coordSys) { | 
|           var result = coordConvert[area.brushType](1, coordSys, area.range, true); | 
|           cb(area, result.values, coordSys, ecModel); | 
|         }); | 
|       } | 
|     }, this); | 
|   }; | 
|   /** | 
|    * the `areas` is `BrushModel.areas`. | 
|    * Called in layout stage. | 
|    * convert `area.coordRange` to global range and set panelId to `area.range`. | 
|    */ | 
|   BrushTargetManager.prototype.setInputRanges = function (areas, ecModel) { | 
|     each(areas, function (area) { | 
|       var targetInfo = this.findTargetInfo(area, ecModel); | 
|       if (process.env.NODE_ENV !== 'production') { | 
|         assert(!targetInfo || targetInfo === true || area.coordRange, 'coordRange must be specified when coord index specified.'); | 
|         assert(!targetInfo || targetInfo !== true || area.range, 'range must be specified in global brush.'); | 
|       } | 
|       area.range = area.range || []; | 
|       // convert coordRange to global range and set panelId. | 
|       if (targetInfo && targetInfo !== true) { | 
|         area.panelId = targetInfo.panelId; | 
|         // (1) area.range should always be calculate from coordRange but does | 
|         // not keep its original value, for the sake of the dataZoom scenario, | 
|         // where area.coordRange remains unchanged but area.range may be changed. | 
|         // (2) Only support converting one coordRange to pixel range in brush | 
|         // component. So do not consider `coordRanges`. | 
|         // (3) About __rangeOffset, see comment above. | 
|         var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange); | 
|         var rangeOffset = area.__rangeOffset; | 
|         area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values; | 
|       } | 
|     }, this); | 
|   }; | 
|   BrushTargetManager.prototype.makePanelOpts = function (api, getDefaultBrushType) { | 
|     return map(this._targetInfoList, function (targetInfo) { | 
|       var rect = targetInfo.getPanelRect(); | 
|       return { | 
|         panelId: targetInfo.panelId, | 
|         defaultBrushType: getDefaultBrushType ? getDefaultBrushType(targetInfo) : null, | 
|         clipPath: brushHelper.makeRectPanelClipPath(rect), | 
|         isTargetByCursor: brushHelper.makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel), | 
|         getLinearBrushOtherExtent: brushHelper.makeLinearBrushOtherExtent(rect) | 
|       }; | 
|     }); | 
|   }; | 
|   BrushTargetManager.prototype.controlSeries = function (area, seriesModel, ecModel) { | 
|     // Check whether area is bound in coord, and series do not belong to that coord. | 
|     // If do not do this check, some brush (like lineX) will controll all axes. | 
|     var targetInfo = this.findTargetInfo(area, ecModel); | 
|     return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0; | 
|   }; | 
|   /** | 
|    * If return Object, a coord found. | 
|    * If return true, global found. | 
|    * Otherwise nothing found. | 
|    */ | 
|   BrushTargetManager.prototype.findTargetInfo = function (area, ecModel) { | 
|     var targetInfoList = this._targetInfoList; | 
|     var foundCpts = parseFinder(ecModel, area); | 
|     for (var i = 0; i < targetInfoList.length; i++) { | 
|       var targetInfo = targetInfoList[i]; | 
|       var areaPanelId = area.panelId; | 
|       if (areaPanelId) { | 
|         if (targetInfo.panelId === areaPanelId) { | 
|           return targetInfo; | 
|         } | 
|       } else { | 
|         for (var j = 0; j < targetInfoMatchers.length; j++) { | 
|           if (targetInfoMatchers[j](foundCpts, targetInfo)) { | 
|             return targetInfo; | 
|           } | 
|         } | 
|       } | 
|     } | 
|     return true; | 
|   }; | 
|   return BrushTargetManager; | 
| }(); | 
| function formatMinMax(minMax) { | 
|   minMax[0] > minMax[1] && minMax.reverse(); | 
|   return minMax; | 
| } | 
| function parseFinder(ecModel, finder) { | 
|   return modelUtilParseFinder(ecModel, finder, { | 
|     includeMainTypes: INCLUDE_FINDER_MAIN_TYPES | 
|   }); | 
| } | 
| var targetInfoBuilders = { | 
|   grid: function (foundCpts, targetInfoList) { | 
|     var xAxisModels = foundCpts.xAxisModels; | 
|     var yAxisModels = foundCpts.yAxisModels; | 
|     var gridModels = foundCpts.gridModels; | 
|     // Remove duplicated. | 
|     var gridModelMap = createHashMap(); | 
|     var xAxesHas = {}; | 
|     var yAxesHas = {}; | 
|     if (!xAxisModels && !yAxisModels && !gridModels) { | 
|       return; | 
|     } | 
|     each(xAxisModels, function (axisModel) { | 
|       var gridModel = axisModel.axis.grid.model; | 
|       gridModelMap.set(gridModel.id, gridModel); | 
|       xAxesHas[gridModel.id] = true; | 
|     }); | 
|     each(yAxisModels, function (axisModel) { | 
|       var gridModel = axisModel.axis.grid.model; | 
|       gridModelMap.set(gridModel.id, gridModel); | 
|       yAxesHas[gridModel.id] = true; | 
|     }); | 
|     each(gridModels, function (gridModel) { | 
|       gridModelMap.set(gridModel.id, gridModel); | 
|       xAxesHas[gridModel.id] = true; | 
|       yAxesHas[gridModel.id] = true; | 
|     }); | 
|     gridModelMap.each(function (gridModel) { | 
|       var grid = gridModel.coordinateSystem; | 
|       var cartesians = []; | 
|       each(grid.getCartesians(), function (cartesian, index) { | 
|         if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0 || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0) { | 
|           cartesians.push(cartesian); | 
|         } | 
|       }); | 
|       targetInfoList.push({ | 
|         panelId: 'grid--' + gridModel.id, | 
|         gridModel: gridModel, | 
|         coordSysModel: gridModel, | 
|         // Use the first one as the representitive coordSys. | 
|         coordSys: cartesians[0], | 
|         coordSyses: cartesians, | 
|         getPanelRect: panelRectBuilders.grid, | 
|         xAxisDeclared: xAxesHas[gridModel.id], | 
|         yAxisDeclared: yAxesHas[gridModel.id] | 
|       }); | 
|     }); | 
|   }, | 
|   geo: function (foundCpts, targetInfoList) { | 
|     each(foundCpts.geoModels, function (geoModel) { | 
|       var coordSys = geoModel.coordinateSystem; | 
|       targetInfoList.push({ | 
|         panelId: 'geo--' + geoModel.id, | 
|         geoModel: geoModel, | 
|         coordSysModel: geoModel, | 
|         coordSys: coordSys, | 
|         coordSyses: [coordSys], | 
|         getPanelRect: panelRectBuilders.geo | 
|       }); | 
|     }); | 
|   } | 
| }; | 
| var targetInfoMatchers = [ | 
| // grid | 
| function (foundCpts, targetInfo) { | 
|   var xAxisModel = foundCpts.xAxisModel; | 
|   var yAxisModel = foundCpts.yAxisModel; | 
|   var gridModel = foundCpts.gridModel; | 
|   !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model); | 
|   !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model); | 
|   return gridModel && gridModel === targetInfo.gridModel; | 
| }, | 
| // geo | 
| function (foundCpts, targetInfo) { | 
|   var geoModel = foundCpts.geoModel; | 
|   return geoModel && geoModel === targetInfo.geoModel; | 
| }]; | 
| var panelRectBuilders = { | 
|   grid: function () { | 
|     // grid is not Transformable. | 
|     return this.coordSys.master.getRect().clone(); | 
|   }, | 
|   geo: function () { | 
|     var coordSys = this.coordSys; | 
|     var rect = coordSys.getBoundingRect().clone(); | 
|     // geo roam and zoom transform | 
|     rect.applyTransform(graphic.getTransform(coordSys)); | 
|     return rect; | 
|   } | 
| }; | 
| var coordConvert = { | 
|   lineX: curry(axisConvert, 0), | 
|   lineY: curry(axisConvert, 1), | 
|   rect: function (to, coordSys, rangeOrCoordRange, clamp) { | 
|     var xminymin = to ? coordSys.pointToData([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp); | 
|     var xmaxymax = to ? coordSys.pointToData([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp); | 
|     var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])]; | 
|     return { | 
|       values: values, | 
|       xyMinMax: values | 
|     }; | 
|   }, | 
|   polygon: function (to, coordSys, rangeOrCoordRange, clamp) { | 
|     var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]]; | 
|     var values = map(rangeOrCoordRange, function (item) { | 
|       var p = to ? coordSys.pointToData(item, clamp) : coordSys.dataToPoint(item, clamp); | 
|       xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]); | 
|       xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]); | 
|       xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]); | 
|       xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]); | 
|       return p; | 
|     }); | 
|     return { | 
|       values: values, | 
|       xyMinMax: xyMinMax | 
|     }; | 
|   } | 
| }; | 
| function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) { | 
|   if (process.env.NODE_ENV !== 'production') { | 
|     assert(coordSys.type === 'cartesian2d', 'lineX/lineY brush is available only in cartesian2d.'); | 
|   } | 
|   var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]); | 
|   var values = formatMinMax(map([0, 1], function (i) { | 
|     return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]), true) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i])); | 
|   })); | 
|   var xyMinMax = []; | 
|   xyMinMax[axisNameIndex] = values; | 
|   xyMinMax[1 - axisNameIndex] = [NaN, NaN]; | 
|   return { | 
|     values: values, | 
|     xyMinMax: xyMinMax | 
|   }; | 
| } | 
| var diffProcessor = { | 
|   lineX: curry(axisDiffProcessor, 0), | 
|   lineY: curry(axisDiffProcessor, 1), | 
|   rect: function (values, refer, scales) { | 
|     return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]]; | 
|   }, | 
|   polygon: function (values, refer, scales) { | 
|     return map(values, function (item, idx) { | 
|       return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]]; | 
|     }); | 
|   } | 
| }; | 
| function axisDiffProcessor(axisNameIndex, values, refer, scales) { | 
|   return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]]; | 
| } | 
| // We have to process scale caused by dataZoom manually, | 
| // although it might be not accurate. | 
| // Return [0~1, 0~1] | 
| function getScales(xyMinMaxCurr, xyMinMaxOrigin) { | 
|   var sizeCurr = getSize(xyMinMaxCurr); | 
|   var sizeOrigin = getSize(xyMinMaxOrigin); | 
|   var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]]; | 
|   isNaN(scales[0]) && (scales[0] = 1); | 
|   isNaN(scales[1]) && (scales[1] = 1); | 
|   return scales; | 
| } | 
| function getSize(xyMinMax) { | 
|   return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN]; | 
| } | 
| export default BrushTargetManager; |