scrollable.ts 3.7 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

7
import {Disposable, IDisposable} from 'vs/base/common/lifecycle';
E
Erich Gamma 已提交
8 9 10 11 12 13 14 15

export interface IScrollable {
	getScrollHeight():number;
	getScrollWidth():number;
	getScrollLeft():number;
	setScrollLeft(scrollLeft:number);
	getScrollTop():number;
	setScrollTop(scrollTop:number);
16 17 18 19 20 21 22 23 24 25 26
	addScrollListener(callback:(newValues:ScrollEvent)=>void): IDisposable;
}

export class ScrollEvent {
	_scrollEventTrait: void;

	scrollTop: number;
	scrollLeft: number;
	scrollWidth: number;
	scrollHeight: number;

27 28 29 30 31 32
	scrollTopChanged: boolean;
	scrollLeftChanged: boolean;
	scrollWidthChanged: boolean;
	scrollHeightChanged: boolean;

	constructor(scrollTop:number, scrollLeft:number, scrollWidth:number, scrollHeight:number, scrollTopChanged = false, scrollLeftChanged = false, scrollWidthChanged = false, scrollHeightChanged = false) {
33 34 35 36
		this.scrollTop = Math.round(scrollTop);
		this.scrollLeft = Math.round(scrollLeft);
		this.scrollWidth = Math.round(scrollWidth);
		this.scrollHeight = Math.round(scrollHeight);
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

		this.scrollTopChanged = scrollTopChanged;
		this.scrollLeftChanged = scrollLeftChanged;
		this.scrollWidthChanged = scrollWidthChanged;
		this.scrollHeightChanged = scrollHeightChanged;
	}

	public create(scrollTop:number, scrollLeft:number, scrollWidth:number, scrollHeight:number): ScrollEvent {
		return new ScrollEvent(
			scrollTop, scrollLeft, scrollWidth, scrollHeight,
			scrollTop !== this.scrollTop,
			scrollLeft !== this.scrollLeft,
			scrollWidth !== this.scrollWidth,
			scrollHeight !== this.scrollHeight
		);
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
	}
}

export class ScrollableValues {
	_scrollableValuesTrait: void;

	scrollTop: number;
	scrollLeft: number;
	scrollWidth: number;
	scrollHeight: number;

	constructor(scrollTop:number, scrollLeft:number, scrollWidth:number, scrollHeight:number) {
		this.scrollTop = Math.round(scrollTop);
		this.scrollLeft = Math.round(scrollLeft);
		this.scrollWidth = Math.round(scrollWidth);
		this.scrollHeight = Math.round(scrollHeight);
	}

	public equals(other:ScrollEvent): boolean {
		return (
			this.scrollTop === other.scrollTop
			&& this.scrollLeft === other.scrollLeft
			&& this.scrollWidth === other.scrollWidth
			&& this.scrollHeight === other.scrollHeight
		);
	}
}

export class DelegateScrollable extends Disposable {

	private _actual:IScrollable;
	private _onChange:()=>void;

	private _values: ScrollableValues;

	constructor(actual:IScrollable, onChange:()=>void) {
		super();
		this._actual = actual;
		this._onChange = onChange;

		this._values = new ScrollableValues(this._actual.getScrollTop(), this._actual.getScrollLeft(), this._actual.getScrollWidth(), this._actual.getScrollHeight());
		this._register(this._actual.addScrollListener((newValues) => this._update(newValues)));
	}

	public dispose(): void {
		super.dispose();
	}

	private _update(e:ScrollEvent): void {
		if (this._values.equals(e)) {
			return;
		}

		this._values = new ScrollableValues(e.scrollTop, e.scrollLeft, e.scrollWidth, e.scrollHeight);

		this._onChange();
	}

	public getScrollTop():number { return this._values.scrollTop; }
	public getScrollLeft():number { return this._values.scrollLeft; }
	public getScrollWidth():number { return this._values.scrollWidth; }
	public getScrollHeight():number { return this._values.scrollHeight; }

	public setScrollTop(scrollTop:number): void {
		this._actual.setScrollTop(scrollTop);
	}

	public setScrollLeft(scrollLeft:number): void {
		this._actual.setScrollLeft(scrollLeft);
	}
E
Erich Gamma 已提交
122
}