SQL Operations Studio Public Preview 1 (0.23) release source code

This commit is contained in:
Karl Burtram
2017-11-09 14:30:27 -08:00
parent b88ecb8d93
commit 3cdac41339
8829 changed files with 759707 additions and 286 deletions

View File

@@ -0,0 +1,127 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
import * as dom from 'vs/base/browser/dom';
import { IframeUtils } from 'vs/base/browser/iframe';
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
export interface IStandardMouseMoveEventData {
leftButton: boolean;
posx: number;
posy: number;
}
export interface IEventMerger<R> {
(lastEvent: R, currentEvent: MouseEvent): R;
}
export interface IMouseMoveCallback<R> {
(mouseMoveData: R): void;
}
export interface IOnStopCallback {
(): void;
}
export function standardMouseMoveMerger(lastEvent: IStandardMouseMoveEventData, currentEvent: MouseEvent): IStandardMouseMoveEventData {
let ev = new StandardMouseEvent(currentEvent);
ev.preventDefault();
return {
leftButton: ev.leftButton,
posx: ev.posx,
posy: ev.posy
};
}
export class GlobalMouseMoveMonitor<R> extends Disposable {
private hooks: IDisposable[];
private mouseMoveEventMerger: IEventMerger<R>;
private mouseMoveCallback: IMouseMoveCallback<R>;
private onStopCallback: IOnStopCallback;
constructor() {
super();
this.hooks = [];
this.mouseMoveEventMerger = null;
this.mouseMoveCallback = null;
this.onStopCallback = null;
}
public dispose(): void {
this.stopMonitoring(false);
super.dispose();
}
public stopMonitoring(invokeStopCallback: boolean): void {
if (!this.isMonitoring()) {
// Not monitoring
return;
}
// Unhook
this.hooks = dispose(this.hooks);
this.mouseMoveEventMerger = null;
this.mouseMoveCallback = null;
let onStopCallback = this.onStopCallback;
this.onStopCallback = null;
if (invokeStopCallback) {
onStopCallback();
}
}
public isMonitoring() {
return this.hooks.length > 0;
}
public startMonitoring(
mouseMoveEventMerger: IEventMerger<R>,
mouseMoveCallback: IMouseMoveCallback<R>,
onStopCallback: IOnStopCallback
): void {
if (this.isMonitoring()) {
// I am already hooked
return;
}
this.mouseMoveEventMerger = mouseMoveEventMerger;
this.mouseMoveCallback = mouseMoveCallback;
this.onStopCallback = onStopCallback;
let windowChain = IframeUtils.getSameOriginWindowChain();
for (let i = 0; i < windowChain.length; i++) {
this.hooks.push(dom.addDisposableThrottledListener(windowChain[i].window.document, 'mousemove',
(data: R) => this.mouseMoveCallback(data),
(lastEvent: R, currentEvent: MouseEvent) => this.mouseMoveEventMerger(lastEvent, currentEvent)
));
this.hooks.push(dom.addDisposableListener(windowChain[i].window.document, 'mouseup', (e: MouseEvent) => this.stopMonitoring(true)));
}
if (IframeUtils.hasDifferentOriginAncestor()) {
let lastSameOriginAncestor = windowChain[windowChain.length - 1];
// We might miss a mouse up if it happens outside the iframe
// This one is for Chrome
this.hooks.push(dom.addDisposableListener(lastSameOriginAncestor.window.document, 'mouseout', (browserEvent: MouseEvent) => {
let e = new StandardMouseEvent(browserEvent);
if (e.target.tagName.toLowerCase() === 'html') {
this.stopMonitoring(true);
}
}));
// This one is for FF
this.hooks.push(dom.addDisposableListener(lastSameOriginAncestor.window.document, 'mouseover', (browserEvent: MouseEvent) => {
let e = new StandardMouseEvent(browserEvent);
if (e.target.tagName.toLowerCase() === 'html') {
this.stopMonitoring(true);
}
}));
// This one is for IE
this.hooks.push(dom.addDisposableListener(lastSameOriginAncestor.window.document.body, 'mouseleave', (browserEvent: MouseEvent) => {
this.stopMonitoring(true);
}));
}
}
}