提交 186a9a5e 编写于 作者: A Alex Dima

Fixes #6478: Cancel drag-select or drag-and-drop if a non modifier key is pressed

上级 79e83a09
...@@ -265,20 +265,18 @@ export class MouseHandler extends ViewEventHandler { ...@@ -265,20 +265,18 @@ export class MouseHandler extends ViewEventHandler {
class MouseDownOperation extends Disposable { class MouseDownOperation extends Disposable {
private _context: ViewContext; private readonly _context: ViewContext;
private _viewController: ViewController; private readonly _viewController: ViewController;
private _viewHelper: IPointerHandlerHelper; private readonly _viewHelper: IPointerHandlerHelper;
private _createMouseTarget: (e: EditorMouseEvent, testEventTarget: boolean) => editorBrowser.IMouseTarget; private readonly _createMouseTarget: (e: EditorMouseEvent, testEventTarget: boolean) => editorBrowser.IMouseTarget;
private _getMouseColumn: (e: EditorMouseEvent) => number; private readonly _getMouseColumn: (e: EditorMouseEvent) => number;
private _mouseMoveMonitor: GlobalEditorMouseMoveMonitor; private readonly _mouseMoveMonitor: GlobalEditorMouseMoveMonitor;
private readonly _onScrollTimeout: TimeoutTimer;
private readonly _mouseState: MouseDownState;
private _currentSelection: Selection; private _currentSelection: Selection;
private _mouseState: MouseDownState;
private _onScrollTimeout: TimeoutTimer;
private _isActive: boolean; private _isActive: boolean;
private _lastMouseEvent: EditorMouseEvent; private _lastMouseEvent: EditorMouseEvent;
constructor( constructor(
...@@ -295,15 +293,13 @@ class MouseDownOperation extends Disposable { ...@@ -295,15 +293,13 @@ class MouseDownOperation extends Disposable {
this._createMouseTarget = createMouseTarget; this._createMouseTarget = createMouseTarget;
this._getMouseColumn = getMouseColumn; this._getMouseColumn = getMouseColumn;
this._currentSelection = new Selection(1, 1, 1, 1); this._mouseMoveMonitor = this._register(new GlobalEditorMouseMoveMonitor(this._viewHelper.viewDomNode));
this._onScrollTimeout = this._register(new TimeoutTimer());
this._mouseState = new MouseDownState(); this._mouseState = new MouseDownState();
this._onScrollTimeout = this._register(new TimeoutTimer()); this._currentSelection = new Selection(1, 1, 1, 1);
this._isActive = false; this._isActive = false;
this._lastMouseEvent = null; this._lastMouseEvent = null;
this._mouseMoveMonitor = this._register(new GlobalEditorMouseMoveMonitor(this._viewHelper.viewDomNode));
} }
public dispose(): void { public dispose(): void {
......
...@@ -146,17 +146,35 @@ export class GlobalEditorMouseMoveMonitor extends Disposable { ...@@ -146,17 +146,35 @@ export class GlobalEditorMouseMoveMonitor extends Disposable {
private _editorViewDomNode: HTMLElement; private _editorViewDomNode: HTMLElement;
private _globalMouseMoveMonitor: GlobalMouseMoveMonitor<EditorMouseEvent>; private _globalMouseMoveMonitor: GlobalMouseMoveMonitor<EditorMouseEvent>;
private _keydownListener: IDisposable;
constructor(editorViewDomNode: HTMLElement) { constructor(editorViewDomNode: HTMLElement) {
super(); super();
this._editorViewDomNode = editorViewDomNode; this._editorViewDomNode = editorViewDomNode;
this._globalMouseMoveMonitor = this._register(new GlobalMouseMoveMonitor<EditorMouseEvent>()); this._globalMouseMoveMonitor = this._register(new GlobalMouseMoveMonitor<EditorMouseEvent>());
this._keydownListener = null;
} }
public startMonitoring(merger: EditorMouseEventMerger, mouseMoveCallback: (e: EditorMouseEvent) => void, onStopCallback: () => void): void { public startMonitoring(merger: EditorMouseEventMerger, mouseMoveCallback: (e: EditorMouseEvent) => void, onStopCallback: () => void): void {
// Add a <<capture>> keydown event listener that will cancel the monitoring
// if something other than a modifier key is pressed
this._keydownListener = dom.addStandardDisposableListener(<any>document, 'keydown', (e) => {
const kb = e.toKeybinding();
if (kb.isModifierKey()) {
// Allow modifier keys
return;
}
this._globalMouseMoveMonitor.stopMonitoring(true);
}, true);
let myMerger: dom.IEventMerger<EditorMouseEvent> = (lastEvent: EditorMouseEvent, currentEvent: MouseEvent): EditorMouseEvent => { let myMerger: dom.IEventMerger<EditorMouseEvent> = (lastEvent: EditorMouseEvent, currentEvent: MouseEvent): EditorMouseEvent => {
return merger(lastEvent, new EditorMouseEvent(currentEvent, this._editorViewDomNode)); return merger(lastEvent, new EditorMouseEvent(currentEvent, this._editorViewDomNode));
}; };
this._globalMouseMoveMonitor.startMonitoring(myMerger, mouseMoveCallback, onStopCallback);
this._globalMouseMoveMonitor.startMonitoring(myMerger, mouseMoveCallback, () => {
this._keydownListener.dispose();
onStopCallback();
});
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册