| /* |
| * 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 * as axisPointerModelHelper from '../axisPointer/modelHelper'; |
| import ComponentView from '../../view/Component'; |
| import { AxisBaseModel } from '../../coord/AxisBaseModel'; |
| import GlobalModel from '../../model/Global'; |
| import ExtensionAPI from '../../core/ExtensionAPI'; |
| import { Payload, Dictionary } from '../../util/types'; |
| import type BaseAxisPointer from '../axisPointer/BaseAxisPointer'; |
| |
| const axisPointerClazz: Dictionary<AxisPointerConstructor> = {}; |
| |
| interface AxisPointerConstructor { |
| new(): BaseAxisPointer |
| } |
| /** |
| * Base class of AxisView. |
| */ |
| class AxisView extends ComponentView { |
| |
| static type = 'axis'; |
| type = AxisView.type; |
| |
| /** |
| * @private |
| */ |
| private _axisPointer: BaseAxisPointer; |
| |
| /** |
| * @protected |
| */ |
| axisPointerClass: string; |
| |
| /** |
| * @override |
| */ |
| render(axisModel: AxisBaseModel, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload) { |
| // FIXME |
| // This process should proformed after coordinate systems updated |
| // (axis scale updated), and should be performed each time update. |
| // So put it here temporarily, although it is not appropriate to |
| // put a model-writing procedure in `view`. |
| this.axisPointerClass && axisPointerModelHelper.fixValue(axisModel); |
| |
| super.render.apply(this, arguments as any); |
| |
| this._doUpdateAxisPointerClass(axisModel, api, true); |
| } |
| |
| /** |
| * Action handler. |
| */ |
| updateAxisPointer( |
| axisModel: AxisBaseModel, |
| ecModel: GlobalModel, |
| api: ExtensionAPI, |
| payload: Payload |
| ) { |
| this._doUpdateAxisPointerClass(axisModel, api, false); |
| } |
| |
| /** |
| * @override |
| */ |
| remove(ecModel: GlobalModel, api: ExtensionAPI) { |
| const axisPointer = this._axisPointer; |
| axisPointer && axisPointer.remove(api); |
| } |
| |
| /** |
| * @override |
| */ |
| dispose(ecModel: GlobalModel, api: ExtensionAPI) { |
| this._disposeAxisPointer(api); |
| super.dispose.apply(this, arguments as any); |
| } |
| |
| private _doUpdateAxisPointerClass(axisModel: AxisBaseModel, api: ExtensionAPI, forceRender?: boolean) { |
| const Clazz = AxisView.getAxisPointerClass(this.axisPointerClass); |
| if (!Clazz) { |
| return; |
| } |
| const axisPointerModel = axisPointerModelHelper.getAxisPointerModel(axisModel); |
| axisPointerModel |
| ? (this._axisPointer || (this._axisPointer = new Clazz())) |
| .render(axisModel, axisPointerModel, api, forceRender) |
| : this._disposeAxisPointer(api); |
| } |
| |
| private _disposeAxisPointer(api: ExtensionAPI) { |
| this._axisPointer && this._axisPointer.dispose(api); |
| this._axisPointer = null; |
| } |
| |
| static registerAxisPointerClass(type: string, clazz: AxisPointerConstructor) { |
| if (__DEV__) { |
| if (axisPointerClazz[type]) { |
| throw new Error('axisPointer ' + type + ' exists'); |
| } |
| } |
| axisPointerClazz[type] = clazz; |
| }; |
| |
| static getAxisPointerClass(type: string) { |
| return type && axisPointerClazz[type]; |
| }; |
| |
| } |
| |
| export default AxisView; |