/*
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 { Base, runOn, delegateCombine, markType, INotifyPropertyChanged_$type, PropertyChangedEventArgs, enumGetBox, Point_$type, Boolean_$type } from "./type";
import { IScrollerView_$type } from "./IScrollerView";
import { CanvasGestureDOMEventProxy } from "./CanvasGestureDOMEventProxy";
import { Brush } from "./Brush";
import { DOMExecutionContext } from "./DOMExecutionContext";
import { DoubleAnimator } from "./DoubleAnimator";
import { Rect } from "./Rect";
import { ScrollbarStyle_$type } from "./ScrollbarStyle";
import { truncate, isNaN_ } from "./number";
import { List$1 } from "./List$1";
import { EasingFunctions } from "./EasingFunctions";
import { ScrollerScrollingEventArgs } from "./ScrollerScrollingEventArgs";
/**
 * @hidden
 */
export let ScrollerView = /*@__PURE__*/ (() => {
    class ScrollerView extends Base {
        constructor(a) {
            super();
            this.c = null;
            this.ab = null;
            this.af = null;
            this.b = null;
            this.aa = null;
            this.a = null;
            this.ae = null;
            this.ac = null;
            this.ad = null;
            this.ag = null;
            this.e = false;
            this.d = null;
            this.i = false;
            this.h = false;
            this.w = 0;
            this.t = 0;
            this.x = -1;
            this.u = -1;
            this.g = false;
            this.f = false;
            this.v = 0;
            this.s = 0;
            this.c = a;
        }
        getDefaultScrollbarBrush() {
            return ((() => {
                let $ret = new Brush();
                $ret.fill = "#666666";
                return $ret;
            })());
        }
        provideContainer(a) {
            if (a == null) {
                if (this.ab != null) {
                    this.ab = null;
                }
                if (this.a != null) {
                    this.a.ao = null;
                    this.a.av();
                }
                return;
            }
            this.ab = a;
            this.c.executionContext = new DOMExecutionContext(this.ab);
            let b = Math.round(this.ab.rootWrapper.width());
            let c = Math.round(this.ab.rootWrapper.height());
            this.ae = this.ab.rootWrapper;
            this.ae.setStyleProperty("position", "relative");
            this.af = this.ab.createElement("div");
            this.af.setStyleProperty("position", "relative");
            this.af.setStyleProperty("width", "100%");
            this.af.setStyleProperty("height", "100%");
            this.af.setStyleProperty("overflow", "hidden");
            this.ae.append(this.af);
            this.ad = this.ab.createElement("div");
            this.ad.setStyleProperty("position", "absolute");
            this.ad.setStyleProperty("height", this.c.scrollbarSpan + "px");
            this.ad.setStyleProperty("width", this.c.minScrollbarSize + "px");
            this.ad.setStyleProperty("background-color", this.c.scrollbarBrush._fill);
            this.ad.setStyleProperty("display", "none");
            this.ad.setStyleProperty("border-radius", "5px");
            this.ad.setStyleProperty("z-index", "10000");
            this.ad.setStyleProperty("bottom", "0px");
            this.ae.append(this.ad);
            this.ag = this.ab.createElement("div");
            this.ag.setStyleProperty("position", "absolute");
            this.ag.setStyleProperty("width", this.c.scrollbarSpan + "px");
            this.ag.setStyleProperty("height", this.c.minScrollbarSize + "px");
            this.ag.setStyleProperty("background-color", this.c.scrollbarBrush._fill);
            this.ag.setStyleProperty("display", "none");
            this.ag.setStyleProperty("border-radius", "5px");
            this.ag.setStyleProperty("z-index", "10000");
            this.ag.setStyleProperty("right", "0px");
            this.ae.append(this.ag);
            this.updateScrollbarStatus(false);
            this.aa = this.af.getNativeElement();
            this.a = new CanvasGestureDOMEventProxy(this.ab.rootWrapper, this.ab, true);
            this.ab.rootWrapper.setProperty("tabIndex", 1000);
            this.ab.rootWrapper.setRawStyleProperty("outline", "none");
            this.a.c8 = true;
            this.a.bv = true;
            let d = this.a;
            d.onMouseWheel = delegateCombine(d.onMouseWheel, runOn(this, this.l));
            let e = this.a;
            e.onMouseWheelHorizontal = delegateCombine(e.onMouseWheelHorizontal, runOn(this, this.m));
            let f = this.a;
            f.onMouseLeave = delegateCombine(f.onMouseLeave, runOn(this, this.an));
            let g = this.a;
            g.onDragStarted = delegateCombine(g.onDragStarted, runOn(this, this.am));
            let h = this.a;
            h.onDragDelta = delegateCombine(h.onDragDelta, runOn(this, this.al));
            let i = this.a;
            i.onDragCompleted = delegateCombine(i.onDragCompleted, runOn(this, this.ak));
            let j = this.a;
            j.onFlingStarted = delegateCombine(j.onFlingStarted, runOn(this, this.j));
            let k = this.a;
            k.onContactStarted = delegateCombine(k.onContactStarted, runOn(this, this.aj));
            let l = this.a;
            l.onContactMoved = delegateCombine(l.onContactMoved, runOn(this, this.ai));
            let m = this.a;
            m.onContactCompleted = delegateCombine(m.onContactCompleted, runOn(this, this.ah));
            this.a.ab = true;
            this.a.aq = runOn(this, this.r);
            let n = this.a;
            n.onKeyDown = delegateCombine(n.onKeyDown, runOn(this, this.k));
            this.a.ar = (o) => {
                let e_ = o.originalEvent;
                let p = (e_.type);
                if (p == "pointerdown" && !this.a.br(o)) {
                    return false;
                }
                return true;
            };
            this.c.di(b, c);
            this.c.horizontalAnimation.u(this.ab);
            this.c.verticalAnimation.u(this.ab);
            this.attachNativeScroll();
        }
        k(a) {
            return this.c.ao(a, (this.a.bi & 4) != 0, (this.a.bi & 2) != 0);
        }
        r(a, b, c) {
            if (this.f || this.g) {
                return true;
            }
            if (c || b) {
                return true;
            }
            if (this.n(a, b)) {
                this.c.c3();
                return true;
            }
            else if (this.c.isHorizontalActive) {
                this.c.c7();
            }
            if (this.o(a, b)) {
                this.c.c4();
                return true;
            }
            else if (this.c.isVerticalActive) {
                this.c.c8();
            }
            return false;
        }
        ah(a, b) {
            this.f = false;
            this.g = false;
            this.c.isDraggingVBar = false;
            this.c.isDraggingHBar = false;
        }
        ai(a, b) {
            if (this.g) {
                let c = a.y - this.v;
                this.v = a.y;
                this.c.dh(c);
            }
            else if (this.f) {
                let d = a.x - this.s;
                this.s = a.x;
                this.c.df(d);
            }
        }
        aj(a, b) {
            this.e = false;
            this.cancelInertia();
            let c = this.q(a, b);
            let d = this.p(a, b);
            if (c) {
                this.c.isDraggingVBar = true;
                this.g = true;
                this.v = a.y;
                this.focus();
            }
            else if (d) {
                this.c.isDraggingHBar = true;
                this.f = true;
                this.s = a.x;
                this.focus();
            }
        }
        p(a, b) {
            if (!this.h) {
                return false;
            }
            if (a.y >= this.c.viewportHeight - this.c.scrollbarSpan && a.y <= this.c.viewportHeight && a.x >= this.u - this.t / 2 && a.x <= this.u + this.t / 2) {
                return true;
            }
            return false;
        }
        q(a, b) {
            if (!this.i) {
                return false;
            }
            if (a.x >= this.c.viewportWidth - this.c.scrollbarSpan && a.x <= this.c.viewportWidth && a.y >= this.x - this.w / 2 && a.y <= this.x + this.w / 2) {
                return true;
            }
            return false;
        }
        n(a, b) {
            if (!this.h) {
                return false;
            }
            return a.y >= this.c.viewportHeight - this.c.scrollbarSpan - 40 && a.y <= this.c.viewportHeight;
        }
        o(a, b) {
            if (!this.i) {
                return false;
            }
            return a.x >= this.c.viewportWidth - this.c.scrollbarSpan - 40 && a.x <= this.c.viewportWidth;
        }
        j(a, b, c) {
            this.e = true;
            return true;
        }
        onViewportHeightChanged(a) {
            this.a.bl = new Rect(0, 0, 0, this.c.viewportWidth, this.c.viewportHeight);
        }
        onViewportWidthChanged(a) {
            this.a.bl = new Rect(0, 0, 0, this.c.viewportWidth, this.c.viewportHeight);
        }
        onContentHeightChanged(a) {
            if (this.ac != null) {
                this.ac.setStyleProperty("height", a + "px");
            }
        }
        onContentWidthChanged(a) {
            if (this.ac != null) {
                this.ac.setStyleProperty("width", a + "px");
            }
        }
        cancelInertia() {
        }
        ak(a) {
            if (this.f || this.g) {
                return;
            }
            this.e = false;
            this.c.dc(a);
        }
        al(a) {
            if (this.f || this.g) {
                return;
            }
            this.c.dd(a);
        }
        updateScrollTop(a) {
            this.aa.scrollTop = truncate(a);
        }
        am(a) {
            if (this.f || this.g) {
                return;
            }
            this.e = false;
            this.c.de(a);
        }
        getInitialScrollLeft() {
            return this.aa.scrollLeft;
        }
        getInitialScrollTop() {
            return this.aa.scrollTop;
        }
        l(a, b) {
            this.e = false;
            this.cancelInertia();
            return this.c.aq(a, 0, b);
        }
        m(a, b) {
            this.e = false;
            this.cancelInertia();
            return this.c.aq(a, b, 0);
        }
        an(a) {
            if (this.c.horizontalScrollbarStatus > 0) {
                this.c.c7();
            }
            if (this.c.verticalScrollbarStatus > 0) {
                this.c.c8();
            }
        }
        updateScrollLeft(a) {
            this.aa.scrollLeft = truncate(a);
        }
        provideContent(a) {
            this.ac = a;
            this.af.append(this.ac);
        }
        requestWork(a) {
            if (this.ab == null) {
                return;
            }
            if (this.d == null) {
                this.d = this.ab.getRequestAnimationFrame();
            }
            if (this.e) {
                a();
            }
            else {
                this.d(() => a());
            }
        }
        hideVScrollbar() {
            if (this.i) {
                this.i = false;
                this.ag.setStyleProperty("display", "none");
            }
        }
        hideHScrollbar() {
            if (this.h) {
                this.h = false;
                this.ad.setStyleProperty("display", "none");
            }
        }
        updateVScrollbar(a, b) {
            let c = false;
            if (!this.i) {
                c = true;
                this.i = true;
                this.ag.setStyleProperty("display", "block");
            }
            if (a != this.x || c) {
                this.x = a;
                if (this.i) {
                    this.ag.setRawYPosition(a - b / 2);
                }
            }
            if (b != this.w || c) {
                this.w = b;
                if (this.i) {
                    this.ag.setRawSize(this.z(), b);
                }
            }
        }
        updateHScrollbar(a, b) {
            let c = false;
            if (!this.h) {
                c = true;
                this.h = true;
                this.ad.setStyleProperty("display", "block");
            }
            if (a != this.u || c) {
                this.u = a;
                if (this.h) {
                    this.ad.setRawXPosition(a - b / 2);
                }
            }
            if (b != this.t || c) {
                this.t = b;
                if (this.h) {
                    this.ad.setRawSize(b, this.y());
                }
            }
        }
        updateScrollbarStatus(a) {
            if (this.ad != null && this.ag != null) {
                switch (this.c.scrollbarStyle) {
                    case 0:
                        if (a) {
                            this.ad.setStyleProperty("opacity", "1");
                            this.ag.setStyleProperty("opacity", "1");
                            this.ad.setRawSize(this.t, this.y());
                            this.ag.setRawSize(this.z(), this.w);
                        }
                        break;
                    case 1:
                        if (a) {
                            this.ad.setRawSize(this.t, this.y());
                            this.ag.setRawSize(this.z(), this.w);
                        }
                        this.ad.setStyleProperty("opacity", this.c.horizontalScrollbarStatus.toString());
                        this.ag.setStyleProperty("opacity", this.c.verticalScrollbarStatus.toString());
                        break;
                    case 2:
                        if (a) {
                            this.ad.setStyleProperty("opacity", "1");
                            this.ag.setStyleProperty("opacity", "1");
                        }
                        this.ad.setRawSize(this.t, this.y());
                        this.ag.setRawSize(this.z(), this.w);
                        break;
                }
            }
        }
        y() {
            if (this.c.scrollbarStyle == 2) {
                return this.c.horizontalScrollbarStatus * (this.c.scrollbarSpan - 2) + 2;
            }
            return this.c.scrollbarSpan;
        }
        z() {
            if (this.c.scrollbarStyle == 2) {
                return this.c.verticalScrollbarStatus * (this.c.scrollbarSpan - 2) + 2;
            }
            return this.c.scrollbarSpan;
        }
        focus() {
            this.ab.rootWrapper.focus(true);
        }
        onDetachedFromUI() {
            if (this.a != null) {
                this.a.bh(this.ab.rootWrapper, "");
            }
        }
        onAttachedToUI() {
            if (this.a != null) {
                this.a.at(this.ab.rootWrapper, "");
            }
        }
        attachNativeScroll() {
            let a = this.af.getNativeElement();
            a.addEventListener("scroll", runOn(this, this.onNativeScroll));
        }
        detachNativeScroll() {
            let a = this.af.getNativeElement();
            a.removeEventListener("scroll", runOn(this, this.onNativeScroll));
        }
        onNativeScroll(a) {
        }
    }
    ScrollerView.$t = markType(ScrollerView, 'ScrollerView', Base.$, [IScrollerView_$type]);
    return ScrollerView;
})();
/**
 * @hidden
 */
