import { ensureEnum, brushToString, stringToBrush, ensureBool, initializePropertiesFromCss, NamePatcher, toSpinal, enumToString, getAllPropertyNames, fromSpinal } from "igniteui-webcomponents-core";
import { FontInfo } from "igniteui-webcomponents-core";
import { WebComponentRenderer, PortalManager } from "igniteui-webcomponents-core";
import { delegateCombine, delegateRemove } from "igniteui-webcomponents-core";
import { RegisterElementHelper } from "igniteui-webcomponents-core";
import { MultiColumnComboBox } from "./MultiColumnComboBox";
import { BaseControlTheme_$type } from "igniteui-webcomponents-core";
import { ControlDisplayDensity_$type } from "igniteui-webcomponents-core";
import { SortMode_$type } from './SortMode';
import { CornerRadius } from "igniteui-webcomponents-core";
import { Thickness } from "igniteui-webcomponents-core";
import { IgcMultiColumnComboBoxTextChangedEventArgs } from './igc-multi-column-combo-box-text-changed-event-args';
import { IgcMultiColumnComboBoxValueChangedEventArgs } from './igc-multi-column-combo-box-value-changed-event-args';
import { IgcGotFocusEventArgs } from './igc-got-focus-event-args';
import { IgcLostFocusEventArgs } from './igc-lost-focus-event-args';
import { IgcHTMLElement } from "igniteui-webcomponents-core";
import { IgcKeyEventArgs } from "igniteui-webcomponents-core";
import { IgcInputChangeEventArgs } from "igniteui-webcomponents-inputs";
import { IgcColumnWidth } from './igc-column-width';
import { ColumnWidth as ColumnWidth_internal } from './ColumnWidth';
export let IgcMultiColumnComboBoxComponent = /*@__PURE__*/ (() => {
    class IgcMultiColumnComboBoxComponent extends IgcHTMLElement {
        constructor() {
            super();
            this._implementation = null;
            this._disconnected = false;
            this._settingAttributes = false;
            this._attached = false;
            this._queuedSetAttributes = [];
            this._updatingFromAttribute = false;
            this.__p = null;
            this._hasUserValues = new Set();
            this._stylingContainer = null;
            this._stylingParent = null;
            this._inStyling = false;
            this._gotFocus = null;
            this._gotFocus_wrapped = null;
            this._lostFocus = null;
            this._lostFocus_wrapped = null;
            this._textChanged = null;
            this._textChanged_wrapped = null;
            this._valueChanged = null;
            this._valueChanged_wrapped = null;
            this._keyDown = null;
            this._keyDown_wrapped = null;
            this._change = null;
            this._change_wrapped = null;
            this._changing = null;
            this._changing_wrapped = null;
            if (this._styling) {
                NamePatcher.ensureStylablePatched(Object.getPrototypeOf(this));
            }
            this._implementation = this.createImplementation();
            this._implementation.externalObject = this;
            this._portalManager = new PortalManager("multiColumnComboBoxContent");
            this._webComponentRenderer = new WebComponentRenderer(this, document, true, {}, this._portalManager);
            this._webComponentWrapper = this._webComponentRenderer.createElement("div");
            this._webComponentRenderer.updateRoot(this._webComponentWrapper);
            this._webComponentWrapper.setStyleProperty("display", "block");
            this._webComponentWrapper.setStyleProperty("width", "100%");
            this._webComponentWrapper.setStyleProperty("height", "100%");
            this.i.provideRenderer(this._webComponentRenderer);
            this.i.notifySizeChanged();
            this._webComponentRenderer.addSizeWatcher(() => {
                this.i.notifySizeChanged();
            });
        }
        set height(value) {
            this._height = value;
            this.style.height = value;
            this.i.notifySizeChanged();
        }
        get height() {
            return this._height;
        }
        set width(value) {
            this._width = value;
            this.style.width = value;
            this.i.notifySizeChanged();
        }
        get width() {
            return this._width;
        }
        // supports angular themes or custom properties set in CSS
        updateStyle() {
            this._styling(this, this);
        }
        destroy() {
            this._implementation.destroy();
            this._webComponentRenderer.destroy();
        }
        createImplementation() {
            return new MultiColumnComboBox();
        }
        get i() {
            return this._implementation;
        }
        disconnectedCallback() {
            this._disconnected = true;
        }
        connectedCallback() {
            if (this._disconnected) {
                this._disconnected = false;
                return;
            }
            this.classList.add("ig-multi-column-combo-box");
            this.classList.add("igc-multi-column-combo-box");
            var rootWrapper = this._webComponentRenderer.rootWrapper;
            var rootElement = rootWrapper.getNativeElement();
            this.appendChild(rootElement);
            this._attached = true;
            this.style.display = "block";
            this.style.height = this._height;
            this.style.width = this._width;
            this._flushQueuedAttributes();
            // supports themes or custom properties set in CSS
            this._styling(this, this);
            this.afterContentInit();
        }
        afterContentInit() {
            this.i.notifySizeChanged();
        }
        /**
         * Gets or sets the default column width to use if a column as no local width.
         * */
        get defaultColumnWidth() {
            let ext = this.i.defaultColumnWidth.externalObject;
            if (!ext) {
                ext = new IgcColumnWidth();
                ext._implementation = this.i.defaultColumnWidth;
            }
            return ext;
        }
        set defaultColumnWidth(value) {
            if (typeof value == "string") {
                let int = ColumnWidth_internal.parse(value);
                let ext = new IgcColumnWidth();
                ext._implementation = int;
                value = ext;
            }
            this.i.defaultColumnWidth = value.i;
        }
        _enqueueSetAttribute(attrName, attrValue) {
            this._queuedSetAttributes.push({ attrName: attrName, attrValue: attrValue });
        }
        _flushQueuedAttributes() {
            this._settingAttributes = true;
            for (let i = 0; i < this._queuedSetAttributes.length; i++) {
                this.setAttribute(this._queuedSetAttributes[i].attrName, this._queuedSetAttributes[i].attrValue);
            }
            this._settingAttributes = false;
            this._queuedSetAttributes.length = 0;
        }
        _a(attrName, attrValue) {
            if (this._updatingFromAttribute) {
                return;
            }
            if (attrValue) {
                attrValue = attrValue.toString();
            }
            this._settingAttributes = true;
            attrName = toSpinal(attrName);
            if (this._attached) {
                this.setAttribute(attrName, attrValue);
            }
            else {
                this._enqueueSetAttribute(attrName, attrValue);
            }
            this._settingAttributes = false;
        }
        static get observedAttributes() {
            if (IgcMultiColumnComboBoxComponent._observedAttributesIgcMultiColumnComboBoxComponent == null) {
                let names = getAllPropertyNames(IgcMultiColumnComboBoxComponent);
                for (let i = 0; i < names.length; i++) {
                    names[i] = toSpinal(names[i]);
                }
                IgcMultiColumnComboBoxComponent._observedAttributesIgcMultiColumnComboBoxComponent = names;
            }
            return IgcMultiColumnComboBoxComponent._observedAttributesIgcMultiColumnComboBoxComponent;
        }
        attributeChangedCallback(name, oldValue, newValue) {
            if (this._settingAttributes) {
                return;
            }
            let setName = fromSpinal(name);
            this._updatingFromAttribute = true;
            this[setName] = newValue;
            this._updatingFromAttribute = false;
        }
        static register() {
            if (!IgcMultiColumnComboBoxComponent._isElementRegistered) {
                IgcMultiColumnComboBoxComponent._isElementRegistered = true;
                RegisterElementHelper.registerElement(IgcMultiColumnComboBoxComponent.htmlTagName, IgcMultiColumnComboBoxComponent);
            }
        }
        /**
     * Gets or sets the ShowClearButton property to detirmine if the clear button is shown
    */
        get showClearButton() {
            return this.i.be;
        }
        set showClearButton(v) {
            this.i.be = ensureBool(v);
            this._a("showClearButton", this.i.be);
        }
        /**
         * Gets or sets the desired properties for the data source to load. If specified the data source may decide to constrain the properties it fetches to these properties and must make sure that at least those properties are loaded, rather than the default behavior for that data source.
        */
        get fields() {
            return this.i.g;
        }
        set fields(v) {
            this.i.g = v;
        }
        /**
         * Gets or sets the background color to use for the input group.
        */
        get backgroundColor() {
            return brushToString(this.i.hd);
        }
        set backgroundColor(v) {
            this.i.hd = stringToBrush(v);
            this._a("backgroundColor", brushToString(this.i.hd));
        }
        /**
         * Gets the actual opacity to use for the underline ripple element.
        */
        get actualBackgroundColor() {
            return brushToString(this.i.g2);
        }
        set actualBackgroundColor(v) {
            this.i.g2 = stringToBrush(v);
            this._a("actualBackgroundColor", brushToString(this.i.g2));
        }
        /**
         * Gets or sets the base built in theme to use for the component.
        */
        get baseTheme() {
            return this.i.ac;
        }
        set baseTheme(v) {
            this.i.ac = ensureEnum(BaseControlTheme_$type, v);
            this._a("baseTheme", enumToString(BaseControlTheme_$type, this.i.ac));
        }
        /**
         * Gets the actual display baseTheme to use for the component.
        */
        get actualBaseTheme() {
            return this.i.ab;
        }
        set actualBaseTheme(v) {
            this.i.ab = ensureEnum(BaseControlTheme_$type, v);
            this._a("actualBaseTheme", enumToString(BaseControlTheme_$type, this.i.ab));
        }
        /**
         * Gets or sets the color to use the border of the input group.
        */
        get borderColor() {
            return brushToString(this.i.he);
        }
        set borderColor(v) {
            this.i.he = stringToBrush(v);
            this._a("borderColor", brushToString(this.i.he));
        }
        /**
         * Gets the actual item background color.
        */
        get actualBorderColor() {
            return brushToString(this.i.g3);
        }
        set actualBorderColor(v) {
            this.i.g3 = stringToBrush(v);
            this._a("actualBorderColor", brushToString(this.i.g3));
        }
        /**
         * Gets or sets the border width to use for the border of the item group.
        */
        get borderWidth() {
            return this.i.b9;
        }
        set borderWidth(v) {
            this.i.b9 = +v;
            this._a("borderWidth", this.i.b9);
        }
        /**
         * Gets the actual item border width.
        */
        get actualBorderWidth() {
            return this.i.bz;
        }
        set actualBorderWidth(v) {
            this.i.bz = +v;
            this._a("actualBorderWidth", this.i.bz);
        }
        /**
         * Gets or sets the visibility of the drop down button.
        */
        get columnHeadersVisible() {
            return this.i.columnHeadersVisible;
        }
        set columnHeadersVisible(v) {
            this.i.columnHeadersVisible = ensureBool(v);
            this._a("columnHeadersVisible", this.i.columnHeadersVisible);
        }
        get contentPaddingBottom() {
            return this.i.h2 ? this.i.h2.b : NaN;
        }
        set contentPaddingBottom(v) {
            this.ensureContentPadding();
            this.i.h2.b = +v;
            this._a("contentPaddingBottom", this.i.h2.b);
            this.i.h2 = this.i.h2;
        }
        get contentPaddingLeft() {
            return this.i.h2 ? this.i.h2.c : NaN;
        }
        set contentPaddingLeft(v) {
            this.ensureContentPadding();
            this.i.h2.c = +v;
            this._a("contentPaddingLeft", this.i.h2.c);
            this.i.h2 = this.i.h2;
        }
        get contentPaddingRight() {
            return this.i.h2 ? this.i.h2.d : NaN;
        }
        set contentPaddingRight(v) {
            this.ensureContentPadding();
            this.i.h2.d = +v;
            this._a("contentPaddingRight", this.i.h2.d);
            this.i.h2 = this.i.h2;
        }
        get contentPaddingTop() {
            return this.i.h2 ? this.i.h2.e : NaN;
        }
        set contentPaddingTop(v) {
            this.ensureContentPadding();
            this.i.h2.e = +v;
            this._a("contentPaddingTop", this.i.h2.e);
            this.i.h2 = this.i.h2;
        }
        ensureContentPadding() {
            if (this.i.h2) {
                return;
            }
            this.i.h2 = new Thickness(2);
        }
        get actualContentPaddingBottom() {
            return this.i.h1 ? this.i.h1.b : NaN;
        }
        set actualContentPaddingBottom(v) {
            this.ensureActualContentPadding();
            this.i.h1.b = +v;
            this._a("actualContentPaddingBottom", this.i.h1.b);
            this.i.h1 = this.i.h1;
        }
        get actualContentPaddingLeft() {
            return this.i.h1 ? this.i.h1.c : NaN;
        }
        set actualContentPaddingLeft(v) {
            this.ensureActualContentPadding();
            this.i.h1.c = +v;
            this._a("actualContentPaddingLeft", this.i.h1.c);
            this.i.h1 = this.i.h1;
        }
        get actualContentPaddingRight() {
            return this.i.h1 ? this.i.h1.d : NaN;
        }
        set actualContentPaddingRight(v) {
            this.ensureActualContentPadding();
            this.i.h1.d = +v;
            this._a("actualContentPaddingRight", this.i.h1.d);
            this.i.h1 = this.i.h1;
        }
        get actualContentPaddingTop() {
            return this.i.h1 ? this.i.h1.e : NaN;
        }
        set actualContentPaddingTop(v) {
            this.ensureActualContentPadding();
            this.i.h1.e = +v;
            this._a("actualContentPaddingTop", this.i.h1.e);
            this.i.h1 = this.i.h1;
        }
        ensureActualContentPadding() {
            if (this.i.h1) {
                return;
            }
            this.i.h1 = new Thickness(2);
        }
        get cornerRadiusBottomRight() {
            return this.i.ge ? this.i.ge.b : NaN;
        }
        set cornerRadiusBottomRight(v) {
            this.ensureCornerRadius();
            this.i.ge.b = +v;
            this._a("cornerRadiusBottomRight", this.i.ge.b);
            this.i.ge = this.i.ge;
        }
        get cornerRadiusBottomLeft() {
            return this.i.ge ? this.i.ge.a : NaN;
        }
        set cornerRadiusBottomLeft(v) {
            this.ensureCornerRadius();
            this.i.ge.a = +v;
            this._a("cornerRadiusBottomLeft", this.i.ge.a);
            this.i.ge = this.i.ge;
        }
        get cornerRadiusTopLeft() {
            return this.i.ge ? this.i.ge.c : NaN;
        }
        set cornerRadiusTopLeft(v) {
            this.ensureCornerRadius();
            this.i.ge.c = +v;
            this._a("cornerRadiusTopLeft", this.i.ge.c);
            this.i.ge = this.i.ge;
        }
        get cornerRadiusTopRight() {
            return this.i.ge ? this.i.ge.d : NaN;
        }
        set cornerRadiusTopRight(v) {
            this.ensureCornerRadius();
            this.i.ge.d = +v;
            this._a("cornerRadiusTopRight", this.i.ge.d);
            this.i.ge = this.i.ge;
        }
        ensureCornerRadius() {
            if (this.i.ge) {
                return;
            }
            this.i.ge = new CornerRadius(2);
        }
        get actualCornerRadiusBottomRight() {
            return this.i.gd ? this.i.gd.b : NaN;
        }
        set actualCornerRadiusBottomRight(v) {
            this.ensureActualCornerRadius();
            this.i.gd.b = +v;
            this._a("actualCornerRadiusBottomRight", this.i.gd.b);
            this.i.gd = this.i.gd;
        }
        get actualCornerRadiusBottomLeft() {
            return this.i.gd ? this.i.gd.a : NaN;
        }
        set actualCornerRadiusBottomLeft(v) {
            this.ensureActualCornerRadius();
            this.i.gd.a = +v;
            this._a("actualCornerRadiusBottomLeft", this.i.gd.a);
            this.i.gd = this.i.gd;
        }
        get actualCornerRadiusTopLeft() {
            return this.i.gd ? this.i.gd.c : NaN;
        }
        set actualCornerRadiusTopLeft(v) {
            this.ensureActualCornerRadius();
            this.i.gd.c = +v;
            this._a("actualCornerRadiusTopLeft", this.i.gd.c);
            this.i.gd = this.i.gd;
        }
        get actualCornerRadiusTopRight() {
            return this.i.gd ? this.i.gd.d : NaN;
        }
        set actualCornerRadiusTopRight(v) {
            this.ensureActualCornerRadius();
            this.i.gd.d = +v;
            this._a("actualCornerRadiusTopRight", this.i.gd.d);
            this.i.gd = this.i.gd;
        }
        ensureActualCornerRadius() {
            if (this.i.gd) {
                return;
            }
            this.i.gd = new CornerRadius(2);
        }
        /**
         * Gets or sets the desired properties for the data source to load. If specified the data source may decide to constrain the properties it fetches to these properties and must make sure that at least those properties are loaded, rather than the default behavior for that data source.
        */
        get dataSourceDesiredProperties() {
            return this.i.f;
        }
        set dataSourceDesiredProperties(v) {
            this.i.f = v;
        }
        /**
         * Gets or sets the display Density to use for the buttons and dropdown grid.
        */
        get density() {
            return this.i.density;
        }
        set density(v) {
            this.i.density = ensureEnum(ControlDisplayDensity_$type, v);
            this._a("density", enumToString(ControlDisplayDensity_$type, this.i.density));
        }
        /**
         * Gets the actual display Density to use for the component.
        */
        get actualDensity() {
            return this.i.ag;
        }
        set actualDensity(v) {
            this.i.ag = ensureEnum(ControlDisplayDensity_$type, v);
            this._a("actualDensity", enumToString(ControlDisplayDensity_$type, this.i.ag));
        }
        /**
         * Gets or sets the visibility of the drop down button.
        */
        get dropDownButtonVisible() {
            return this.i.dropDownButtonVisible;
        }
        set dropDownButtonVisible(v) {
            this.i.dropDownButtonVisible = ensureBool(v);
            this._a("dropDownButtonVisible", this.i.dropDownButtonVisible);
        }
        /**
         * Gets or sets the color to use the hovered background of the inputs in the group.
        */
        get focusBorderColor() {
            return brushToString(this.i.hq);
        }
        set focusBorderColor(v) {
            this.i.hq = stringToBrush(v);
            this._a("focusBorderColor", brushToString(this.i.hq));
        }
        /**
         * Gets the actual item border color.
        */
        get actualFocusBorderColor() {
            return brushToString(this.i.g4);
        }
        set actualFocusBorderColor(v) {
            this.i.g4 = stringToBrush(v);
            this._a("actualFocusBorderColor", brushToString(this.i.g4));
        }
        /**
         * Gets or sets the border width to use for the border of the item group when focused.
        */
        get focusBorderWidth() {
            return this.i.cl;
        }
        set focusBorderWidth(v) {
            this.i.cl = +v;
            this._a("focusBorderWidth", this.i.cl);
        }
        /**
         * Gets the actual item border width.
        */
        get actualFocusBorderWidth() {
            return this.i.b0;
        }
        set actualFocusBorderWidth(v) {
            this.i.b0 = +v;
            this._a("actualFocusBorderWidth", this.i.b0);
        }
        /**
         * Gets or sets the color to use for the underline element.
        */
        get focusUnderlineColor() {
            return brushToString(this.i.hr);
        }
        set focusUnderlineColor(v) {
            this.i.hr = stringToBrush(v);
            this._a("focusUnderlineColor", brushToString(this.i.hr));
        }
        /**
         * Gets the actual color to use for the underline element when focused.
        */
        get actualFocusUnderlineColor() {
            return brushToString(this.i.g5);
        }
        set actualFocusUnderlineColor(v) {
            this.i.g5 = stringToBrush(v);
            this._a("actualFocusUnderlineColor", brushToString(this.i.g5));
        }
        /**
         * Gets or sets the color to use for the underline element.
        */
        get focusUnderlineOpacity() {
            return this.i.cm;
        }
        set focusUnderlineOpacity(v) {
            this.i.cm = +v;
            this._a("focusUnderlineOpacity", this.i.cm);
        }
        /**
         * Gets the actual opacity to use for the underline element when focused.
        */
        get actualFocusUnderlineOpacity() {
            return this.i.b1;
        }
        set actualFocusUnderlineOpacity(v) {
            this.i.b1 = +v;
            this._a("actualFocusUnderlineOpacity", this.i.b1);
        }
        /**
         * Gets or sets the opacity to use for the underline ripple element when focused.
        */
        get focusUnderlineRippleOpacity() {
            return this.i.cn;
        }
        set focusUnderlineRippleOpacity(v) {
            this.i.cn = +v;
            this._a("focusUnderlineRippleOpacity", this.i.cn);
        }
        /**
         * Gets the actual opacity to use for the underline ripple element when focused.
        */
        get actualFocusUnderlineRippleOpacity() {
            return this.i.b2;
        }
        set actualFocusUnderlineRippleOpacity(v) {
            this.i.b2 = +v;
            this._a("actualFocusUnderlineRippleOpacity", this.i.b2);
        }
        /**
         * Gets or sets the color to use for the underline element.
        */
        get hoverUnderlineColor() {
            return brushToString(this.i.hs);
        }
        set hoverUnderlineColor(v) {
            this.i.hs = stringToBrush(v);
            this._a("hoverUnderlineColor", brushToString(this.i.hs));
        }
        /**
         * Gets the actual color to use for the underline element.
        */
        get actualHoverUnderlineColor() {
            return brushToString(this.i.g6);
        }
        set actualHoverUnderlineColor(v) {
            this.i.g6 = stringToBrush(v);
            this._a("actualHoverUnderlineColor", brushToString(this.i.g6));
        }
        /**
         * Gets or sets the color to use for the underline element.
        */
        get hoverUnderlineOpacity() {
            return this.i.co;
        }
        set hoverUnderlineOpacity(v) {
            this.i.co = +v;
            this._a("hoverUnderlineOpacity", this.i.co);
        }
        /**
         * Gets the actual opacity to use for the underline element when hovered.
        */
        get actualHoverUnderlineOpacity() {
            return this.i.b3;
        }
        set actualHoverUnderlineOpacity(v) {
            this.i.b3 = +v;
            this._a("actualHoverUnderlineOpacity", this.i.b3);
        }
        /**
         * Gets or sets the width to use for the underline element when hovered.
        */
        get hoverUnderlineWidth() {
            return this.i.cp;
        }
        set hoverUnderlineWidth(v) {
            this.i.cp = +v;
            this._a("hoverUnderlineWidth", this.i.cp);
        }
        /**
         * Gets the width to use for the underline element when hovered.
        */
        get actualHoverUnderlineWidth() {
            return this.i.b4;
        }
        set actualHoverUnderlineWidth(v) {
            this.i.b4 = +v;
            this._a("actualHoverUnderlineWidth", this.i.b4);
        }
        /**
         * Gets or sets the data to which to bind the combo box list. This can be some type of array or list, or it can
         * be an IDataSource instance.
        */
        get dataSource() {
            return this.i.itemsSource;
        }
        set dataSource(v) {
            this.i.itemsSource = v;
        }
        /**
         * Gets the actual data source that is being used by the combo box list. If a collection was provided for the combo box data, an implicit LocalDataSource has been created, and this is available via this property.
        */
        get actualDataSource() {
            return this.i.actualDataSource;
        }
        /**
         * The text displayed in the label portion of the control.
        */
        get label() {
            return this.i.ev;
        }
        set label(v) {
            this.i.ev = v;
        }
        /**
         * Gets or sets the color to use for the text.
        */
        get labelTextColor() {
            return brushToString(this.i.ht);
        }
        set labelTextColor(v) {
            this.i.ht = stringToBrush(v);
            this._a("labelTextColor", brushToString(this.i.ht));
        }
        /**
         * Gets the actual color to use for the text color.
        */
        get actualLabelTextColor() {
            return brushToString(this.i.g7);
        }
        set actualLabelTextColor(v) {
            this.i.g7 = stringToBrush(v);
            this._a("actualLabelTextColor", brushToString(this.i.g7));
        }
        /**
         * Gets or sets the font to use for the combobox.
        */
        get labelTextStyle() {
            if (this.i.az == null) {
                return null;
            }
            return this.i.az.fontString;
        }
        set labelTextStyle(v) {
            let fi = new FontInfo();
            fi.fontString = v;
            this.i.az = fi;
            this._a("labelTextStyle", this.i.az != null ? this.i.az.fontString : "");
        }
        /**
         * Gets or sets the visibility of the label.
        */
        get actualLabelVisible() {
            return this.i.actualLabelVisible;
        }
        set actualLabelVisible(v) {
            this.i.actualLabelVisible = ensureBool(v);
            this._a("actualLabelVisible", this.i.actualLabelVisible);
        }
        /**
         * Gets or sets the text to display on the list when no suggested matches are found.
        */
        get noMatchesFoundLabel() {
            return this.i.e1;
        }
        set noMatchesFoundLabel(v) {
            this.i.e1 = v;
        }
        /**
         * Gets the actual text to display on the list when no suggested matches are found.
        */
        get actualNoMatchesFoundLabel() {
            return this.i.actualNoMatchesFoundLabel;
        }
        set actualNoMatchesFoundLabel(v) {
            this.i.actualNoMatchesFoundLabel = v;
        }
        /**
         * Gets or sets the color to use for the "no matches found" label.
        */
        get noMatchesFoundLabelBackgroundColor() {
            return brushToString(this.i.hu);
        }
        set noMatchesFoundLabelBackgroundColor(v) {
            this.i.hu = stringToBrush(v);
            this._a("noMatchesFoundLabelBackgroundColor", brushToString(this.i.hu));
        }
        /**
         * Gets the actual color to use for the "no matches found" label.
        */
        get actualNoMatchesFoundLabelBackgroundColor() {
            return brushToString(this.i.g8);
        }
        set actualNoMatchesFoundLabelBackgroundColor(v) {
            this.i.g8 = stringToBrush(v);
            this._a("actualNoMatchesFoundLabelBackgroundColor", brushToString(this.i.g8));
        }
        /**
         * Gets or sets the color to use for the "no matches found" label.
        */
        get noMatchesFoundLabelTextColor() {
            return brushToString(this.i.hv);
        }
        set noMatchesFoundLabelTextColor(v) {
            this.i.hv = stringToBrush(v);
            this._a("noMatchesFoundLabelTextColor", brushToString(this.i.hv));
        }
        /**
         * Gets the actual color to use for the "no matches found" label.
        */
        get actualNoMatchesFoundLabelTextColor() {
            return brushToString(this.i.g9);
        }
        set actualNoMatchesFoundLabelTextColor(v) {
            this.i.g9 = stringToBrush(v);
            this._a("actualNoMatchesFoundLabelTextColor", brushToString(this.i.g9));
        }
        /**
         * Gets or sets the font to use for the combobox.
        */
        get noMatchesFoundLabelTextStyle() {
            if (this.i.a0 == null) {
                return null;
            }
            return this.i.a0.fontString;
        }
        set noMatchesFoundLabelTextStyle(v) {
            let fi = new FontInfo();
            fi.fontString = v;
            this.i.a0 = fi;
            this._a("noMatchesFoundLabelTextStyle", this.i.a0 != null ? this.i.a0.fontString : "");
        }
        /**
         * Placeholder text which gives the user a hint about what kind of text is expected.
        */
        get placeholder() {
            return this.i.e6;
        }
        set placeholder(v) {
            this.i.e6 = v;
        }
        /**
         * Gets or sets the visibility of the row separators in the drop down.
        */
        get rowSeparatorsVisible() {
            return this.i.rowSeparatorsVisible;
        }
        set rowSeparatorsVisible(v) {
            this.i.rowSeparatorsVisible = ensureBool(v);
            this._a("rowSeparatorsVisible", this.i.rowSeparatorsVisible);
        }
        /**
         * Gets or sets the color to use for the text.
        */
        get textColor() {
            return brushToString(this.i.hw);
        }
        set textColor(v) {
            this.i.hw = stringToBrush(v);
            this._a("textColor", brushToString(this.i.hw));
        }
        /**
         * Gets the actual color to use for the text color.
        */
        get actualTextColor() {
            return brushToString(this.i.ha);
        }
        set actualTextColor(v) {
            this.i.ha = stringToBrush(v);
            this._a("actualTextColor", brushToString(this.i.ha));
        }
        /**
         * Gets or sets the font to use for the combobox.
        */
        get textStyle() {
            if (this.i.a1 == null) {
                return null;
            }
            return this.i.a1.fontString;
        }
        set textStyle(v) {
            let fi = new FontInfo();
            fi.fontString = v;
            this.i.a1 = fi;
            this._a("textStyle", this.i.a1 != null ? this.i.a1.fontString : "");
        }
        /**
         * Gets or sets the color to use for the underline element.
        */
        get underlineColor() {
            return brushToString(this.i.hx);
        }
        set underlineColor(v) {
            this.i.hx = stringToBrush(v);
            this._a("underlineColor", brushToString(this.i.hx));
        }
        /**
         * Gets the actual color to use for the underline element.
        */
        get actualUnderlineColor() {
            return brushToString(this.i.hb);
        }
        set actualUnderlineColor(v) {
            this.i.hb = stringToBrush(v);
            this._a("actualUnderlineColor", brushToString(this.i.hb));
        }
        /**
         * Gets or sets the color to use for the underline element.
        */
        get underlineOpacity() {
            return this.i.cq;
        }
        set underlineOpacity(v) {
            this.i.cq = +v;
            this._a("underlineOpacity", this.i.cq);
        }
        /**
         * Gets the actual opacity to use for the underline element.
        */
        get actualUnderlineOpacity() {
            return this.i.b5;
        }
        set actualUnderlineOpacity(v) {
            this.i.b5 = +v;
            this._a("actualUnderlineOpacity", this.i.b5);
        }
        /**
         * Gets or sets the color to use for the underline ripple element.
        */
        get underlineRippleColor() {
            return brushToString(this.i.hy);
        }
        set underlineRippleColor(v) {
            this.i.hy = stringToBrush(v);
            this._a("underlineRippleColor", brushToString(this.i.hy));
        }
        /**
         * Gets the actual color to use for the underline ripple element.
        */
        get actualUnderlineRippleColor() {
            return brushToString(this.i.hc);
        }
        set actualUnderlineRippleColor(v) {
            this.i.hc = stringToBrush(v);
            this._a("actualUnderlineRippleColor", brushToString(this.i.hc));
        }
        /**
         * Gets or sets the opacity to use for the underline ripple element.
        */
        get underlineRippleOpacity() {
            return this.i.cr;
        }
        set underlineRippleOpacity(v) {
            this.i.cr = +v;
            this._a("underlineRippleOpacity", this.i.cr);
        }
        /**
         * Gets the actual opacity to use for the underline ripple element.
        */
        get actualUnderlineRippleOpacity() {
            return this.i.b6;
        }
        set actualUnderlineRippleOpacity(v) {
            this.i.b6 = +v;
            this._a("actualUnderlineRippleOpacity", this.i.b6);
        }
        /**
         * Gets or sets the width to use for the underline element.
        */
        get underlineRippleWidth() {
            return this.i.cs;
        }
        set underlineRippleWidth(v) {
            this.i.cs = +v;
            this._a("underlineRippleWidth", this.i.cs);
        }
        /**
         * Gets the actual width to use for the underline element.
        */
        get actualUnderlineRippleWidth() {
            return this.i.b7;
        }
        set actualUnderlineRippleWidth(v) {
            this.i.b7 = +v;
            this._a("actualUnderlineRippleWidth", this.i.b7);
        }
        /**
         * Gets or sets the width to use for the underline element.
        */
        get underlineWidth() {
            return this.i.ct;
        }
        set underlineWidth(v) {
            this.i.ct = +v;
            this._a("underlineWidth", this.i.ct);
        }
        /**
         * Gets the actual width to use for the underline element.
        */
        get actualUnderlineWidth() {
            return this.i.b8;
        }
        set actualUnderlineWidth(v) {
            this.i.b8 = +v;
            this._a("actualUnderlineWidth", this.i.b8);
        }
        /**
         * Whether to allow filtering of the combo
        */
        get allowFilter() {
            return this.i.a7;
        }
        set allowFilter(v) {
            this.i.a7 = ensureBool(v);
            this._a("allowFilter", this.i.a7);
        }
        /**
         * Returns/sets the action to take when a column header is clicked.
        */
        get sortMode() {
            return this.i.x;
        }
        set sortMode(v) {
            this.i.x = ensureEnum(SortMode_$type, v);
            this._a("sortMode", enumToString(SortMode_$type, this.i.x));
        }
        /**
         * Determines the name of the field in the data source will be used as the Text of the MultiColumnComboBox.
        */
        get textField() {
            return this.i.fe;
        }
        set textField(v) {
            this.i.fe = v;
        }
        /**
         * The text displayed in the edit portion of the control.
        */
        get text() {
            return this.i.fc;
        }
        set text(v) {
            this.i.fc = v;
        }
        /**
         * Sets or gets the user provided primary key to assume for the data. Certain functionality of the combo (such as the the current Value) requires
         * a way to uniquely identify items in order to work correctly.
         * If a primary key cannot be inferred from the data source, you may need to provide one here.
        */
        get valueField() {
            return this.i.j;
        }
        set valueField(v) {
            this.i.j = v;
        }
        /**
         * Gets the actual name of the field in the data source will be used as the Value of the MultiColumnComboBox.
        */
        get actualValueField() {
            return this.i.e;
        }
        set actualValueField(v) {
            this.i.e = v;
        }
        /**
         * Gets or sets the Value of the combo.
         * When the user selects an item from, the value is set based on the specified ValueField field. If not ValueField is specified, then the first field in the data source is used.
         * When the user enters text into the combo, the list is searched based on the TextField field. If a matching string is found, the Value of the combo is the value of the ValueField field in the same row.
         * If the text entered in the combo does not match any item on the list, then the value will return null.
        */
        get value() {
            return this.i.c1;
        }
        set value(v) {
            this.i.c1 = v;
        }
        findByName(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("MultiColumnComboBoxComponent");
            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;
        }
        /**
     * Programmatically closes the list.
    
    */
        closeUp() {
            this.i.closeUp();
        }
        /**
         * Programmatically drops down the list.
        
        */
        dropDown() {
            this.i.dropDown();
        }
        /**
         * Selects all the text in the combo input area.
        
        */
        select() {
            this.i.select();
        }
        /**
         * Exports visual information about the current state of the grid.
        
        */
        exportVisualModel() {
            let iv = this.i.cw();
            return (iv);
        }
        /**
         * Returns a serialized copy of the exported visual model
        
        */
        exportSerializedVisualModel() {
            let iv = this.i.eh();
            return (iv);
        }
        get gotFocus() {
            return this._gotFocus;
        }
        set gotFocus(ev) {
            if (this._gotFocus_wrapped !== null) {
                this.i.gotFocus = delegateRemove(this.i.gotFocus, this._gotFocus_wrapped);
                this._gotFocus_wrapped = null;
                this._gotFocus = null;
            }
            this._gotFocus = ev;
            this._gotFocus_wrapped = (o, e) => {
                let outerArgs = new IgcGotFocusEventArgs();
                outerArgs._provideImplementation(e);
                if (this.beforeGotFocus) {
                    this.beforeGotFocus(this, outerArgs);
                }
                if (this._gotFocus) {
                    this._gotFocus(this, outerArgs);
                }
            };
            this.i.gotFocus = delegateCombine(this.i.gotFocus, this._gotFocus_wrapped);
        }
        get lostFocus() {
            return this._lostFocus;
        }
        set lostFocus(ev) {
            if (this._lostFocus_wrapped !== null) {
                this.i.lostFocus = delegateRemove(this.i.lostFocus, this._lostFocus_wrapped);
                this._lostFocus_wrapped = null;
                this._lostFocus = null;
            }
            this._lostFocus = ev;
            this._lostFocus_wrapped = (o, e) => {
                let outerArgs = new IgcLostFocusEventArgs();
                outerArgs._provideImplementation(e);
                if (this.beforeLostFocus) {
                    this.beforeLostFocus(this, outerArgs);
                }
                if (this._lostFocus) {
                    this._lostFocus(this, outerArgs);
                }
            };
            this.i.lostFocus = delegateCombine(this.i.lostFocus, this._lostFocus_wrapped);
        }
        get textChanged() {
            return this._textChanged;
        }
        set textChanged(ev) {
            if (this._textChanged_wrapped !== null) {
                this.i.textChanged = delegateRemove(this.i.textChanged, this._textChanged_wrapped);
                this._textChanged_wrapped = null;
                this._textChanged = null;
            }
            this._textChanged = ev;
            this._textChanged_wrapped = (o, e) => {
                let outerArgs = new IgcMultiColumnComboBoxTextChangedEventArgs();
                outerArgs._provideImplementation(e);
                if (this.beforeTextChanged) {
                    this.beforeTextChanged(this, outerArgs);
                }
                if (this._textChanged) {
                    this._textChanged(this, outerArgs);
                }
            };
            this.i.textChanged = delegateCombine(this.i.textChanged, this._textChanged_wrapped);
        }
        get valueChanged() {
            return this._valueChanged;
        }
        set valueChanged(ev) {
            if (this._valueChanged_wrapped !== null) {
                this.i.valueChanged = delegateRemove(this.i.valueChanged, this._valueChanged_wrapped);
                this._valueChanged_wrapped = null;
                this._valueChanged = null;
            }
            this._valueChanged = ev;
            this._valueChanged_wrapped = (o, e) => {
                let outerArgs = new IgcMultiColumnComboBoxValueChangedEventArgs();
                outerArgs._provideImplementation(e);
                if (this.beforeValueChanged) {
                    this.beforeValueChanged(this, outerArgs);
                }
                if (this._valueChanged) {
                    this._valueChanged(this, outerArgs);
                }
            };
            this.i.valueChanged = delegateCombine(this.i.valueChanged, this._valueChanged_wrapped);
        }
        get keyDown() {
            return this._keyDown;
        }
        set keyDown(ev) {
            if (this._keyDown_wrapped !== null) {
                this.i.keyDown = delegateRemove(this.i.keyDown, this._keyDown_wrapped);
                this._keyDown_wrapped = null;
                this._keyDown = null;
            }
            this._keyDown = ev;
            this._keyDown_wrapped = (o, e) => {
                let outerArgs = new IgcKeyEventArgs();
                outerArgs._provideImplementation(e);
                if (this.beforeKeyDown) {
                    this.beforeKeyDown(this, outerArgs);
                }
                if (this._keyDown) {
                    this._keyDown(this, outerArgs);
                }
            };
            this.i.keyDown = delegateCombine(this.i.keyDown, this._keyDown_wrapped);
        }
        get change() {
            return this._change;
        }
        set change(ev) {
            if (this._change_wrapped !== null) {
                this.i.change = delegateRemove(this.i.change, this._change_wrapped);
                this._change_wrapped = null;
                this._change = null;
            }
            this._change = ev;
            this._change_wrapped = (o, e) => {
                let outerArgs = new IgcInputChangeEventArgs();
                outerArgs._provideImplementation(e);
                if (this.beforeChange) {
                    this.beforeChange(this, outerArgs);
                }
                if (this._change) {
                    this._change(this, outerArgs);
                }
            };
            this.i.change = delegateCombine(this.i.change, this._change_wrapped);
        }
        get changing() {
            return this._changing;
        }
        set changing(ev) {
            if (this._changing_wrapped !== null) {
                this.i.changing = delegateRemove(this.i.changing, this._changing_wrapped);
                this._changing_wrapped = null;
                this._changing = null;
            }
            this._changing = ev;
            this._changing_wrapped = (o, e) => {
                let outerArgs = new IgcInputChangeEventArgs();
                outerArgs._provideImplementation(e);
                if (this.beforeChanging) {
                    this.beforeChanging(this, outerArgs);
                }
                if (this._changing) {
                    this._changing(this, outerArgs);
                }
            };
            this.i.changing = delegateCombine(this.i.changing, this._changing_wrapped);
        }
    }
    IgcMultiColumnComboBoxComponent._observedAttributesIgcMultiColumnComboBoxComponent = null;
    IgcMultiColumnComboBoxComponent.htmlTagName = "igc-multi-column-combo-box";
    IgcMultiColumnComboBoxComponent._isElementRegistered = false;
    return IgcMultiColumnComboBoxComponent;
})();
//# sourceMappingURL=igc-multi-column-combo-box-component.js.map
