import * as React from 'react';
import { delegateCombine, delegateRemove } from "igniteui-react-core";
import { Visibility_$type } from "igniteui-react-core";
import { MarkerType_$type } from "./MarkerType";
import { MarkerFillMode_$type } from "./MarkerFillMode";
import { MarkerOutlineMode_$type } from "./MarkerOutlineMode";
import { IgrPropertyUpdatedEventArgs } from "igniteui-react-core";
import { StackedFragmentSeries } from "./StackedFragmentSeries";
import { fromDoubleCollection, toDoubleCollection, getModifiedProps, isValidProp, brushToString, stringToBrush, ensureBool, colorToString, stringToColor, ensureEnum, toSpinal, initializePropertiesFromCss, NamePatcher, fromPoint, toPoint, fromRect } from "igniteui-react-core";
import { TypeRegistrar } from "igniteui-react-core";
import { SeriesOutlineMode_$type } from './SeriesOutlineMode';
import { LegendItemBadgeMode_$type } from "igniteui-react-core";
import { LegendItemBadgeShape_$type } from "igniteui-react-core";
import { CategoryTransitionInMode_$type } from './CategoryTransitionInMode';
import { TransitionInSpeedType_$type } from './TransitionInSpeedType';
import { PenLineCap_$type } from "igniteui-react-core";
import { SeriesHighlightedValuesDisplayMode_$type } from './SeriesHighlightedValuesDisplayMode';
/**
 * Represents a non-visual child of StackedSeriesBase.
*/
export class IgrStackedFragmentSeries extends React.Component {
    createImplementation() {
        return new StackedFragmentSeries();
    }
    onImplementationCreated() {
    }
    constructor(props) {
        super(props);
        this.__p = null;
        this._hasUserValues = new Set();
        this._stylingContainer = null;
        this._stylingParent = null;
        this._inStyling = false;
        this._propertyUpdated = null;
        this._propertyUpdated_wrapped = null;
        if (this._styling) {
            NamePatcher.ensureStylablePatched(Object.getPrototypeOf(this));
        }
        this._implementation = this.createImplementation();
        this._implementation.externalObject = this;
        this.onImplementationCreated();
    }
    componentDidMount() {
        for (const p of Object.keys(this.props)) {
            if (isValidProp(this, p)) {
                this[p] = this.props[p];
            }
        }
    }
    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;
    }
    provideRenderer(renderer) {
        this._renderer = renderer;
        this.i.visualSeriesLink.provideRenderer(renderer);
    }
    /**
     * @hidden
     */
    get i() {
        return this._implementation;
    } /**
                                 * @hidden
                                 */
    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 the ItemsSource property for the current series object. Normally you will want to provide data to the parent series instead.
 * But if you have data as individual columns, it can be assigned here. The data must be aligned and have the same number of items for each fragment.
