/*
THIS INFRAGISTICS ULTIMATE SOFTWARE LICENSE  AGREEMENT ("AGREEMENT") LOCATED HERE:
https://www.infragistics.com/legal/license/igultimate-la
https://www.infragistics.com/legal/license/igultimate-eula
GOVERNS THE LICENSING, INSTALLATION AND USE OF INFRAGISTICS SOFTWARE. BY DOWNLOADING AND/OR INSTALLING AND USING INFRAGISTICS SOFTWARE:  you are indicating that you have read and understand this Agreement, and agree to be legally bound by it on behalf of the yourself and your company.
*/
import * as React from 'react';
import { Visibility_$type } from "igniteui-react-core/ES2015/Visibility";
import { HorizontalAlignment_$type } from "igniteui-react-core/ES2015/HorizontalAlignment";
import { VerticalAlignment_$type } from "igniteui-react-core/ES2015/VerticalAlignment";
import { AxisLabelsLocation_$type } from './AxisLabelsLocation';
import { AxisLabelSettings } from './AxisLabelSettings';
import { TitleSettings } from './TitleSettings';
import { AxisTitlePosition_$type } from './AxisTitlePosition';
import { ensureEnum, brushToString, stringToBrush, ensureBool, isValidProp, getModifiedProps } from "igniteui-react-core/ES2015/componentUtil";
import { delegateCombine, delegateRemove } from "igniteui-react-core/ES2015/type";
import { RenderRequestedEventArgs } from './RenderRequestedEventArgs';
import { TypeRegistrar } from "igniteui-react-core/ES2015/type";
import { AxisRangeChangedEventArgs } from './igr-axis-range-changed-event-args';
import { AxisAnnotationCollection } from './igr-axis-annotation-collection';
import { AxisAnnotationCollection as AxisAnnotationCollection_internal } from './AxisAnnotationCollection';
import { SyncableObservableCollection$1 } from "igniteui-react-core/ES2015/SyncableObservableCollection$1";
import { IAxisAnnotation_$type } from './IAxisAnnotation';
/**
 * Represents the base class from which all axis types are derived.
*/
export class IgrAxis extends React.Component {
    constructor(props) {
        super(props);
        this._renderer = null;
        this._annotations = null;
        this._rangeChanged = null;
        this._rangeChanged_wrapped = null;
        this._renderRequested = null;
        this._renderRequested_wrapped = null;
        this._implementation = this.createImplementation();
        this._implementation.externalObject = this;
        this.onImplementationCreated();
    }
    get i() {
        return this._implementation;
    }
    onImplementationCreated() {
    }
    componentDidMount() {
        this.initializeProperties();
    }
    initializeProperties() {
        for (const p of Object.keys(this.props)) {
            if (isValidProp(this, p)) {
                this[p] = this.props[p];
            }
        }
    }
    set crossingAxisName(value) {
        this._crossingAxisName = value;
    }
    get crossingAxisName() {
        return this._crossingAxisName;
    }
    get axisInternal() {
        return this.i;
    }
    createImplementation() {
        return null;
    }
    shouldComponentUpdate(nextProps, nextState) {
        const mod = getModifiedProps(this.props, nextProps);
        for (const p of Object.keys(mod)) {
            if (isValidProp(this, p)) {
                this[p] = mod[p];
            }
        }
        return true;
    }
    render() {
        return null;
    }
    set name(value) {
        this.i.name = value;
    }
    get name() {
        return this.i.name;
    }
    provideData(data) {
    }
    _provideRenderer(renderer) {
        this._renderer = renderer;
    }
    static _createFromInternal(internal) {
        if (!internal) {
            return null;
        }
        if (!internal.$type) {
            return null;
        }
        let name = internal.$type.name;
        let externalName = "Igr" + name;
        if (!TypeRegistrar.isRegistered(externalName)) {
            return null;
        }
        return TypeRegistrar.create(externalName);
    }
    /**
 * Gets or sets if the current axis is of category axis type
*/
    get isCategory() {
        return this.i.b2;
    }
    /**
     * Gets or sets if the current axis is of numeric axis type
    */
    get isNumeric() {
        return this.i.ca;
    }
    /**
     * Gets if the current axis is of angular axis type
    */
    get isAngular() {
        return this.i.b0;
    }
    /**
     * Gets or sets if the current axis is of radial axis type
    */
    get isRadial() {
        return this.i.cb;
    }
    /**
     * Gets if the current axis is a vertical axis.
    */
    get isVertical() {
        return this.i.ce;
    }
    /**
     * Gets or sets if the current axis is sorting data items
    */
    get isSorting() {
        return this.i.cc;
    }
    /**
     * Gets or sets if the current axis is of date time axis type
    */
    get isDateTime() {
        return this.i.b5;
    }
    /**
     * Gets if the current axis is of category date time axis type
    */
    get isCategoryDateTime() {
        return this.i.b3;
    }
    /**
     * Gets if the current axis is a continuous rather than a discrete scale
    */
    get isContinuous() {
        return this.i.b4;
    }
    /**
     * Sets or gets a function which takes an object that produces a formatted label for displaying in the chart.
    */
    get formatLabel() {
        return this.i.ar;
    }
    set formatLabel(v) {
        this.i.ar = v;
    }
    /**
     * Gets or sets the Title property.
    */
    get title() {
        return this.i.f1;
    }
    set title(v) {
        this.i.f1 = v;
    }
    /**
     * Gets or sets the Stroke property.
     * Null is treated as auto. The axis stroke will be displayed or not based on the axis type and series used with it.
    */
    get stroke() {
        return brushToString(this.i.ig);
    }
    set stroke(v) {
        this.i.ig = stringToBrush(v);
    }
    /**
     * Gets or sets the effective stroke used for the axis.
    */
    get actualStroke() {
        return brushToString(this.i.ib);
    }
    set actualStroke(v) {
        this.i.ib = stringToBrush(v);
    }
    /**
     * Gets or sets the StrokeThickness property.
    */
    get strokeThickness() {
        return this.i.ek;
    }
    set strokeThickness(v) {
        this.i.ek = +v;
    }
    /**
     * Gets or sets the Strip property.
    */
    get strip() {
        return brushToString(this.i.ie);
    }
    set strip(v) {
        this.i.ie = stringToBrush(v);
    }
    /**
     * Gets or sets the MajorStroke property.
     * Null is treated as auto. Major lines will be displayed or not based on the axis type and series used with it.
    */
    get majorStroke() {
        return brushToString(this.i.ic);
    }
    set majorStroke(v) {
        this.i.ic = stringToBrush(v);
    }
    /**
     * Gets or sets the ActualMajorStroke property.
    */
    get actualMajorStroke() {
        return brushToString(this.i.h9);
    }
    set actualMajorStroke(v) {
        this.i.h9 = stringToBrush(v);
    }
    /**
     * Gets or sets the MajorStrokeThickness property.
    */
    get majorStrokeThickness() {
        return this.i.d0;
    }
    set majorStrokeThickness(v) {
        this.i.d0 = +v;
    }
    /**
     * Gets or sets the MinorStroke property.
    */
    get minorStroke() {
        return brushToString(this.i.id);
    }
    set minorStroke(v) {
        this.i.id = stringToBrush(v);
    }
    /**
     * Gets or sets the ActualMinorStroke property.
    */
    get actualMinorStroke() {
        return brushToString(this.i.ia);
    }
    set actualMinorStroke(v) {
        this.i.ia = stringToBrush(v);
    }
    /**
     * Gets or sets the MinorStrokeThickness property.
    */
    get minorStrokeThickness() {
        return this.i.d3;
    }
    set minorStrokeThickness(v) {
        this.i.d3 = +v;
    }
    /**
     * Gets or sets the TickStroke property.
    */
    get tickStroke() {
        return brushToString(this.i.ih);
    }
    set tickStroke(v) {
        this.i.ih = stringToBrush(v);
    }
    /**
     * Gets or sets the TickStrokeThickness property.
    */
    get tickStrokeThickness() {
        return this.i.em;
    }
    set tickStrokeThickness(v) {
        this.i.em = +v;
    }
    /**
     * Gets or sets the TickLength property.
    */
    get tickLength() {
        return this.i.el;
    }
    set tickLength(v) {
        this.i.el = +v;
    }
    /**
     * Gets or sets the IsDisabled property. If true, the axis will not be rendered.
    */
    get isDisabled() {
        return this.i.b6;
    }
    set isDisabled(v) {
        this.i.b6 = ensureBool(v);
    }
    /**
     * Gets or sets the IsInverted property.
    */
    get isInverted() {
        return this.i.b8;
    }
    set isInverted(v) {
        this.i.b8 = ensureBool(v);
    }
    /**
     * Gets or sets whether to use more advanced heuristics when determining the initial number of labels to render, before resolving collisions, etc.
    */
    get useEnhancedIntervalManagement() {
        return this.i.cn;
    }
    set useEnhancedIntervalManagement(v) {
        this.i.cn = ensureBool(v);
    }
    /**
     * Gets or sets the mininum desired characters to be displayed for horizontal axes when using advanced label heuristics. -1 will attempt to adjust the interval to precisely fit the horizontal labels.
    */
    get enhancedIntervalMinimumCharacters() {
        return this.i.eu;
    }
    set enhancedIntervalMinimumCharacters(v) {
        this.i.eu = +v;
    }
    /**
     * Gets or sets the text style to use for axis labels.
    *
    * The `labelTextStyle` property Overrides the style of the text used for the axis labels.
    *
    * ```ts
    * <IgrDataChart
    *     dataSource={this.state.dataSource}
    *     width="700px"
    *     height="500px">
    *
    *     <IgrCategoryXAxis name="xAxis"
    * 		label="Year"
    * 		titleTextStyle="12pt Verdana" />
    *     <IgrNumericYAxis  name="yAxis" />
    *  </IgrDataChart>
    * ```
    *
    * ```ts
    * <IgrCategoryXAxis name="xAxis"
    *     title="Country"
    *     titleTextColor="gray"
    *     titleTextStyle="12pt Verdana"
    *     titleAngle={90} />
    * ```
    */
    get labelTextStyle() {
        return this.i.aw ? this.i.aw.textStyle : null;
    }
    set labelTextStyle(v) {
        this.ensureLabelSettings();
        this.i.aw.textStyle = v;
    }
    /**
     * The color of the {0}.
    *
    * The `labelTextColor` property Overrides the color of the text used for the axis labels.
    *
    * ```ts
    * <IgrDataChart
    *     dataSource={this.state.dataSource}
    *     width="700px"
    *     height="500px">
    *
    *     <IgrCategoryXAxis name="xAxis"
    * 		label="Year"
    * 		labelTextColor="gray"  />
    *     <IgrNumericYAxis  name="yAxis" />
    *  </IgrDataChart>
    * ```
    *
    * ```ts
    * <IgrCategoryXAxis name="xAxis"
    *     title="Country"
    *     titleTextColor="gray"
    *     titleTextStyle="12pt Verdana"
    *     titleAngle={90} />
    * ```
    */
    get labelTextColor() {
        return brushToString(this.i.aw ? this.i.aw.textColor : null);
    }
    set labelTextColor(v) {
        this.ensureLabelSettings();
        this.i.aw.textColor = stringToBrush(v);
    }
    /**
     * Gets or sets the location of the {0}.
    *
    * The `Location` property is used for the location.
    */
    get labelLocation() {
        return this.i.aw ? this.i.aw.location : 0;
    }
    set labelLocation(v) {
        this.ensureLabelSettings();
        this.i.aw.location = ensureEnum(AxisLabelsLocation_$type, v);
    }
    /**
     * Gets or sets the visibility of the {0}.
    *
    * The `Visibility` property is used for the visibility of the axis.
    */
    get labelVisibility() {
        return this.i.aw ? this.i.aw.visibility : 0;
    }
    set labelVisibility(v) {
        this.ensureLabelSettings();
        this.i.aw.visibility = ensureEnum(Visibility_$type, v);
    }
    /**
     * Gets or sets whether the first label is displayed when the zoom level is set to 1.
    *
    * The `ShowFirstLabel` is used to check whether the first label is displayed when the zoom level is set to 1.
    */
    get labelShowFirstLabel() {
        return this.i.aw ? this.i.aw.showFirstLabel : false;
    }
    set labelShowFirstLabel(v) {
        this.ensureLabelSettings();
        this.i.aw.showFirstLabel = ensureBool(v);
    }
    /**
     * Gets or sets the angle of the {0}.
    *
    * The `Angle` property is used to set the angle of the axis.
    *
    * ```ts
    * <IgrDataChart
    *     dataSource={this.state.dataSource}
    *     width="700px"
    *     height="500px">
    *
    *     <IgrCategoryXAxis name="xAxis"
    * 		label="Year"
    * 		titleAngle={90} />
    *     <IgrNumericYAxis  name="yAxis" />
    *  </IgrDataChart>
    * ```
    *
    * ```ts
    * <IgrCategoryXAxis name="xAxis"
    *     title="Country"
    *     titleTextColor="gray"
    *     titleTextStyle="12pt Verdana"
    *     titleAngle={90} />
    * ```
    */
    get labelAngle() {
        return this.i.aw ? this.i.aw.angle : NaN;
    }
    set labelAngle(v) {
        this.ensureLabelSettings();
        this.i.aw.angle = +v;
    }
    /**
     * Distance between the axis and the edge of the control.
    *
    * The `Extent` property is used for the extent.
    *
    * ```ts
    * <IgrDataChart
    *     dataSource={this.state.dataSource}
    *     width="700px"
    *     height="500px">
    *
    *     <IgrCategoryXAxis name="xAxis"
    * 		label="Year"/>
    *     <IgrNumericYAxis  name="yAxis" />
    *  </IgrDataChart>
    * ```
    */
    get labelExtent() {
        return this.i.aw ? this.i.aw.extent : NaN;
    }
    set labelExtent(v) {
        this.ensureLabelSettings();
        this.i.aw.extent = +v;
    }
    /**
     * Margin applied to the left of the {0}.
    *
    * The `labelLeftMargin` property is used for the left margin of the labels.
    */
    get labelLeftMargin() {
        return this.i.aw ? this.i.aw.leftMargin : NaN;
    }
    set labelLeftMargin(v) {
        this.ensureLabelSettings();
        this.i.aw.leftMargin = +v;
    }
    /**
     * Margin applied to the right of the {0}.
    *
    * The `labelRightMargin` property is used for the right margin of the labels.
    */
    get labelRightMargin() {
        return this.i.aw ? this.i.aw.rightMargin : NaN;
    }
    set labelRightMargin(v) {
        this.ensureLabelSettings();
        this.i.aw.rightMargin = +v;
    }
    /**
     * Margin applied above the {0}.
    *
    * The `labelTopMargin` property is used for the top margin of the labels.
    *
    * ```ts
    * <IgrCategoryXAxis name="xAxis"
    *     label="Country"
    *     labelTextStyle="9pt Verdana"
    *     labelTopMargin={5}
    *     labelTextColor="gray" />
    * ```
    */
    get labelTopMargin() {
        return this.i.aw ? this.i.aw.topMargin : NaN;
    }
    set labelTopMargin(v) {
        this.ensureLabelSettings();
        this.i.aw.topMargin = +v;
    }
    /**
     * Margin applied below the {0}.
    *
    * The `labelBottomMargin` is used for the bottom margin of the labels.
    */
    get labelBottomMargin() {
        return this.i.aw ? this.i.aw.bottomMargin : NaN;
    }
    set labelBottomMargin(v) {
        this.ensureLabelSettings();
        this.i.aw.bottomMargin = +v;
    }
    /**
     * Gets or sets the horizontal alignment of the {0}.
    *
    * The `HorizontalAlignment` property is used for the horizontal alignment.
    */
    get labelHorizontalAlignment() {
        return this.i.aw ? this.i.aw.horizontalAlignment : 0;
    }
    set labelHorizontalAlignment(v) {
        this.ensureLabelSettings();
        this.i.aw.horizontalAlignment = ensureEnum(HorizontalAlignment_$type, v);
    }
    /**
     * Gets or sets the vertical alignment of the {0}.
    *
    * The `VerticalAlignment` property is used for the vertical alignment of the axis.
    */
    get labelVerticalAlignment() {
        return this.i.aw ? this.i.aw.verticalAlignment : 0;
    }
    set labelVerticalAlignment(v) {
        this.ensureLabelSettings();
        this.i.aw.verticalAlignment = ensureEnum(VerticalAlignment_$type, v);
    }
    ensureLabelSettings() {
        if (this.i.aw) {
            return;
        }
        this.i.aw = new AxisLabelSettings();
        this.i.aw.location = this.i.ax();
        this.i.aw.angle = this.i.dh();
        this.i.aw.leftMargin = this.i.dj();
        this.i.aw.rightMargin = this.i.dk();
        this.i.aw.topMargin = this.i.dl();
        this.i.aw.bottomMargin = this.i.di();
        this.i.aw.horizontalAlignment = this.i.h7();
        this.i.aw.verticalAlignment = this.i.i1();
    }
    /**
     * Gets or sets the CrossingAxis property.
    */
    get crossingAxis() {
        if (this.i.ag == null) {
            return null;
        }
        return this.i.ag.externalObject;
    }
    set crossingAxis(v) {
        v == null ? this.i.ag = null : this.i.ag = v.i;
    }
    /**
     * Gets or sets the CrossingValue property.
    */
    get crossingValue() {
        return this.i.ez;
    }
    set crossingValue(v) {
        this.i.ez = v;
    }
    /**
     * Gets or sets the title position relative to the axis labels.
    */
    get titlePosition() {
        return this.i.bc ? this.i.bc.position : 0;
    }
    set titlePosition(v) {
        this.ensureTitleSettings();
        this.i.bc.position = ensureEnum(AxisTitlePosition_$type, v);
    }
    /**
     * Gets or sets the text style to use for axis labels.
    *
    * The `labelTextStyle` property Overrides the style of the text used for the axis labels.
    *
    * ```ts
    * <IgrDataChart
    *     dataSource={this.state.dataSource}
    *     width="700px"
    *     height="500px">
    *
    *     <IgrCategoryXAxis name="xAxis"
    * 		label="Year"
    * 		titleTextStyle="12pt Verdana" />
    *     <IgrNumericYAxis  name="yAxis" />
    *  </IgrDataChart>
    * ```
    *
    * ```ts
    * <IgrCategoryXAxis name="xAxis"
    *     title="Country"
    *     titleTextColor="gray"
    *     titleTextStyle="12pt Verdana"
    *     titleAngle={90} />
    * ```
    */
    get titleTextStyle() {
        return this.i.bc ? this.i.bc.textStyle : null;
    }
    set titleTextStyle(v) {
        this.ensureTitleSettings();
        this.i.bc.textStyle = v;
    }
    /**
     * The color of the {0}.
    *
    * The `labelTextColor` property Overrides the color of the text used for the axis labels.
    *
    * ```ts
    * <IgrDataChart
    *     dataSource={this.state.dataSource}
    *     width="700px"
    *     height="500px">
    *
    *     <IgrCategoryXAxis name="xAxis"
    * 		label="Year"
    * 		labelTextColor="gray"  />
    *     <IgrNumericYAxis  name="yAxis" />
    *  </IgrDataChart>
    * ```
    *
    * ```ts
    * <IgrCategoryXAxis name="xAxis"
    *     title="Country"
    *     titleTextColor="gray"
    *     titleTextStyle="12pt Verdana"
    *     titleAngle={90} />
    * ```
    */
    get titleTextColor() {
        return brushToString(this.i.bc ? this.i.bc.textColor : null);
    }
    set titleTextColor(v) {
        this.ensureTitleSettings();
        this.i.bc.textColor = stringToBrush(v);
    }
    /**
     * Gets or sets the location of the {0}.
    *
    * The `Location` property is used for the location.
    */
    get titleLocation() {
        return this.i.bc ? this.i.bc.location : 0;
    }
    set titleLocation(v) {
        this.ensureTitleSettings();
        this.i.bc.location = ensureEnum(AxisLabelsLocation_$type, v);
    }
    /**
     * Gets or sets the visibility of the {0}.
    *
    * The `Visibility` property is used for the visibility of the axis.
    */
    get titleVisibility() {
        return this.i.bc ? this.i.bc.visibility : 0;
    }
    set titleVisibility(v) {
        this.ensureTitleSettings();
        this.i.bc.visibility = ensureEnum(Visibility_$type, v);
    }
    /**
     * Gets or sets whether the first label is displayed when the zoom level is set to 1.
    *
    * The `ShowFirstLabel` is used to check whether the first label is displayed when the zoom level is set to 1.
    */
    get titleShowFirstLabel() {
        return this.i.bc ? this.i.bc.showFirstLabel : false;
    }
    set titleShowFirstLabel(v) {
        this.ensureTitleSettings();
        this.i.bc.showFirstLabel = ensureBool(v);
    }
    /**
     * Gets or sets the angle of the {0}.
    *
    * The `Angle` property is used to set the angle of the axis.
    *
    * ```ts
    * <IgrDataChart
    *     dataSource={this.state.dataSource}
    *     width="700px"
    *     height="500px">
    *
    *     <IgrCategoryXAxis name="xAxis"
    * 		label="Year"
    * 		titleAngle={90} />
    *     <IgrNumericYAxis  name="yAxis" />
    *  </IgrDataChart>
    * ```
    *
    * ```ts
    * <IgrCategoryXAxis name="xAxis"
    *     title="Country"
    *     titleTextColor="gray"
    *     titleTextStyle="12pt Verdana"
    *     titleAngle={90} />
    * ```
    */
    get titleAngle() {
        return this.i.bc ? this.i.bc.angle : NaN;
    }
    set titleAngle(v) {
        this.ensureTitleSettings();
        this.i.bc.angle = +v;
    }
    /**
     * Distance between the axis and the edge of the control.
    *
    * The `Extent` property is used for the extent.
    *
    * ```ts
    * <IgrDataChart
    *     dataSource={this.state.dataSource}
    *     width="700px"
    *     height="500px">
    *
    *     <IgrCategoryXAxis name="xAxis"
    * 		label="Year"/>
    *     <IgrNumericYAxis  name="yAxis" />
    *  </IgrDataChart>
    * ```
    */
    get titleExtent() {
        return this.i.bc ? this.i.bc.extent : NaN;
    }
    set titleExtent(v) {
        this.ensureTitleSettings();
        this.i.bc.extent = +v;
    }
    /**
     * Margin applied to the left of the {0}.
    *
    * The `labelLeftMargin` property is used for the left margin of the labels.
    */
    get titleLeftMargin() {
        return this.i.bc ? this.i.bc.leftMargin : NaN;
    }
    set titleLeftMargin(v) {
        this.ensureTitleSettings();
        this.i.bc.leftMargin = +v;
    }
    /**
     * Margin applied to the right of the {0}.
    *
    * The `labelRightMargin` property is used for the right margin of the labels.
    */
    get titleRightMargin() {
        return this.i.bc ? this.i.bc.rightMargin : NaN;
    }
    set titleRightMargin(v) {
        this.ensureTitleSettings();
        this.i.bc.rightMargin = +v;
    }
    /**
     * Margin applied above the {0}.
    *
    * The `labelTopMargin` property is used for the top margin of the labels.
    *
    * ```ts
    * <IgrCategoryXAxis name="xAxis"
    *     label="Country"
    *     labelTextStyle="9pt Verdana"
    *     labelTopMargin={5}
    *     labelTextColor="gray" />
    * ```
    */
    get titleTopMargin() {
        return this.i.bc ? this.i.bc.topMargin : NaN;
    }
    set titleTopMargin(v) {
        this.ensureTitleSettings();
        this.i.bc.topMargin = +v;
    }
    /**
     * Margin applied below the {0}.
    *
    * The `labelBottomMargin` is used for the bottom margin of the labels.
    */
    get titleBottomMargin() {
        return this.i.bc ? this.i.bc.bottomMargin : NaN;
    }
    set titleBottomMargin(v) {
        this.ensureTitleSettings();
        this.i.bc.bottomMargin = +v;
    }
    /**
     * Gets or sets the horizontal alignment of the {0}.
    *
    * The `HorizontalAlignment` property is used for the horizontal alignment.
    */
    get titleHorizontalAlignment() {
        return this.i.bc ? this.i.bc.horizontalAlignment : 0;
    }
    set titleHorizontalAlignment(v) {
        this.ensureTitleSettings();
        this.i.bc.horizontalAlignment = ensureEnum(HorizontalAlignment_$type, v);
    }
    /**
     * Gets or sets the vertical alignment of the {0}.
    *
    * The `VerticalAlignment` property is used for the vertical alignment of the axis.
    */
    get titleVerticalAlignment() {
        return this.i.bc ? this.i.bc.verticalAlignment : 0;
    }
    set titleVerticalAlignment(v) {
        this.ensureTitleSettings();
        this.i.bc.verticalAlignment = ensureEnum(VerticalAlignment_$type, v);
    }
    ensureTitleSettings() {
        if (this.i.bc) {
            return;
        }
        this.i.bc = new TitleSettings();
        this.i.bc.location = this.i.ay();
        this.i.bc.angle = this.i.dm();
        this.i.bc.leftMargin = this.i.dp();
        this.i.bc.rightMargin = this.i.dq();
        this.i.bc.topMargin = this.i.dr();
        this.i.bc.bottomMargin = this.i.dn();
        this.i.bc.horizontalAlignment = this.i.h8();
        this.i.bc.verticalAlignment = this.i.i2();
    }
    /**
     * Gets the current annotations for the axis.
    */
    get annotations() {
        if (this._annotations === null) {
            let coll = new AxisAnnotationCollection();
            let innerColl = this.i.ak;
            if (!innerColl) {
                innerColl = new AxisAnnotationCollection_internal();
            }
            this._annotations = coll._fromInner(innerColl);
        }
        return this._annotations;
    }
    set annotations(v) {
        if (this._annotations !== null) {
            this._annotations._setSyncTarget(null);
            this._annotations = null;
        }
        let coll = new AxisAnnotationCollection();
        this._annotations = coll._fromOuter(v);
        let syncColl = new SyncableObservableCollection$1(IAxisAnnotation_$type);
        let innerColl = this.i.ak;
        if (!innerColl) {
            innerColl = new AxisAnnotationCollection_internal();
        }
        syncColl._inner = innerColl;
        syncColl.clear();
        this._annotations._setSyncTarget(syncColl);
    }
    /**
     * Gets or sets the coercion methods to use when loading data from data sources.
     * Should be specified before setting any member paths, if being used. Setting it later
     * will not cause data to be re-imported into the chart.
    *
    * The	`coercionMethods` methods is to use when loading data from data sources. Should be specified before setting any member paths, if being used.
    * Setting it later will not cause data to be reimported into the chart.
    */
    get coercionMethods() {
        return this.i.coercionMethods;
    }
    set coercionMethods(v) {
        this.i.coercionMethods = v;
    }
    /**
     * Gets or sets whether the series should expect that properties in its items source may be functions that need to be
     * evaluated to yield their value. This defaults to false, as there will be a subtle performance impact to using this feature.
     * This value must be set before assigning an item's source to take effect.
    */
    get expectFunctions() {
        return this.i.expectFunctions;
    }
    set expectFunctions(v) {
        this.i.expectFunctions = ensureBool(v);
    }
    /**
     * Gets or sets the axis label format string.
    */
    get label() {
        return this.i.e2;
    }
    set label(v) {
        this.i.e2 = v;
    }
    /**
 * Renders the axis with no animation.

*/
    renderAxis() {
        this.i.gz();
    }
    /**
     * If using enhanced interval management and precise interval fitting, this will reset the cached maximum label width, and recalculate using the current labels.
    
    */
    resetCachedEnhancedInterval() {
        this.i.g2();
    }
    /**
     * Scales a value from axis space into screen space.
    
    * @param unscaledValue  * The unscaled axis value to scale.
    */
    scaleValue(unscaledValue) {
        let iv = this.i.d8(unscaledValue);
        return (iv);
    }
    /**
     * Occurs when the axis range changes.
    */
    get rangeChanged() {
        return this._rangeChanged;
    }
    set rangeChanged(ev) {
        if (this._rangeChanged_wrapped !== null) {
            this.i.rangeChanged = delegateRemove(this.i.rangeChanged, this._rangeChanged_wrapped);
            this._rangeChanged_wrapped = null;
            this._rangeChanged = null;
        }
        this._rangeChanged = ev;
        this._rangeChanged_wrapped = (o, e) => {
            let outerArgs = new AxisRangeChangedEventArgs();
            outerArgs._provideImplementation(e);
            if (this.beforeRangeChanged) {
                this.beforeRangeChanged(this, outerArgs);
            }
            if (this._rangeChanged) {
                this._rangeChanged(this, outerArgs);
            }
        };
        this.i.rangeChanged = delegateCombine(this.i.rangeChanged, this._rangeChanged_wrapped);
    }
    /**
     * This event is raised every time a render has been requested from a series.
    */
    get renderRequested() {
        return this._renderRequested;
    }
    set renderRequested(ev) {
        if (this._renderRequested_wrapped !== null) {
            this.i.renderRequested = delegateRemove(this.i.renderRequested, this._renderRequested_wrapped);
            this._renderRequested_wrapped = null;
            this._renderRequested = null;
        }
        this._renderRequested = ev;
        this._renderRequested_wrapped = (o, e) => {
            let outerArgs = new RenderRequestedEventArgs();
            outerArgs._provideImplementation(e);
            if (this.beforeRenderRequested) {
                this.beforeRenderRequested(this, outerArgs);
            }
            if (this._renderRequested) {
                this._renderRequested(this, outerArgs);
            }
        };
        this.i.renderRequested = delegateCombine(this.i.renderRequested, this._renderRequested_wrapped);
    }
}