export let Scroller = /*@__PURE__*/ (() => {
    class Scroller extends Base {
        constructor() {
            super();
            this.bh = 49;
            this._keyboardListener = null;
            this.a9 = NaN;
            this.a3 = 49;
            this.a1 = NaN;
            this.bg = 48;
            this.a8 = NaN;
            this.a2 = 48;
            this.a0 = NaN;
            this.a6 = 0;
            this.ba = 20;
            this.bd = 8;
            this.bj = 0;
            this.dx = null;
            this.x = false;
            this.a5 = 0;
            this.bl = 0;
            this.bk = 0;
            this.bf = 0;
            this.be = 0;
            this.c = null;
            this.v = true;
            this.aa = false;
            this.a4 = 0;
            this.az = 0;
            this.e = 0;
            this.a7 = 0;
            this.bi = 0;
            this.j = null;
            this.k = null;
            this.bu = 0;
            this.b5 = 0;
            this.bv = 0;
            this.b6 = 0;
            this._executionContext = null;
            this._isDraggingVBar = false;
            this._isDraggingHBar = false;
            this.s = false;
            this.q = false;
            this.r = false;
            this.dz = null;
            this.p = false;
            this.propertyChanged = null;
            this.onScrolling = null;
            this.onScrollStart = null;
            this.onScrollStop = null;
            this._isScrolling = false;
            this.bb = 0;
            this.bc = 0;
            this.w = false;
            this.ay = new List$1(Boolean_$type, 0);
            this.cb = 500;
            this.cc = 0;
            this.cd = 0;
            this.o = false;
            this.z = false;
            this.n = false;
            this.y = false;
            this.t = true;
            this.u = true;
            this.dx = this.view.getDefaultScrollbarBrush();
            this.j = new DoubleAnimator(0, 1, 400);
            this.k = new DoubleAnimator(0, 1, 400);
            this.j.b = EasingFunctions.cubicEase;
            this.k.b = EasingFunctions.cubicEase;
            let a = this.j;
            a.propertyChanged = delegateCombine(a.propertyChanged, runOn(this, this.c1));
            let b = this.k;
            b.propertyChanged = delegateCombine(b.propertyChanged, runOn(this, this.c2));
        }
        get smallVerticalChange() {
            return this.bh;
        }
        set smallVerticalChange(a) {
            let b = this.bh;
            this.bh = a;
            if (b != this.bh) {
                this.dg("SmallVerticalChange", b, this.bh);
            }
        }
        get keyboardListener() {
            return this._keyboardListener;
        }
        set keyboardListener(a) {
            this._keyboardListener = a;
        }
        get largeVerticalChange() {
            return this.a9;
        }
        set largeVerticalChange(a) {
            let b = this.a9;
            this.a9 = a;
            if (b != this.a9) {
                this.dg("LargeVerticalChange", b, this.a9);
            }
        }
        get bq() {
            return this.a3;
        }
        set bq(a) {
            let b = this.a3;
            this.a3 = a;
            if (b != this.a3) {
                this.dg("ActualSmallVerticalChange", b, this.a3);
            }
        }
        get bo() {
            return this.a1;
        }
        set bo(a) {
            let b = this.a1;
            this.a1 = a;
            if (b != this.a1) {
                this.dg("ActualLargeVerticalChange", b, this.a1);
            }
        }
        get smallHorizontalChange() {
            return this.bg;
        }
        set smallHorizontalChange(a) {
            let b = this.bg;
            this.bg = a;
            if (b != this.bg) {
                this.dg("SmallHorizontalChange", b, this.bg);
            }
        }
        get largeHorizontalChange() {
            return this.a8;
        }
        set largeHorizontalChange(a) {
            let b = this.a8;
            this.a8 = a;
            if (b != this.a8) {
                this.dg("LargeHorizontalChange", b, this.a8);
            }
        }
        get bp() {
            return this.a2;
        }
        set bp(a) {
            let b = this.a2;
            this.a2 = a;
            if (b != this.a2) {
                this.dg("ActualSmallHorizontalChange", b, this.a2);
            }
        }
        get bn() {
            return this.a0;
        }
        set bn(a) {
            let b = this.a0;
            this.a0 = a;
            if (b != this.a0) {
                this.dg("ActualLargeHorizontalChange", b, this.a0);
            }
        }
        get contentWidth() {
            return this.a6;
        }
        set contentWidth(a) {
            let b = this.a6;
            this.a6 = a;
            if (b != this.a6) {
                this.dg("ContentWidth", b, this.a6);
            }
        }
        get minScrollbarSize() {
            return this.ba;
        }
        set minScrollbarSize(a) {
            let b = this.ba;
            this.ba = a;
            if (b != this.ba) {
                this.dg("MinScrollbarSize", b, this.ba);
            }
        }
        get scrollbarSpan() {
            return this.bd;
        }
        set scrollbarSpan(a) {
            let b = this.bd;
            this.bd = a;
            if (b != this.bd) {
                this.dg("ScrollbarSpan", b, this.bd);
            }
        }
        ao(a, b, c) {
            switch (a) {
                case 11: return this.ar(b, c);
                case 10: return this.as(b, c);
                case 17: return this.ah(b, c);
                case 15: return this.aw(b, c);
                case 14: return this.ap(b, c);
                case 16: return this.at(b, c);
                case 13: return this.am(b, c);
                case 12: return this.ai(b, c);
                case 2: return this.av(b, c);
                case 3: return this.aj(b, c);
                case 8: return this.ak();
                case 57: return this.al();
                case 9: return this.au(b, c);
                default: return this.an(a, b, c);
            }
            return false;
        }
        au(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onSpace(a, b)) {
                    return true;
                }
            }
            return false;
        }
        al() {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onF2()) {
                    return true;
                }
            }
            return false;
        }
        ak() {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onEscape()) {
                    return true;
                }
            }
            return false;
        }
        av(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onTab(a, b)) {
                    return true;
                }
            }
            return false;
        }
        ai(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onEnd(a, b)) {
                    return true;
                }
            }
            return false;
        }
        am(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onHome(a, b)) {
                    return true;
                }
            }
            return false;
        }
        at(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onRightArrow(a, b)) {
                    return true;
                }
            }
            if (this.scrollLeft + this.viewportWidth >= this.contentWidth) {
                return false;
            }
            this.dn(this.bp, 0);
            return true;
        }
        ap(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onLeftArrow(a, b)) {
                    return true;
                }
            }
            if (this.scrollLeft <= 0) {
                return false;
            }
            this.dn(this.bp * -1, 0);
            return true;
        }
        aw(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onUpArrow(a, b)) {
                    return true;
                }
            }
            if (this.scrollTop <= 0) {
                return false;
            }
            this.dn(0, this.bq * -1);
            return true;
        }
        ah(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onDownArrow(a, b)) {
                    return true;
                }
            }
            if (this.scrollTop + this.viewportHeight >= this.contentHeight) {
                return false;
            }
            this.dn(0, this.bq);
            return true;
        }
        as(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onPageUp(a, b)) {
                    return true;
                }
            }
            if (this.scrollTop < 0) {
                return false;
            }
            this.dn(0, this.bo * -1);
            return true;
        }
        ar(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onPageDown(a, b)) {
                    return true;
                }
            }
            if (this.scrollTop + this.viewportHeight >= this.contentHeight) {
                return false;
            }
            this.dn(0, this.bo);
            return true;
        }
        aj(a, b) {
            if (this.keyboardListener != null) {
                if (this.keyboardListener.onEnter(a, b)) {
                    return true;
                }
            }
            return false;
        }
        an(a, b, c) {
            if (this.keyboardListener != null) {
                return this.keyboardListener.onKeyDown(a, b, c);
            }
            return false;
        }
        get verticalTrackStartInset() {
            return this.bj;
        }
        set verticalTrackStartInset(a) {
            let b = this.bj;
            this.bj = a;
            if (b != this.bj) {
                this.dg("VerticalTrackStartInset", b, this.bj);
            }
        }
        get scrollbarBrush() {
            return this.dx;
        }
        set scrollbarBrush(a) {
            let b = this.dx;
            this.dx = a;
            if (b != this.dx) {
                this.dg("ScrollbarBrush", b, this.dx);
            }
        }
        dg(a, b, c) {
            if (this.propertyChanged != null) {
                this.propertyChanged(this, new PropertyChangedEventArgs(a));
            }
            this.dj(a, b, c);
        }
        get ax() {
            return this.x;
        }
        set ax(a) {
            this.x = a;
            if (!this.x) {
                this.view.updateScrollTop(this.scrollTop);
                this.view.updateScrollLeft(this.scrollLeft);
            }
        }
        dj(a, b, c) {
            switch (a) {
                case "ContentWidth":
                    this.view.onContentWidthChanged(this.contentWidth);
                    let d = c;
                    let e = b;
                    if (d < e && this.scrollLeft + this.viewportWidth >= d) {
                        this.dp(d - (this.scrollLeft + this.viewportWidth), 0);
                    }
                    this.du();
                    break;
                case "ContentHeight":
                    this.view.onContentHeightChanged(this.contentHeight);
                    let f = c;
                    let g = b;
                    if (f < g && this.scrollTop > 0 && this.scrollTop + this.viewportHeight >= f) {
                        this.dp(0, f - (this.scrollTop + this.viewportHeight));
                    }
                    this.dw();
                    break;
                case "ScrollTop":
                    if (!this.ax) {
                        this.view.updateScrollTop(this.scrollTop);
                    }
                    break;
                case "ScrollLeft":
                    if (!this.ax) {
                        this.view.updateScrollLeft(this.scrollLeft);
                    }
                    break;
                case "ViewportWidth":
                    this.view.onViewportWidthChanged(this.viewportWidth);
                    if (isNaN_(this.largeVerticalChange)) {
                        this.bn = this.viewportWidth;
                    }
                    if (this.contentWidth > 0 && this.scrollLeft + this.viewportWidth > this.contentWidth) {
                        this.dp(this.contentWidth - this.viewportWidth - this.scrollLeft, 0);
                    }
                    this.du();
                    if (this.view.getInitialScrollLeft() != this.scrollLeft) {
                        this.view.updateScrollLeft(this.scrollLeft);
                    }
                    break;
                case "ViewportHeight":
                    this.view.onViewportHeightChanged(this.viewportHeight);
                    if (isNaN_(this.largeVerticalChange)) {
                        this.bo = this.viewportHeight;
                    }
                    this.dw();
                    if (this.view.getInitialScrollTop() != this.scrollTop) {
                        this.view.updateScrollTop(this.scrollTop);
                    }
                    break;
                case "ScrollbarBrush":
                case "ScrollbarSpan":
                case "MinScrollbarSize":
                case "VerticalTrackStartInset":
                    this.dw();
                    this.du();
                    break;
                case "HorizontalScrollbarStatus":
                case "VerticalOpacity":
                    this.view.updateScrollbarStatus(false);
                    break;
                case "ScrollbarStyle":
                    this.view.updateScrollbarStatus(true);
                    break;
            }
        }
        get contentHeight() {
            return this.a5;
        }
        set contentHeight(a) {
            let b = this.a5;
            this.a5 = a;
            if (b != this.a5) {
                this.dg("ContentHeight", b, this.a5);
            }
        }
        dh(a) {
            let b = Math.max(this.minScrollbarSize, this.actualVerticalScrollbarHeight);
            let c = this.verticalTrackStartInset + (b / 2);
            let d = this.viewportHeight - (b / 2);
            let e = a / (d - c);
            let f = e * (this.contentHeight - this.viewportHeight);
            this.dn(0, f);
        }
        df(a) {
            let b = Math.max(this.minScrollbarSize, this.actualHorizontalScrollbarWidth);
            let c = 0 + (b / 2);
            let d = this.viewportWidth - (b / 2);
            let e = a / (d - c);
            let f = e * (this.contentWidth - this.viewportWidth);
            this.dn(f, 0);
        }
        di(a, b, c = false) {
            let d = this.bl;
            let e = this.bk;
            this.bl = a;
            this.bk = b;
            if (c && (d != a || e != b)) {
                this.dg("ViewportWidth", d, a);
                this.dg("ViewportHeight", e, b);
            }
        }
        get viewportWidth() {
            return this.bl;
        }
        set viewportWidth(a) {
            let b = this.bl;
            this.bl = a;
            if (b != this.bl) {
                this.dg("ViewportWidth", b, this.bl);
            }
        }
        get viewportHeight() {
            return this.bk;
        }
        set viewportHeight(a) {
            let b = this.bk;
            this.bk = a;
            if (b != this.bk) {
                this.dg("ViewportHeight", b, this.bk);
            }
        }
        get scrollTop() {
            return this.bf;
        }
        set scrollTop(a) {
            let b = this.bf;
            this.bf = a;
            if (b != this.bf) {
                this.dg("ScrollTop", b, this.bf);
            }
        }
        get scrollLeft() {
            return this.be;
        }
        set scrollLeft(a) {
            let b = this.be;
            this.be = a;
            if (b != this.be) {
                this.dg("ScrollLeft", b, this.be);
            }
        }
        get view() {
            if (this.c == null) {
                this.c = new ScrollerView(this);
            }
            return this.c;
        }
        set view(a) {
            this.c = a;
        }
        provideContainer(a) {
            this.view.provideContainer(a);
            this.bf = this.view.getInitialScrollTop();
            this.be = this.view.getInitialScrollLeft();
            this.du();
            this.dw();
        }
        onDetachedFromUI() {
            this.view.onDetachedFromUI();
        }
        onAttachedToUI() {
            this.view.onAttachedToUI();
        }
        provideContent(a) {
            this.view.provideContent(a);
        }
        aq(a, b, c) {
            this.r = false;
            this.q = false;
            this.s = false;
            this.view.cancelInertia();
            if (this.keyboardListener != null) {
                this.keyboardListener.onWheel();
            }
            this.dn(b, c);
            return true;
        }
        get lockScrollDirection() {
            return this.v;
        }
        set lockScrollDirection(a) {
            this.v = true;
        }
        get actualVerticalScrollbarHeight() {
            return this.a4;
        }
        set actualVerticalScrollbarHeight(a) {
            let b = this.a4;
            this.a4 = a;
            if (b != this.a4) {
                this.dg("ActualVerticalScrollbarHeight", b, this.a4);
            }
        }
        get actualHorizontalScrollbarWidth() {
            return this.az;
        }
        set actualHorizontalScrollbarWidth(a) {
            let b = this.az;
            this.az = a;
            if (b != this.az) {
                this.dg("ActualHorizontalScrollbarWidth", b, this.az);
            }
        }
        get scrollbarStyle() {
            return this.e;
        }
        set scrollbarStyle(a) {
            let b = this.e;
            this.e = a;
            if (b != this.e) {
                this.dg("ScrollbarStyle", enumGetBox(ScrollbarStyle_$type, b), enumGetBox(ScrollbarStyle_$type, this.e));
            }
        }
        get horizontalScrollbarStatus() {
            return this.a7;
        }
        set horizontalScrollbarStatus(a) {
            let b = this.a7;
            this.a7 = a;
            if (b != this.a7) {
                this.dg("HorizontalScrollbarStatus", b, this.a7);
            }
        }
        get verticalScrollbarStatus() {
            return this.bi;
        }
        set verticalScrollbarStatus(a) {
            let b = this.bi;
            this.bi = a;
            if (b != this.bi) {
                this.dg("VerticalOpacity", b, this.bi);
            }
        }
        get horizontalAnimation() {
            return this.j;
        }
        get verticalAnimation() {
            return this.k;
        }
        get executionContext() {
            return this._executionContext;
        }
        set executionContext(a) {
            this._executionContext = a;
        }
        get isVerticalActive() {
            return this.y;
        }
        get isHorizontalActive() {
            return this.n;
        }
        get isDraggingVBar() {
            return this._isDraggingVBar;
        }
        set isDraggingVBar(a) {
            this._isDraggingVBar = a;
        }
        get isDraggingHBar() {
            return this._isDraggingHBar;
        }
        set isDraggingHBar(a) {
            this._isDraggingHBar = a;
        }
        focus() {
            this.view.focus();
        }
        de(a) {
            this.view.focus();
            this.s = false;
            this.q = false;
            this.r = false;
            this.p = true;
            this.dz = { $type: Point_$type, x: a.x, y: a.y };
        }
        dd(a) {
            if (this.p) {
                let b = a.y - this.dz.y;
                let c = a.x - this.dz.x;
                if (this.lockScrollDirection && !this.r) {
                    this.r = true;
                    if (b > 0 || c > 0) {
                        if (b > c) {
                            this.s = true;
                        }
                        else {
                            this.s = true;
                        }
                    }
                }
                this.dz = { $type: Point_$type, x: a.x, y: a.y };
                this.dn(-c, -b);
            }
        }
        get isScrolling() {
            return this._isScrolling;
        }
        set isScrolling(a) {
            this._isScrolling = a;
        }
        scrollTo(a, b) {
            this.view.detachNativeScroll();
            this.bb = a - this.scrollLeft;
            this.bc = b - this.scrollTop;
            this.dm();
        }
        dn(a, b) {
            this.view.detachNativeScroll();
            this.bb += a;
            this.bc += b;
            this.dm();
        }
        dp(a, b) {
            this.view.detachNativeScroll();
            this.bb += a;
            this.bc += b;
            this.dt();
        }
        dm() {
            if (this.w) {
                return;
            }
            this.w = true;
            this.view.requestWork(runOn(this, this.dt));
        }
        dt() {
            this.w = false;
            let a = this.bb;
            let b = this.bc;
            this.bb = 0;
            this.bc = 0;
            if (this.r) {
                if (this.s) {
                    a = 0;
                }
                if (this.q) {
                    b = 0;
                }
            }
            if (a != 0) {
                this.t = false;
                this.c3();
                this.c7();
                this.t = true;
            }
            if (b != 0) {
                this.u = false;
                this.c4();
                this.c8();
                this.u = true;
            }
            let c = Math.round(this.scrollTop + b);
            let d = Math.round(this.scrollLeft + a);
            if (c < 0) {
                c = 0;
                this.view.cancelInertia();
            }
            if (d < 0) {
                d = 0;
                this.view.cancelInertia();
            }
            if (c + this.viewportHeight > this.contentHeight) {
                c = this.contentHeight - this.viewportHeight;
                if (c < 0) {
                    c = 0;
                }
                this.view.cancelInertia();
            }
            if (d + this.viewportWidth > this.contentWidth) {
                d = this.contentWidth - this.viewportWidth;
                if (d < 0) {
                    d = 0;
                }
                this.view.cancelInertia();
            }
            b = c - this.scrollTop;
            a = d - this.scrollLeft;
            if (b != 0 || a != 0) {
                try {
                    this.ax = true;
                    this.aa = true;
                    this.scrollTop = c;
                    this.scrollLeft = d;
                    this.dw();
                    this.du();
                    this.aa = false;
                    if (!this.isScrolling) {
                        this.isScrolling = true;
                        if (this.onScrollStart != null) {
                            this.onScrollStart(this, ((() => {
                                let $ret = new ScrollerScrollingEventArgs();
                                $ret.deltaX = a;
                                $ret.deltaY = b;
                                return $ret;
                            })()));
                        }
                    }
                    if (this.onScrolling != null) {
                        this.onScrolling(this, ((() => {
                            let $ret = new ScrollerScrollingEventArgs();
                            $ret.deltaX = a;
                            $ret.deltaY = b;
                            return $ret;
                        })()));
                    }
                    if (this.ay.count > 0) {
                        this.ay._inner[this.ay.count - 1] = false;
                    }
                    this.ay.add(true);
                    this.executionContext.executeDelayed(() => {
                        if (this.ay._inner[0]) {
                            if (this.onScrollStop != null) {
                                this.onScrollStop(this, ((() => {
                                    let $ret = new ScrollerScrollingEventArgs();
                                    $ret.deltaX = a;
                                    $ret.deltaY = b;
                                    return $ret;
                                })()));
                            }
                            this.isScrolling = false;
                            this.view.attachNativeScroll();
                        }
                        this.ay.removeAt(0);
                    }, 50);
                }
                finally {
                    this.ax = false;
                }
            }
        }
        dw() {
            this.dv(this.contentHeight, this.viewportHeight, this.scrollTop, true);
        }
        du() {
            this.dv(this.contentWidth, this.viewportWidth, this.scrollLeft, false);
        }
        dv(a, b, c, d) {
            let e = Math.round((b / a) * b);
            let f = d ? this.verticalTrackStartInset : 0;
            e = e - f;
            if (e < this.minScrollbarSize) {
                e = this.minScrollbarSize;
            }
            if (e >= (b - f)) {
                if (d) {
                    this.view.hideVScrollbar();
                }
                else {
                    this.view.hideHScrollbar();
                }
                return;
            }
            let g = f + (e / 2);
            let h = b - (e / 2);
            let i = c / (a - b);
            let j = Math.round(g + (h - g) * i);
            if (d) {
                this.actualVerticalScrollbarHeight = e;
                this.view.updateVScrollbar(j, e);
            }
            else {
                this.actualHorizontalScrollbarWidth = e;
                this.view.updateHScrollbar(j, e);
            }
        }
        dc(a) {
            this.r = false;
            this.q = false;
            this.s = false;
            this.p = false;
        }
        c1(a, b) {
            this.horizontalScrollbarStatus = this.bu + this.j.o * (this.b5 - this.bu);
        }
        c2(a, b) {
            this.verticalScrollbarStatus = this.bv + this.k.o * (this.b6 - this.bv);
        }
        c3() {
            if (this.n) {
                return;
            }
            if (this.scrollbarStyle == 1 || this.scrollbarStyle == 2) {
                if (this.j.f()) {
                    this.j.w();
                }
                this.horizontalScrollbarStatus = 1;
                if (this.o && this.t) {
                    this.o = false;
                }
            }
            this.n = true;
        }
        c4() {
            if (this.y) {
                return;
            }
            if (this.scrollbarStyle == 1 || this.scrollbarStyle == 2) {
                if (this.k.f()) {
                    this.k.w();
                }
                this.verticalScrollbarStatus = 1;
                if (this.z && this.u) {
                    this.z = false;
                }
            }
            this.y = true;
        }
        c7() {
            if (!this.n || this.isDraggingHBar) {
                return;
            }
            if (this.scrollbarStyle == 1 || this.scrollbarStyle == 2) {
                this.dr();
            }
            this.n = false;
        }
        c8() {
            if (!this.y || this.isDraggingVBar) {
                return;
            }
            if (this.scrollbarStyle == 1 || this.scrollbarStyle == 2) {
                this.ds();
            }
            this.y = false;
        }
        dr() {
            if (!this.o) {
                this.o = true;
                this.cc = this.executionContext.getCurrentRelativeTime();
                this.executionContext.executeDelayed(runOn(this, this.c5), this.cb);
            }
            else {
                this.cc = this.executionContext.getCurrentRelativeTime();
            }
        }
        ds() {
            if (!this.z) {
                this.z = true;
                this.cd = this.executionContext.getCurrentRelativeTime();
                this.executionContext.executeDelayed(runOn(this, this.c6), this.cb);
            }
            else {
                this.cd = this.executionContext.getCurrentRelativeTime();
            }
        }
        c5() {
            if (!this.o) {
                return;
            }
            let a = this.executionContext.getCurrentRelativeTime();
            if (a - this.cc >= this.cb) {
                if (!this.j.f() && this.horizontalScrollbarStatus != 0) {
                    this.bu = this.horizontalScrollbarStatus;
                    this.b5 = 0;
                    this.j.v();
                }
                this.o = false;
            }
            else {
                this.executionContext.executeDelayed(runOn(this, this.c5), (this.cb - (a - this.cc)));
            }
        }
        c6() {
            if (!this.z) {
                return;
            }
            let a = this.executionContext.getCurrentRelativeTime();
            if (a - this.cd >= this.cb) {
                if (!this.k.f() && this.verticalScrollbarStatus != 0) {
                    this.bv = this.verticalScrollbarStatus;
                    this.b6 = 0;
                    this.k.v();
                }
                this.z = false;
            }
            else {
                this.executionContext.executeDelayed(runOn(this, this.c6), (this.cb - (a - this.cd)));
            }
        }
    }
    Scroller.$t = markType(Scroller, 'Scroller', Base.$, [INotifyPropertyChanged_$type]);
    return Scroller;
})();
