|   | 
| /* | 
| * 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. | 
| */ | 
| // Only create one roam controller for each coordinate system. | 
| // one roam controller might be refered by two inside data zoom | 
| // components (for example, one for x and one for y). When user | 
| // pan or zoom, only dispatch one action for those data zoom | 
| // components. | 
| import RoamController from '../../component/helper/RoamController.js'; | 
| import * as throttleUtil from '../../util/throttle.js'; | 
| import { makeInner } from '../../util/model.js'; | 
| import { each, curry, createHashMap } from 'zrender/lib/core/util.js'; | 
| import { collectReferCoordSysModelInfo } from './helper.js'; | 
| var inner = makeInner(); | 
| export function setViewInfoToCoordSysRecord(api, dataZoomModel, getRange) { | 
|   inner(api).coordSysRecordMap.each(function (coordSysRecord) { | 
|     var dzInfo = coordSysRecord.dataZoomInfoMap.get(dataZoomModel.uid); | 
|     if (dzInfo) { | 
|       dzInfo.getRange = getRange; | 
|     } | 
|   }); | 
| } | 
| export function disposeCoordSysRecordIfNeeded(api, dataZoomModel) { | 
|   var coordSysRecordMap = inner(api).coordSysRecordMap; | 
|   var coordSysKeyArr = coordSysRecordMap.keys(); | 
|   for (var i = 0; i < coordSysKeyArr.length; i++) { | 
|     var coordSysKey = coordSysKeyArr[i]; | 
|     var coordSysRecord = coordSysRecordMap.get(coordSysKey); | 
|     var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; | 
|     if (dataZoomInfoMap) { | 
|       var dzUid = dataZoomModel.uid; | 
|       var dzInfo = dataZoomInfoMap.get(dzUid); | 
|       if (dzInfo) { | 
|         dataZoomInfoMap.removeKey(dzUid); | 
|         if (!dataZoomInfoMap.keys().length) { | 
|           disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); | 
|         } | 
|       } | 
|     } | 
|   } | 
| } | 
| function disposeCoordSysRecord(coordSysRecordMap, coordSysRecord) { | 
|   if (coordSysRecord) { | 
|     coordSysRecordMap.removeKey(coordSysRecord.model.uid); | 
|     var controller = coordSysRecord.controller; | 
|     controller && controller.dispose(); | 
|   } | 
| } | 
| function createCoordSysRecord(api, coordSysModel) { | 
|   // These init props will never change after record created. | 
|   var coordSysRecord = { | 
|     model: coordSysModel, | 
|     containsPoint: curry(containsPoint, coordSysModel), | 
|     dispatchAction: curry(dispatchAction, api), | 
|     dataZoomInfoMap: null, | 
|     controller: null | 
|   }; | 
|   // Must not do anything depends on coordSysRecord outside the event handler here, | 
|   // because coordSysRecord not completed yet. | 
|   var controller = coordSysRecord.controller = new RoamController(api.getZr()); | 
|   each(['pan', 'zoom', 'scrollMove'], function (eventName) { | 
|     controller.on(eventName, function (event) { | 
|       var batch = []; | 
|       coordSysRecord.dataZoomInfoMap.each(function (dzInfo) { | 
|         // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove, | 
|         // moveOnMouseWheel, ...) enabled. | 
|         if (!event.isAvailableBehavior(dzInfo.model.option)) { | 
|           return; | 
|         } | 
|         var method = (dzInfo.getRange || {})[eventName]; | 
|         var range = method && method(dzInfo.dzReferCoordSysInfo, coordSysRecord.model.mainType, coordSysRecord.controller, event); | 
|         !dzInfo.model.get('disabled', true) && range && batch.push({ | 
|           dataZoomId: dzInfo.model.id, | 
|           start: range[0], | 
|           end: range[1] | 
|         }); | 
|       }); | 
|       batch.length && coordSysRecord.dispatchAction(batch); | 
|     }); | 
|   }); | 
|   return coordSysRecord; | 
| } | 
| /** | 
|  * This action will be throttled. | 
|  */ | 
| function dispatchAction(api, batch) { | 
|   if (!api.isDisposed()) { | 
|     api.dispatchAction({ | 
|       type: 'dataZoom', | 
|       animation: { | 
|         easing: 'cubicOut', | 
|         duration: 100 | 
|       }, | 
|       batch: batch | 
|     }); | 
|   } | 
| } | 
| function containsPoint(coordSysModel, e, x, y) { | 
|   return coordSysModel.coordinateSystem.containPoint([x, y]); | 
| } | 
| /** | 
|  * Merge roamController settings when multiple dataZooms share one roamController. | 
|  */ | 
| function mergeControllerParams(dataZoomInfoMap) { | 
|   var controlType; | 
|   // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated | 
|   // as string, it is probably revert to reserved word by compress tool. See #7411. | 
|   var prefix = 'type_'; | 
|   var typePriority = { | 
|     'type_true': 2, | 
|     'type_move': 1, | 
|     'type_false': 0, | 
|     'type_undefined': -1 | 
|   }; | 
|   var preventDefaultMouseMove = true; | 
|   dataZoomInfoMap.each(function (dataZoomInfo) { | 
|     var dataZoomModel = dataZoomInfo.model; | 
|     var oneType = dataZoomModel.get('disabled', true) ? false : dataZoomModel.get('zoomLock', true) ? 'move' : true; | 
|     if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) { | 
|       controlType = oneType; | 
|     } | 
|     // Prevent default move event by default. If one false, do not prevent. Otherwise | 
|     // users may be confused why it does not work when multiple insideZooms exist. | 
|     preventDefaultMouseMove = preventDefaultMouseMove && dataZoomModel.get('preventDefaultMouseMove', true); | 
|   }); | 
|   return { | 
|     controlType: controlType, | 
|     opt: { | 
|       // RoamController will enable all of these functionalities, | 
|       // and the final behavior is determined by its event listener | 
|       // provided by each inside zoom. | 
|       zoomOnMouseWheel: true, | 
|       moveOnMouseMove: true, | 
|       moveOnMouseWheel: true, | 
|       preventDefaultMouseMove: !!preventDefaultMouseMove | 
|     } | 
|   }; | 
| } | 
| export function installDataZoomRoamProcessor(registers) { | 
|   registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, function (ecModel, api) { | 
|     var apiInner = inner(api); | 
|     var coordSysRecordMap = apiInner.coordSysRecordMap || (apiInner.coordSysRecordMap = createHashMap()); | 
|     coordSysRecordMap.each(function (coordSysRecord) { | 
|       // `coordSysRecordMap` always exists (because it holds the `roam controller`, which should | 
|       // better not re-create each time), but clear `dataZoomInfoMap` each round of the workflow. | 
|       coordSysRecord.dataZoomInfoMap = null; | 
|     }); | 
|     ecModel.eachComponent({ | 
|       mainType: 'dataZoom', | 
|       subType: 'inside' | 
|     }, function (dataZoomModel) { | 
|       var dzReferCoordSysWrap = collectReferCoordSysModelInfo(dataZoomModel); | 
|       each(dzReferCoordSysWrap.infoList, function (dzCoordSysInfo) { | 
|         var coordSysUid = dzCoordSysInfo.model.uid; | 
|         var coordSysRecord = coordSysRecordMap.get(coordSysUid) || coordSysRecordMap.set(coordSysUid, createCoordSysRecord(api, dzCoordSysInfo.model)); | 
|         var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap || (coordSysRecord.dataZoomInfoMap = createHashMap()); | 
|         // Notice these props might be changed each time for a single dataZoomModel. | 
|         dataZoomInfoMap.set(dataZoomModel.uid, { | 
|           dzReferCoordSysInfo: dzCoordSysInfo, | 
|           model: dataZoomModel, | 
|           getRange: null | 
|         }); | 
|       }); | 
|     }); | 
|     // (1) Merge dataZoom settings for each coord sys and set to the roam controller. | 
|     // (2) Clear coord sys if not refered by any dataZoom. | 
|     coordSysRecordMap.each(function (coordSysRecord) { | 
|       var controller = coordSysRecord.controller; | 
|       var firstDzInfo; | 
|       var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap; | 
|       if (dataZoomInfoMap) { | 
|         var firstDzKey = dataZoomInfoMap.keys()[0]; | 
|         if (firstDzKey != null) { | 
|           firstDzInfo = dataZoomInfoMap.get(firstDzKey); | 
|         } | 
|       } | 
|       if (!firstDzInfo) { | 
|         disposeCoordSysRecord(coordSysRecordMap, coordSysRecord); | 
|         return; | 
|       } | 
|       var controllerParams = mergeControllerParams(dataZoomInfoMap); | 
|       controller.enable(controllerParams.controlType, controllerParams.opt); | 
|       controller.setPointerChecker(coordSysRecord.containsPoint); | 
|       throttleUtil.createOrUpdate(coordSysRecord, 'dispatchAction', firstDzInfo.model.get('throttle', true), 'fixRate'); | 
|     }); | 
|   }); | 
| } |