*/
    get dataSource() {
        return this.i.itemsSource;
    }
    set dataSource(v) {
        this.i.itemsSource = v;
    }
    /**
     * Gets or sets the HighlightedItemsSource property for the current series object.
    */
    get highlightedDataSource() {
        return this.i.highlightedItemsSource;
    }
    set highlightedDataSource(v) {
        this.i.highlightedItemsSource = v;
    }
    /**
     * Gets or sets the brush of the stacked fragment.
    */
    get brush() {
        return brushToString(this.i.kk);
    }
    set brush(v) {
        this.i.kk = stringToBrush(v);
    }
    /**
     * Gets the actual brush used by the series.
    */
    get actualBrush() {
        return brushToString(this.i.kf);
    }
    set actualBrush(v) {
        this.i.kf = stringToBrush(v);
    }
    /**
     * Gets or sets a collection of Double values that indicate the pattern of dashes and gaps that
     * is used to outline the current series object.
    */
    get dashArray() {
        return fromDoubleCollection(this.i.kt);
    }
    set dashArray(v) {
        this.i.kt = toDoubleCollection(v);
    }
    /**
     * Gets or sets whether drop shadow should be enabled for this series.
    */
    get isDropShadowEnabled() {
        return this.i.au;
    }
    set isDropShadowEnabled(v) {
        this.i.au = ensureBool(v);
    }
    /**
     * Gets whether drop shadow is actually enabled for this series.
    */
    get actualIsDropShadowEnabled() {
        return this.i.al;
    }
    set actualIsDropShadowEnabled(v) {
        this.i.al = ensureBool(v);
    }
    /**
     * Gets or sets the shadow blur.
     * This property is ignored when
     * StackedFragmentSeries.UseSingleShadow is set to true.
    */
    get shadowBlur() {
        return this.i.b1;
    }
    set shadowBlur(v) {
        this.i.b1 = +v;
    }
    /**
     * Gets the actual shadow blur used by the series.
    */
    get actualShadowBlur() {
        return this.i.bi;
    }
    set actualShadowBlur(v) {
        this.i.bi = +v;
    }
    /**
     * Gets or sets the drop shadow color.
    */
    get shadowColor() {
        return colorToString(this.i.kr);
    }
    set shadowColor(v) {
        this.i.kr = stringToColor(v);
    }
    /**
     * Gets actual the drop shadow color used by the series.
    */
    get actualShadowColor() {
        return colorToString(this.i.kq);
    }
    set actualShadowColor(v) {
        this.i.kq = stringToColor(v);
    }
    /**
     * Gets or sets whether drop shadow is applied to the whole StackedFragmentSeries visual or to each of the individual shapes forming the StackedFragmentSeries.
     * When this property is set to true, no
     * StackedFragmentSeries.ShadowBlur is applied.
    */
    get useSingleShadow() {
        return this.i.a4;
    }
    set useSingleShadow(v) {
        this.i.a4 = ensureBool(v);
    }
    /**
     * Gets whether drop shadow is actually applied to the whole StackedFragmentSeries visual or to each of the individual shapes forming the StackedFragmentSeries.
    */
    get actualUseSingleShadow() {
        return this.i.ar;
    }
    set actualUseSingleShadow(v) {
        this.i.ar = ensureBool(v);
    }
    /**
     * Gets or sets the drop shadow x-offset.
    */
    get shadowOffsetX() {
        return this.i.b2;
    }
    set shadowOffsetX(v) {
        this.i.b2 = +v;
    }
    /**
     * Gets the actual drop shadow x-offset applied to the series.
    */
    get actualShadowOffsetX() {
        return this.i.bj;
    }
    set actualShadowOffsetX(v) {
        this.i.bj = +v;
    }
    /**
     * Gets or sets the drop shadow y-offset.
    */
    get shadowOffsetY() {
        return this.i.b3;
    }
    set shadowOffsetY(v) {
        this.i.b3 = +v;
    }
    /**
     * Gets the actual drop shadow y-offset applied to the series.
    */
    get actualShadowOffsetY() {
        return this.i.bk;
    }
    set actualShadowOffsetY(v) {
        this.i.bk = +v;
    }
    /**
     * The style of the end points of any lines or polylines representing this series.
     * Not every series type has a line at which it would be appropriate to display an end cap, so this property does not affect every series type.  LineSeries, for example, is affected by EndCap, but ColumnSeries is not.
    */
    get lineCap() {
        return this.i.kx;
    }
    set lineCap(v) {
        this.i.kx = ensureEnum(PenLineCap_$type, v);
    }
    /**
     * Gets the actual end cap used by the series.
    */
    get actualLineCap() {
        return this.i.kv;
    }
    set actualLineCap(v) {
        this.i.kv = ensureEnum(PenLineCap_$type, v);
    }
    /**
     * Gets or sets the LegendItemBadgeTemplate property.
     * The legend item badge is created according to the LegendItemBadgeTemplate on-demand by
     * the series object itself.
    */
    get legendItemBadgeTemplate() {
        return this.i.hf;
    }
    set legendItemBadgeTemplate(v) {
        this.i.hf = v;
    }
    /**
     * Gets the actual legend item badge template used by the series.
    */
    get actualLegendItemBadgeTemplate() {
        return this.i.hc;
    }
    set actualLegendItemBadgeTemplate(v) {
        this.i.hc = v;
    }
    /**
     * Gets or sets the LegendItemTemplate property.
     * The legend item control content is created according to the LegendItemTemplate on-demand by
     * the series object itself.
    */
    get legendItemTemplate() {
        return this.i.hg;
    }
    set legendItemTemplate(v) {
        this.i.hg = v;
    }
    /**
     * Gets the actual legend item template used by the series.
    */
    get actualLegendItemTemplate() {
        return this.i.hd;
    }
    set actualLegendItemTemplate(v) {
        this.i.hd = v;
    }
    /**
     * Gets or sets the legend item visibility for the current series object.
    */
    get legendItemVisibility() {
        return this.i.lf;
    }
    set legendItemVisibility(v) {
        this.i.lf = ensureEnum(Visibility_$type, v);
    }
    /**
     * Gets the actual visibility of the legend items in the series.
    */
    get actualLegendItemVisibility() {
        return this.i.ld;
    }
    set actualLegendItemVisibility(v) {
        this.i.ld = ensureEnum(Visibility_$type, v);
    }
    /**
     * Gets or sets the type of legend badge representing the current series in a legend.
     * This property will be ignored when the LegendItemTemplate or LegendItemBadgeTemplate property is set on the series
    */
    get legendItemBadgeShape() {
        return this.i.r;
    }
    set legendItemBadgeShape(v) {
        this.i.r = ensureEnum(LegendItemBadgeShape_$type, v);
    }
    /**
     * Gets or sets the mode of legend badge representing the current series in a legend.
     * This property will be ignored when the LegendItemTemplate or LegendItemBadgeTemplate property is set on the series
    */
    get legendItemBadgeMode() {
        return this.i.p;
    }
    set legendItemBadgeMode(v) {
        this.i.p = ensureEnum(LegendItemBadgeMode_$type, v);
    }
    /**
     * Gets the actual LegendItemBadgeShape of the series.
    */
    get actualLegendItemBadgeShape() {
        return this.i.q;
    }
    set actualLegendItemBadgeShape(v) {
        this.i.q = ensureEnum(LegendItemBadgeShape_$type, v);
    }
    /**
     * Gets the actual LegendItemBadgeMode of the series.
    */
    get actualLegendItemBadgeMode() {
        return this.i.o;
    }
    set actualLegendItemBadgeMode(v) {
        this.i.o = ensureEnum(LegendItemBadgeMode_$type, v);
    }
    /**
     * Gets or sets the brush that specifies how the current series object's marker interiors are painted.
    */
    get markerBrush() {
        return brushToString(this.i.kl);
    }
    set markerBrush(v) {
        this.i.kl = stringToBrush(v);
    }
    /**
     * Gets the actual marker brush of the series.
    */
    get actualMarkerBrush() {
        return brushToString(this.i.kg);
    }
    set actualMarkerBrush(v) {
        this.i.kg = stringToBrush(v);
    }
    /**
     * Gets or sets the brush that specifies how the current series object's marker outlines are painted.
    */
    get markerOutline() {
        return brushToString(this.i.km);
    }
    set markerOutline(v) {
        this.i.km = stringToBrush(v);
    }
    /**
     * Gets the actual marker outline of the series.
    */
    get actualMarkerOutline() {
        return brushToString(this.i.kh);
    }
    set actualMarkerOutline(v) {
        this.i.kh = stringToBrush(v);
    }
    /**
     * Gets or sets the MarkerTemplate for the current series object.
    */
    get markerTemplate() {
        return this.i.hh;
    }
    set markerTemplate(v) {
        this.i.hh = v;
    }
    /**
     * Gets the actual marker template used by the series.
    */
    get actualMarkerTemplate() {
        return this.i.he;
    }
    set actualMarkerTemplate(v) {
        this.i.he = v;
    }
    /**
     * Gets or sets the marker type for the current series object.
     * If the MarkerTemplate property is set, the setting of the MarkerType property will be ignored.
    */
    get markerType() {
        return this.i.x;
    }
    set markerType(v) {
        this.i.x = ensureEnum(MarkerType_$type, v);
    }
    /**
     * Gets the actual marker type set used in the series.
    */
    get actualMarkerType() {
        return this.i.w;
    }
    set actualMarkerType(v) {
        this.i.w = ensureEnum(MarkerType_$type, v);
    }
    /**
     * Gets or sets whether the marker fill is based on the marker outline of the series rather than the marker brushes collection.
    */
    get markerFillMode() {
        return this.i.t;
    }
    set markerFillMode(v) {
        this.i.t = ensureEnum(MarkerFillMode_$type, v);
    }
    /**
     * Gets whether the marker fill is based on the marker outline of the series rather than the marker brushes collection.
    */
    get actualMarkerFillMode() {
        return this.i.s;
    }
    set actualMarkerFillMode(v) {
        this.i.s = ensureEnum(MarkerFillMode_$type, v);
    }
    /**
     * Gets or sets whether the marker outline is based on the marker brush of the series rather than the marker outlines collection.
    */
    get markerOutlineMode() {
        return this.i.v;
    }
    set markerOutlineMode(v) {
        this.i.v = ensureEnum(MarkerOutlineMode_$type, v);
    }
    /**
     * Gets whether the marker outline is based on the marker brush of the series rather than the marker outlines collection.
    */
    get actualMarkerOutlineMode() {
        return this.i.u;
    }
    set actualMarkerOutlineMode(v) {
        this.i.u = ensureEnum(MarkerOutlineMode_$type, v);
    }
    /**
     * Gets or sets the Name of the stacked fragment.
    */
    get name() {
        return this.i.er;
    }
    set name(v) {
        this.i.er = v;
    }
    /**
     * Gets or sets the Opacity of the stacked fragment.
    */
    get opacity() {
        return this.i.by;
    }
    set opacity(v) {
        this.i.by = +v;
    }
    /**
     * Gets the series opacity.
    */
    get actualOpacity() {
        return this.i.bf;
    }
    set actualOpacity(v) {
        this.i.bf = +v;
    }
    /**
     * Gets or sets the brush to use for the outline of the series.
     * Some series types, such as LineSeries, do not display outlines.  Therefore, this property does not affect some charts.
    */
    get outline() {
        return brushToString(this.i.ko);
    }
    set outline(v) {
        this.i.ko = stringToBrush(v);
    }
    /**
     * Gets the series outline.
    */
    get actualOutline() {
        return brushToString(this.i.kj);
    }
    set actualOutline(v) {
        this.i.kj = stringToBrush(v);
    }
    /**
     * Gets or sets the AreaFillOpacity of the stacked fragment. This property only applies for area-like series.
    */
    get areaFillOpacity() {
        return this.i.bm;
    }
    set areaFillOpacity(v) {
        this.i.bm = +v;
    }
    /**
     * Gets the series ActualAreaFillOpacity.  This property only applies for area-like series.
    */
    get actualAreaFillOpacity() {
        return this.i.bb;
    }
    set actualAreaFillOpacity(v) {
        this.i.bb = +v;
    }
    /**
     * Gets or sets the opacity to use for the marker fills.
    */
    get markerFillOpacity() {
        return this.i.bw;
    }
    set markerFillOpacity(v) {
        this.i.bw = +v;
    }
    /**
     * Gets the actual opacity to use for hte marker fills.
    */
    get actualMarkerFillOpacity() {
        return this.i.bd;
    }
    set actualMarkerFillOpacity(v) {
        this.i.bd = +v;
    }
    /**
     * Gets or sets the outline mode to use for the fragment.
    */
    get outlineMode() {
        return this.i.ab;
    }
    set outlineMode(v) {
        this.i.ab = ensureEnum(SeriesOutlineMode_$type, v);
    }
    /**
     * Gets the actual outline mode to use for the fragment.
    */
    get actualOutlineMode() {
        return this.i.aa;
    }
    set actualOutlineMode(v) {
        this.i.aa = ensureEnum(SeriesOutlineMode_$type, v);
    }
    /**
     * Gets or sets the target opacity to fade to for fade style highlighting.
    */
    get highlightingFadeOpacity() {
        return this.i.bv;
    }
    set highlightingFadeOpacity(v) {
        this.i.bv = +v;
    }
    /**
     * Gets the actual target opacity to fade to for fade style highlighting.
    */
    get actualHighlightingFadeOpacity() {
        return this.i.bc;
    }
    set actualHighlightingFadeOpacity(v) {
        this.i.bc = +v;
    }
    /**
     * Gets the actual mode for displaying highlighted values.
    */
    get actualHighlightedValuesDisplayMode() {
        return this.i.z;
    }
    set actualHighlightedValuesDisplayMode(v) {
        this.i.z = ensureEnum(SeriesHighlightedValuesDisplayMode_$type, v);
    }
    /**
     * Gets or sets the x-radius of the ellipse that is used to round the corners of the column. This only applies to Bar and Column series.
    */
    get radiusX() {
        return this.i.bz;
    }
    set radiusX(v) {
        this.i.bz = +v;
    }
    /**
     * Gets the actual corner radius of the series
    */
    get actualRadiusX() {
        return this.i.bg;
    }
    set actualRadiusX(v) {
        this.i.bg = +v;
    }
    /**
     * Gets whether the spline part is considered to be part of the range
    */
    get actualIsSplineShapePartOfRange() {
        return this.i.an;
    }
    set actualIsSplineShapePartOfRange(v) {
        this.i.an = ensureBool(v);
    }
    /**
     * Gets or sets whether to include the spline shape in the axis range requested of the axis.
    */
    get isSplineShapePartOfRange() {
        return this.i.aw;
    }
    set isSplineShapePartOfRange(v) {
        this.i.aw = ensureBool(v);
    }
    /**
     * Gets or sets the y-radius of the ellipse that is used to round the corners of the column. This only applies to Bar and Column series.
    */
    get radiusY() {
        return this.i.b0;
    }
    set radiusY(v) {
        this.i.b0 = +v;
    }
    /**
     * Gets the actual corner radius of the series
    */
    get actualRadiusY() {
        return this.i.bh;
    }
    set actualRadiusY(v) {
        this.i.bh = +v;
    }
    /**
     * Gets or sets the width of the current series object's line thickness.
    */
    get thickness() {
        return this.i.b4;
    }
    set thickness(v) {
        this.i.b4 = +v;
    }
    /**
     * Gets or sets the thickness of this stacked fragment.
    */
    get actualThickness() {
        return this.i.bl;
    }
    set actualThickness(v) {
        this.i.bl = +v;
    }
    /**
     * Gets or sets the width of the current series object's marker thickness.
    */
    get markerThickness() {
        return this.i.bx;
    }
    set markerThickness(v) {
        this.i.bx = +v;
    }
    /**
     * Gets actual marker thickness of this stacked fragment.
    */
    get actualMarkerThickness() {
        return this.i.be;
    }
    set actualMarkerThickness(v) {
        this.i.be = +v;
    }
    /**
     * Gets or sets the Title property.
     * The legend item control is created according to the Title on-demand by
     * the series object itself.
    */
    get title() {
        return this.i.cj;
    }
    set title(v) {
        this.i.cj = v;
    }
    /**
     * Gets or sets the EasingFunction used to morph the current series.
    */
    get transitionEasingFunction() {
        return this.i.ai;
    }
    set transitionEasingFunction(v) {
        this.i.ai = v;
    }
    /**
     * Gets or sets the duration of the current series's morph.
    */
    get transitionDuration() {
        return this.i.cd;
    }
    set transitionDuration(v) {
        this.i.cd = +v;
    }
    /**
     * Gets or sets the duration of the current series's transition in morph.
    */
    get transitionInDuration() {
        return this.i.ce;
    }
    set transitionInDuration(v) {
        this.i.ce = +v;
    }
    /**
     * Gets or sets the EasingFunction used to morph the current series during the initial transition.
    */
    get transitionInEasingFunction() {
        return this.i.aj;
    }
    set transitionInEasingFunction(v) {
        this.i.aj = v;
    }
    /**
     * Gets or sets the method by which to animate the data into the chart when the chart data source is swapped.
     * Note: Transitions are not currently supported for stacked series.
    */
    get transitionInMode() {
        return this.i.n;
    }
    set transitionInMode(v) {
        this.i.n = ensureEnum(CategoryTransitionInMode_$type, v);
    }
    /**
     * Gets or sets whether the series should transition into the plot area when a new data source is assigned.
     * Note: Transitions are not currently supported for stacked series.
    */
    get isTransitionInEnabled() {
        return this.i.ax;
    }
    set isTransitionInEnabled(v) {
        this.i.ax = ensureBool(v);
    }
    /**
     * Gets or sets the duration of the current series's transition in morph.
    */
    get transitionInSpeedType() {
        return this.i.ae;
    }
    set transitionInSpeedType(v) {
        this.i.ae = ensureEnum(TransitionInSpeedType_$type, v);
    }
    /**
     * Gets the the resolved value of whether transition in is enabled.
    */
    get actualIsTransitionInEnabled() {
        return this.i.ao;
    }
    set actualIsTransitionInEnabled(v) {
        this.i.ao = ensureBool(v);
    }
    /**
     * Gets the resolved transition in duration
    */
    get actualTransitionInDuration() {
        return this.i.b7;
    }
    set actualTransitionInDuration(v) {
        this.i.b7 = +v;
    }
    /**
     * Gets the series transition easing function.
    */
    get actualTransitionInMode() {
        return this.i.m;
    }
    set actualTransitionInMode(v) {
        this.i.m = ensureEnum(CategoryTransitionInMode_$type, v);
    }
    /**
     * Gets the series transition easing function.
    */
    get actualTransitionInSpeedType() {
        return this.i.ad;
    }
    set actualTransitionInSpeedType(v) {
        this.i.ad = ensureEnum(TransitionInSpeedType_$type, v);
    }
    /**
     * Gets the series transition easing function.
    */
    get actualTransitionInEasingFunction() {
        return this.i.ah;
    }
    set actualTransitionInEasingFunction(v) {
        this.i.ah = v;
    }
    /**
     * Gets the series transition easing function.
    */
    get actualTransitionEasingFunction() {
        return this.i.ag;
    }
    set actualTransitionEasingFunction(v) {
        this.i.ag = v;
    }
    /**
     * Gets the series transition duration.
    */
    get actualTransitionDuration() {
        return this.i.b6;
    }
    set actualTransitionDuration(v) {
        this.i.b6 = +v;
    }
    /**
     * Gets or sets the value mapping property for the current series object.
    */
    get valueMemberPath() {
        return this.i.fk;
    }
    set valueMemberPath(v) {
        this.i.fk = v;
    }
    /**
     * Gets or sets the label displayed before series value in the Data Legend.
    */
    get valueMemberAsLegendLabel() {
        return this.i.fg;
    }
    set valueMemberAsLegendLabel(v) {
        this.i.fg = v;
    }
    /**
     * Gets or sets the unit displayed after series value in the Data Legend.
    */
    get valueMemberAsLegendUnit() {
        return this.i.fi;
    }
    set valueMemberAsLegendUnit(v) {
        this.i.fi = v;
    }
    /**
     * Gets the label displayed before series value in the Data Legend.
    */
    get actualValueMemberAsLegendLabel() {
        return this.i.dw;
    }
    set actualValueMemberAsLegendLabel(v) {
        this.i.dw = v;
    }
    /**
     * Gets the unit displayed after series value in the Data Legend.
    */
    get actualValueMemberAsLegendUnit() {
        return this.i.dy;
    }
    set actualValueMemberAsLegendUnit(v) {
        this.i.dy = v;
    }
    /**
     * Gets or sets the Visibility of the stacked fragment.
    */
    get visibility() {
        return this.i.lg;
    }
    set visibility(v) {
        this.i.lg = ensureEnum(Visibility_$type, v);
    }
    /**
     * Gets the actual visibility of the stacked fragment.
    */
    get actualVisibility() {
        return this.i.le;
    }
    set actualVisibility(v) {
        this.i.le = ensureEnum(Visibility_$type, v);
    }
    /**
     * Gets the resolved brush used between the local series and the parent series.
    */
    get parentOrLocalBrush() {
        return brushToString(this.i.kp);
    }
    set parentOrLocalBrush(v) {
        this.i.kp = stringToBrush(v);
    }
    findByName(name) {
        if (this.findEphemera) {
            if (name && name.indexOf("@@e:") == 0) {
                return this.findEphemera(name);
            }
        }
        return null;
    }
    get hasUserValues() {
        return this._hasUserValues;
    }
    __m(propertyName) {
        if (!this._inStyling) {
            this._hasUserValues.add(propertyName);
        }
    }
    _styling(container, component, parent) {
        if (this._inStyling) {
            return;
        }
        this._inStyling = true;
        this._stylingContainer = container;
        this._stylingParent = component;
        let genericPrefix = "";
        let typeName = this.i.$type.name;
        if (typeName.indexOf("Xam") === 0) {
            typeName = typeName.substring(3);
        }
        genericPrefix = toSpinal("StackedFragmentSeries");
        let additionalPrefixes = [];
        let prefix = toSpinal(typeName);
        additionalPrefixes.push(prefix + "-");
        let b = this.i.$type.baseType;
        while (b && b.name != "Object" &&
            b.name != "Base" &&
            b.name != "Control" &&
            b.Name != "DependencyObject" &&
            b.Name != "FrameworkElement") {
            typeName = b.name;
            if (typeName.indexOf("Xam") === 0) {
                typeName = typeName.substring(3);
            }
            let basePrefix = toSpinal(typeName);
            additionalPrefixes.push(basePrefix + "-");
            b = b.baseType;
        }
        if (parent) {
            let parentTypeName = parent.i.$type.name;
            if (parentTypeName.indexOf("Xam") === 0) {
                parentTypeName = parentTypeName.substring(3);
            }
            let parentPrefix = toSpinal(parentTypeName);
            additionalPrefixes.push(parentPrefix + "-" + genericPrefix + "-");
            additionalPrefixes.push(parentPrefix + "-" + prefix + "-");
        }
        initializePropertiesFromCss(container, this, genericPrefix + "-", this.hasUserValues, false, additionalPrefixes);
        if (this._otherStyling) {
            this._otherStyling(container, component, parent);
        }
        this._inStyling = false;
    }
    /**
 * Gets the item index associated with the specified world position

*/
    getItemIndex(world) {
        let iv = this.i.b8(toPoint(world));
        return (iv);
    }
    /**
     * Gets the item that is the best match for the specified world coordinates.
    
    * @param world  * The world coordinates to use.
    */
    getItem(world) {
        let iv = this.i.ch(toPoint(world));
        return (iv);
    }
    getPreviousOrExactIndex(world, skipUnknowns) {
        let iv = this.i.cb(toPoint(world), skipUnknowns);
        return (iv);
    }
    getNextOrExactIndex(world, skipUnknowns) {
        let iv = this.i.ca(toPoint(world), skipUnknowns);
        return (iv);
    }
    getSeriesValue(world, useInterpolation, skipUnknowns) {
        let iv = this.i.bt(toPoint(world), useInterpolation, skipUnknowns);
        return (iv);
    }
    getSeriesValuePosition(world, useInterpolation, skipUnknowns) {
        let iv = this.i.k3(toPoint(world), useInterpolation, skipUnknowns);
        return fromPoint(iv);
    }
    /**
     * If possible, will return the best available value bounding box within the series that has the best value match for the world position provided.
    
    * @param world  * The world coordinate for which to get a value bounding box for
    */
    getSeriesValueBoundingBox(world) {
        let iv = this.i.k7(toPoint(world));
        return fromRect(iv);
    }
    /**
     * If possible, will return the best available value marker bounding box within the series that has the best value match for the world position provided.
    
    * @param world  * The world coordinates for which to get a value marker bounding box for
    */
    getSeriesValueMarkerBoundingBox(world) {
        let iv = this.i.k9(toPoint(world));
        return fromRect(iv);
    }
    getSeriesHighValue(world, useInterpolation, skipUnknowns) {
        let iv = this.i.bp(toPoint(world), useInterpolation, skipUnknowns);
        return (iv);
    }
    getSeriesHighValuePosition(world, useInterpolation, skipUnknowns) {
        let iv = this.i.kz(toPoint(world), useInterpolation, skipUnknowns);
        return fromPoint(iv);
    }
    getSeriesLowValue(world, useInterpolation, skipUnknowns) {
        let iv = this.i.br(toPoint(world), useInterpolation, skipUnknowns);
        return (iv);
    }
    getSeriesLowValuePosition(world, useInterpolation, skipUnknowns) {
        let iv = this.i.k1(toPoint(world), useInterpolation, skipUnknowns);
        return fromPoint(iv);
    }
    getSeriesValuePositionFromSeriesPixel(mouse, useInterpolation, skipUnknowns) {
        let iv = this.i.k4(toPoint(mouse), useInterpolation, skipUnknowns);
        return fromPoint(iv);
    }
    getSeriesValueFromSeriesPixel(mouse, useInterpolation, skipUnknowns) {
        let iv = this.i.bu(toPoint(mouse), useInterpolation, skipUnknowns);
        return (iv);
    }
    /**
     * For a category plotted series, returns the current width of the items within the categories. This only returns a value if the items have some form of width (e.g. columns, bars, etc.) otherwise 0 is returned.
    
    */
    getItemSpan() {
        let iv = this.i.bo();
        return (iv);
    }
    /**
     * Converts a point from coordinates within the series plot area to a world position within axis space.
    
    * @param seriesPoint  * The pixel location within the plot area of the series.
    */
    toWorldPosition(seriesPoint) {
        let iv = this.i.k5(toPoint(seriesPoint));
        return fromPoint(iv);
    }
    /**
     * Converts a point from world coordinates to coordinates within the viewport of the series.
    
    * @param world  * The world position from which to convert.
    */
    fromWorldPosition(world) {
        let iv = this.i.ky(toPoint(world));
        return fromPoint(iv);
    }
    /**
     * Requests that the provided item should be brought into view if possible.
    
    * @param item  * The item to attempt to bring into view.
    */
    scrollIntoView(item) {
        let iv = this.i.a0(item);
        return (iv);
    }
    /**
     * Gets the effective viewport, adjusted to account for margins and other factors.
    
    */
    getEffectiveViewport() {
        let iv = this.i.k6();
        return fromRect(iv);
    }
    /**
     * Notifies the series that a visual property has changed, requiring a visual update.
    
    */
    notifyVisualPropertiesChanged() {
        this.i.fo();
    }
    /**
     * Simulates a pointer hover over the series surface.
    
    * @param point  * The pointer position relative to the series viewport over which to hover.
    */
    simulateHover(point) {
        this.i.ft(toPoint(point));
    }
    /**
     * Moves the cursor point to the provided world position. Some series may react to the current cursor position.
    
    * @param point  * The cursor point, in world coordinates.
    */
    moveCursorPoint(point) {
        this.i.fn(toPoint(point));
    }
    replayTransitionIn() {
        this.i.fs();
    }
    /**
     * Event raised when a property (including "effective" and non-dependency property) value changes.
    */
    get propertyUpdated() {
        return this._propertyUpdated;
    }
    set propertyUpdated(ev) {
        if (this._propertyUpdated_wrapped !== null) {
            this.i.propertyUpdated = delegateRemove(this.i.propertyUpdated, this._propertyUpdated_wrapped);
            this._propertyUpdated_wrapped = null;
            this._propertyUpdated = null;
        }
        this._propertyUpdated = ev;
        this._propertyUpdated_wrapped = (o, e) => {
            let outerArgs = new IgrPropertyUpdatedEventArgs();
            outerArgs._provideImplementation(e);
            if (this.beforePropertyUpdated) {
                this.beforePropertyUpdated(this, outerArgs);
            }
            if (this._propertyUpdated) {
                this._propertyUpdated(this, outerArgs);
            }
        };
        this.i.propertyUpdated = delegateCombine(this.i.propertyUpdated, this._propertyUpdated_wrapped);
        ;
    }
}
